Yii2 Mongodb 数据库报错:remote connect close

我使用了mongodb的复制集,报错remote connect close

Yii2中我更改下了配置如下:

'mongodb_erp' => [
            'class' => 'yii\mongodb\Connection',
            'dsn' => 'mongodb://192.168.220.105:27017/erp,192.168.220.106:27017/erp?replicaSet=rs0&readPreference=secondaryPreferred', # primaryPreferred |  secondaryPreferred
      'options' => [
        'socketTimeoutMS' => 300000,  # 设置超时时间
        'connectTimeoutMS'=> 600000,  # 设置连接超时时间
      ],
],

 

将读改成副本读优先,对于读的优先级的设置解释如下:

/**
        const string RP_PRIMARY = "primary" ;  						# 始终用主读
        const string RP_PRIMARY_PREFERRED = "primaryPreferred" ;	# 主读优先
        const string RP_SECONDARY = "secondary" ;					# 始终用副本读
        const string RP_SECONDARY_PREFERRED = "secondaryPreferred" ;# 副本读优先
        const string RP_NEAREST = "nearest" ;						# 主和副本随机读
      */

另外,长连接可能存在失效问题,在连接mongodb的时候,需要循环一下:

Yii2 随机发生 php mongo报错:’Failed to connect to: XXXXX: Remote server has closed the connection’的解决方法

 

php 真正的多线程 pthread

对于php,有很多种多进程的实现,这里就不说了,下面介绍一种多线程的方式。 php真正的多线程实现方式,通过安装php的扩展:pthread 扩展

安装步骤如下:

下载地址是这个:

https://github.com/krakjoe/pthreads

但是这个下载的是 版本3 也就是php 7 才能用的

我们需要使用2版本

然后刷新的页面如下,拖到最底部:

下一页找到版本2的

下载下来,这个v2 才是php5才可以使用的

下载下来,安装:

或者,您直接这样下载:

cd /tools  
   wget https://github.com/krakjoe/pthreads/archive/v2.0.10.zip  
   unzip   v2.0.10.zip  
   cd pthreads-2.0.10  
   /usr/local/php/bin/phpize  
   ./configure --with-php-config=/usr/local/php/bin/php-config    
   make  
   make install

注意:您的php 在编译的时候需要开启 –enable-maintainer-zts

./configure --prefix=/usr/local/php --disable-fileinfo   --enable-fpm --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-openssl --with-zlib --with-curl --enable-ftp --with-gd --with-xmlrpc  --with-jpeg-dir --with-png-dir --with-freetype-dir --enable-gd-native-ttf --enable-mbstring --with-mcrypt=/usr/local/libmcrypt --enable-zip --with-mysql=/usr/local/mysql --without-pear --enable-maintainer-zts 

 

vim /etc/php.ini 
添加
extension=pthreads.so

 

重启php  
/etc/init.d/php-fpm restart

 

我之前搞的一个用php多线程获取订单货运号的例子:

http://blog.csdn.net/terry_water/article/details/50273847

Yii2 fecshop 电商开源项目

目前正在做一个开源电商系统,经过了将近一年的筹划,对框架的整体越来越清晰,目前正在框架搭建过程。github地址为:https://github.com/fancyecommerce

Fecshop入口部分:fancyecommerce/yii2_fecshop_app_advanced

Fecshop核心部分:fancyecommerce/yii2_fecshop

Fecshop后台框架部分:fancyecommerce/yii2_fec_adminfancyecommerce/yii2_fec_admin

Fecshop基础部分:fancyecommerce/yii2-fec

Yii2 fecshop 电商开源项目

完全安装:
安装入口扩展:fancyecommerce/yii2_fecshop_app_advanced,其他的扩展将以包依赖的方式自动安装。

项目已经开始,预计到2017年元旦出来第一个正式版本。

经过一年的筹划,将magento的灵活强大性和yii2的可配置性结合起来,尝试多种方式,构思底层架构,目前架构层面已经搭建好,现在开始代码填写,也就是本项目:FecShop。

架构特色:

1.解决三者之间的矛盾: a) fecshop系统核心代码,模板,数据库升级(系统文件升级) , b)第三方代码,模板,数据升级 (通过composer做fecshop的扩展), c)用户二次开发,代码,模板,数据修改(使用fecshop的用户,在fecshop的基础上做二次开发)

