PHP7下使用MongoDB API

  1. 安装支持PHP7的扩展。

    > 老版的MongoDB扩展是不支持PHP7的,需要下载重新编译支持PHP7的扩展。
    
    [手动编译PHP7的MongoDB扩展](http://www.liudon.org/1322.html)
    [PHP手册关于老版扩展的文档](http://php.net/manual/zh/book.mongo.php)
    [PHP手册关于新版扩展的文档](http://php.net/manual/zh/set.mongodb.php)
    
  2. 安装MongoDB的PHP类库。

    [mongo-php-library的github主页](https://github.com/mongodb/mongo-php-library)
    
    使用composer安装。
    composer require "mongodb/mongodb=^1.0.0@beta"
  3. 操作完前两步就可以在PHP7里使用MongoDB了.

    <?php
    require_once __DIR__ . "/vendor/autoload.php";
    
    $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
    $collection = new MongoDB\Collection($manager, "db.test");
    
    
    // 读取一条数据
    $data = $collection->findOne(array('id' => 1));
    
    // 读取多条数据
    $options = arrray(
    'projection' => array('id' => 1, 'age' => 1, 'name' => 1), // 指定返回哪些字段
    'sort' => array('id' => -1), // 指定排序字段
    'limit' => 10, // 指定返回的条数
    'skip' => 0, // 指定起始位置
    );
    $dataList = $collection->find(array('age' => 50), $options);
    
    // 插入一条数据
    $data = array('id' => 2, 'age' => 20, 'name' => '张三');
    $collection->insertOne($data);
    
    // 修改一条数据
    $collection->updateOne(array('id' => 1), array('$set' => array('age' => 20)));
    
    // 删除一条数据
    $collection->deleteOne(array('id' => 1));
    
    // 删除多条数据
    $collection->deleteMany(array('id' => array('$in' => array(1, 2))));

手动编译PHP7的MongoDB扩展

  1. 下载支持php7的MongoDB扩展

    wget http://pecl.php.net/get/mongodb-1.1.1.tgz
    tar -zxvf mongodb-1.1.1.tgz
    cd mongodb-1.1.1.tgz
    /usr/local/php7/bin/phpize
    ./configure --with-php-config=/usr/local/php7/bin/php-config
    make && make install
如果出现```Can't install [sasl.h not found!]```的错误,执行命令```apt-get install libsasl2-dev```。
  1. 添加mongodb.so到php.ini里
  2. 查看当前扩展

        /usr/local/php7/bin/php -m
        [PHP Modules]
        bcmath
        Core
        ctype
        curl
        date
        dom
        filter
        ftp
        gd
        gettext
        hash
        iconv
        json
        libxml
        mbstring
        mcrypt
        mongodb
        mysqlnd
        openssl
        pcntl
        pcre
        PDO
        pdo_sqlite
        Phar
        posix
        Reflection
        session
        shmop
        SimpleXML
        soap
        sockets
        SPL
        sqlite3
        standard
        sysvsem
        tokenizer
        xml
        xmlreader
        xmlrpc
        xmlwriter
        Zend OPcache
        zip
        zlib
    
        [Zend Modules]
        Zend OPcache
可以看到已经有mongodb扩展了。

手动编译安装PHP7

之前搞过一次php7的beta版,正式版发布了,想着把php也升上去。
之前安装是用的apt-get方式,这次想折腾一下手动编译。

服务器环境 Ubuntu 14.04 x64
  1. 下载PHP文件

    wget https://github.com/php/php-src/archive/php-7.0.1.zip
    unzip -q php7-src-master.zip
  2. 配置编译参数

    ./buildconf
    
    ./configure \
    --prefix=/usr/local/php7 \                              [PHP7安装的根目录]
    --exec-prefix=/usr/local/php7 \
    --bindir=/usr/local/php7/bin \
    --sbindir=/usr/local/php7/sbin \
    --includedir=/usr/local/php7/include \
    --libdir=/usr/local/php7/lib/php \
    --mandir=/usr/local/php7/php/man \
    --with-config-file-path=/usr/local/php7/etc \           [PHP7的配置目录]
    --with-mysql-sock=/var/run/mysql/mysql.sock \           [PHP7的Unix socket通信文件]
    --with-mcrypt=/usr/include \
    --with-mhash \
    --with-openssl \           
    --with-mysqli=shared,mysqlnd \                          [PHP7依赖mysql库]
    --with-pdo-mysql=shared,mysqlnd \                       [PHP7依赖mysql库]
    --with-gd \
    --with-iconv \
    --with-zlib \
    --enable-zip \
    --enable-inline-optimization \
    --disable-debug \
    --disable-rpath \
    --enable-shared \
    --enable-xml \
    --enable-bcmath \
    --enable-shmop \
    --enable-sysvsem \
    --enable-mbregex \
    --enable-mbstring \
    --enable-ftp \
    --enable-gd-native-ttf \
    --enable-pcntl \
    --enable-sockets \
    --with-xmlrpc \
    --enable-soap \
    --without-pear \
    --with-gettext \
    --enable-session \                                      [允许php会话session]
    --with-curl \                                           [允许curl扩展]
    --with-jpeg-dir \
    --with-freetype-dir \
    --enable-opcache \                                      [使用opcache缓存]
    --enable-fpm \
    --with-fpm-user=www \                                 [php-fpm的用户]
    --with-fpm-group=www \                                [php-fpm的用户组]
    --without-gdbm \
    --disable-fileinfo
如果buildconf的时候输出下面的错误,加上```--force```参数解决。
    You should not run buildconf in a release package.
    use buildconf --force to override this check.
  1. 开始编译和安装

    make && make install
执行完可以去喝杯水,耐心等待就好了。

参考资料

How to compile php7 on ubuntu 14.04
2015博客升级记(五):CentOS 7.1编译安装PHP7

elasticsearch status red问题解决

业务自己搭建了一套elasticsearch服务,最近几天查询开始变的越来越不稳定。

查看健康度发现status已经变成了red。

[root@localhost ~]# curl 'http://xxx.xxx.xxx.xxx:9200/_cluster/health?pretty'           
{
  "cluster_name" : "imageIndex",
  "status" : "red",
  "timed_out" : false,
  "number_of_nodes" : 4,
  "number_of_data_nodes" : 4,
  "active_primary_shards" : 4,
  "active_shards" : 6,
  "relocating_shards" : 1,
  "initializing_shards" : 0,
  "unassigned_shards" : 4,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 10
}
[root@localhost ~]#

问了下朋友,说是重启所有节点看看。

  1. 停止所有节点服务

    curl -XPOST 'http://xxx.xxx.xxx.xxx:9200/_cluster/nodes/_shutdown'
  2. 分别启动每一个节点

    ./bin/elasticsearch -d
  3. 查看健康度

    [user_00@localhost ~]$ curl 'http://xxx.xxx.xxx.xxx:9200/_cluster/health?pretty'
    {
      "cluster_name" : "imageIndex",
      "status" : "yellow",
      "timed_out" : false,
      "number_of_nodes" : 4,
      "number_of_data_nodes" : 4,
      "active_primary_shards" : 5,
      "active_shards" : 5,
      "relocating_shards" : 0,
      "initializing_shards" : 5,
      "unassigned_shards" : 0,
      "delayed_unassigned_shards" : 0,
      "number_of_pending_tasks" : 0,
      "number_of_in_flight_fetch" : 0
    }

参考资料:
集群健康
elasticsearch如何安全重启节点(续)