2.解决功能重构:加入功能服务层service,在模块View ,Controller与数据层model之间,加入功能服务层service,在架构层面可以很好的解决重构问题。
譬如产品模块,通过服务层对上层module透明,通过实现mysql 和mongodb的不同的服务层,即可实现功能重构。

结构组织:
fancyecommerce/yii2_fecshop_app_advanced,只是一个入口库包,提供appadmin(后台地 址),appfront(前端pc入口),apphtml5(前端移动设备入口),appserver(API入口),以及相应的初始化配置,此库包类似 yiisoft/yii_app_advenced,

fancyecommerce/yii2_fecshop为fecshop的核心代码部分,包括models层,组件服务层services,模块 层modules,模块层里面包括controller,block层,view层,以及view里面的layout,view文件,css,js等。用 户可以通过配置,或者多模板路径优先级的方式,在不更改系统文件的前提下,重写fecshop的功能。

yii2 关于helper类 ArrayHelper::merge()方法的介绍

yii\helpers\ArrayHelper::merge()

在web/index.php入口文件就可以看到这个方法:

譬如:

$config = yii\helpers\ArrayHelper::merge(
    # yii2  common config
  require(__DIR__ . '/../../common/config/main.php'),
    require(__DIR__ . '/../../common/config/main-local.php'),
    # yii config
  require(__DIR__ . '/../config/main.php'),
  require(__DIR__ . '/../config/main-local.php'),
  # yii fecshop config
  require(__DIR__ . '/../../vendor/fancyecommerce/fecshop/config/fecshop.php'),
  # yii fecshop appfront config
  require(__DIR__ . '/../../vendor/fancyecommerce/fecshop/app/appfront/config/appfront.php'),
  # third people  config
  
  # user second develop config.
  
  require(__DIR__ . '/../config/fecshop_local.php')
    

);
$config['homeUrl'] = $homeUrl;
$application = new yii\web\Application($config);

需要注意的是ArrayHelper::merge方法,合并后的数组结果是什么:

下面通过例子讲解:

$arr1 = [
  'name' 	=> 'terry',
  'age'	=>	15,
  'friend'=> [
    'zhangsan','lisi'
  ],
  'work' =>[
    'aa'	=> 11,
    'bb'	=> ['aa','bb'],
  ],

];


$arr2 = [
  'name' 	=> 'water',
  'age'	=>	22,
  'friend'=> [
    'zhangsan','wangwu'
  ],
  'work' =>[
    'cc'	=> ['77','bb'],
    'aa'	=> 22,
  ],

];


$arr3 = yii\helpers\ArrayHelper::merge($arr1,$arr2);

$arr3的值为:

array(4) { [“name”]=> string(5) “water” [“age”]=> int(22) [“friend”]=> array(4) { [0]=> string(8) “zhangsan” [1]=> string(4) “lisi” [2]=> string(8) “zhangsan” [3]=> string(6) “wangwu” } [“work”]=> array(3) { [“aa”]=> int(22) [“bb”]=> array(2) { [0]=> string(2) “aa” [1]=> string(2) “bb” } [“cc”]=> array(2) { [0]=> string(2) “77” [1]=> string(2) “bb” } } }

 

可以看到这个数组的作用:

1.如果key是数字,那么value就会进行数组合并,如果值相同,不会覆盖,会出现两个相同值的数组元素,譬如[1,2]和[2,3]通过merge函数合并的结果为[1,2,2,3].

2.如果数组的key不是数字,而且数组里面的value不是数字,则value会被覆盖掉

譬如[‘aa’ => ‘xxx’]和[‘aa’=>’yy’]  merge函数后的结果为[‘aa’=>’yy’],

3.如果数组的key不是数字,而value是数组(数组的key是数字),则会进行数组合并。

4.如果数组的key不是数字,而value是数组(数组的key不是数字),则value数组中的key回合第二个步骤那样处理。

 

具体可以自己琢磨,因此在使用这个方法的时候,要想key覆盖,key一定要用字符串,就和变量定义一样。

如何使用yii2 fecshop的小部件widget

首先需要说明的是,fecshop的小部件和yii2的不同,fecshop的小部件是由

Yii::$app->page->widget->render($configKey) 函数得到的内容

小部件的介绍:相当于个独立功能块,有2部分组成,1. 数据提供者block,2. view部分,view部分是html内容,一些动态数据需要从block中获取,通过数据提供部分和数据显示部分组成一个独立块。

小部件的功能:在电商网站,或者其他网站,我们会有一些块,在很多页面显示,譬如newsletter,rss,product view history等,可能在产品页面侧栏,分类页面搜索页侧栏面,账户中心侧栏等页面显示这个快,因此我引入了小部件的功能,通过配置直接添加,比较方面。

小部件实现的原理:分为3块,1.view文件和多模板路径,通过优先级依次匹配,直到文件存在,返回viewFile 。2. 通过配置里面的类以及方法,得到动态数据,数据格式为数组,3.通过view组件的renderFile函数,把view的路径和动态参数param,画出来最终的html。

小部件的使用:

1.添加配置:

在page组件中找到子组件widget

return [
  'page' => [
    'class' => 'fecshop\services\Page',
    //'terry' => 'xxxx',
    
    # 子服务
    'childService' => [
                'widget' => [
        'class' 		=> 'fecshop\services\page\Widget',
        # 定义默认方法,也就是widgetConfig 里面各个部件里面的method如果没有填写
        # 则使用该配置。
        # 'defaultObMethod' => 'getLastData',
        
        'widgetConfig' => [
          'menu' =>[
            # 必填
            'class' => 'fec\block\TestMenu',
            # view 的绝对路径配置方式
            'view'  => '@fec/views/testmenu/index.php',
            # 下面为选填
            'method'=> 'getLastData',
            'terry1'=> 'My1',
            'terry2'=> 'My2',
          ],
          'love' => [
            'class' => 'fecshop\app\appfront\modules\Cms\block\widget\Test',
            # 根据多模板的优先级,依次去模板找查找该文件,直到找到这个文件。
            'view'  => 'cms/home/test.php',
            'terry' => 'II',
          ]
        ]
        
      ],

上面定义了2个小部件,一个是menu,一个是love,

class是数据提供的类,method是返回数据的方法,view是html部分,其他的参数为class初始化传入类变量,

对于class 是和namesapces一致的

对于view 有2中方法,一种是加入@,譬如@fec,@vendor等,通过autoload查找绝对路径,另外一种就是通过多模板路径,通过多模板的优先级,依次到路径里面查找该view文件,最终返回view文件,因此,优先级低的view文件如果想更改,可以在高优先级的模板中新建这个文件即可(路径要对应好)。

下面以love举例:

新建class文件:

<?php
namespace fecshop\app\appfront\modules\Cms\block\widget;
use Yii;
use fecshop\app\appfront\modules\AppfrontController;
class Test 
{
  public $terry;
  # 网站信息管理
    public function getLastData()
    {
    return [
      'i'   	=> $this->terry,
      'love' 	=> 'loves',
      'you' 	=> 'terry',
    ];
  }
}



view文件内容:appfront/theme/terry/theme01/cms/home/test.php

love test
<?= "$i $love $you"  ?>

通过上面,我们在page-theme组件中加入了配置,新建了小部件的class和对应的方法和变量,view文件,下面我们就可以调用了

在controller中调用:

echo Yii::$app->page->widget->render('love');

可以看到页面输出:

love test II loves terry

我们在controller,view,layout等加入这个小部件,然后对应的html就会显示出来,还是蛮好用的。我们可以配置好各个小部件,有需要就直接添加,甚至给一个小部件做几种样式,在不同的页面调用。

 

 

 

 

安装mongodb3.2 复制集

只搞了两个节点的复制集,1:192.168.220.105,2:192.168.220.106
1.安装mongodb

touch /etc/yum.repos.d/mongodb-org-3.2.repo
vim  /etc/yum.repos.d/mongodb-org-3.2.repo

在打开的文件中加入内容:(3.2)

[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc

如果安装2.6,则加入内容:

[mongodb-org-2.6]
name=MongoDB 2.6 Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

开始安装:

sudo yum install -y mongodb-org