• swoole编译安装/数据库连接池/异步mysql客户端


    一.编译安装php5.6

    0.安装必要软件

    http://www.cnblogs.com/itfenqing/p/6055138.html

    1.下载php5.6.30

    http://php.net/downloads.php

    2.解压

    3.编译时指定为mysqlnt,启用opcache

    ./configure --prefix=/usr/local/php56  --enable-fpm --enable-mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --enable-debug --with-gd --with-jpeg-dir --with-png-dir --enable-mbstring --with-curl --with-libxml-dir --with-mysql --enable-sockets --enable-bcmath --enable-xml --with-bz2 --enable-zip --with-mcrypt --enable-opcache --with-openssl --with-freetype-dir=/usr/include/freetype2/freetype

      

    二.编译swoole

    1.下载swoole1.9.0

    2.解压

    3.安装

    /usr/local/php56/bin/phpize
    ./configure --with-php-config=/usr/local/php56/bin/php-config
    make 
    make install
    

      

    4.拷贝php.ini-production到/usr/local/php56/php.ini

    5.在/usr/local/php56/php.ini下加入

    [Zend Opcache]
    zend_extension = /usr/local/php56/lib/php/extensions/debug-non-zts-20131226/opcache.so
    opcache.enable=1 ;#启用操作码缓存
    opcache.enable_cli=1 ;#仅针对CLI环境启用操作码缓存
    opcache.memory_consumption=128 ;#共享内存大小,单位MB
    opcache.interned_strings_buffer=8 ;#存储临时字符串的内存大小,单位MB
    opcache.max_accelerated_files=4000 ;#哈希表中可存储的脚本文件数量上限
    
    [Swoole]
    extension = /usr/local/php56/lib/php/extensions/debug-non-zts-20131226/swoole.so
    

      

    三.swoole数据库连接池

    1.服务端代码:

    <?php
    $serv = new swoole_server("127.0.0.1", 9508);
    $serv->set(array(
        'worker_num' => 100,
        'task_worker_num' => 10, //MySQL连接的数量
    ));
    
    function my_onReceive($serv, $fd, $from_id, $data)
    {
        //taskwait就是投递一条任务,这里直接传递SQL语句了
        //然后阻塞等待SQL完成
        $result = $serv->taskwait($data);
        if ($result !== false) {
            list($status, $db_res) = explode(':', $result, 2);
            if ($status == 'OK') {
                //数据库操作成功了,执行业务逻辑代码,这里就自动释放掉MySQL连接的占用
                $serv->send($fd, var_export(unserialize($db_res), true) . "
    ");
            } else {
                $serv->send($fd, $db_res);
            }
            return;
        } else {
            $serv->send($fd, "Error. Task timeout
    ");
        }
    }
    
    function my_onTask($serv, $task_id, $from_id, $sql)
    {
        static $link = null;
        if ($link == null) {
            $link = new mysqli("192.168.2.15", "root", "root", "test");
            if (!$link) {
                $link = null;
                $serv->finish("ER:" . mysqli_error($link));
                return;
            }
        }
        $result = $link->query($sql);
        if (!$result) {
            $serv->finish("ER:" . mysqli_error($link));
            return;
        }
        $data = $result->fetch_all(MYSQLI_ASSOC);
        $serv->finish("OK:" . serialize($data));
    }
    
    function my_onFinish($serv, $data)
    {
        echo "AsyncTask Finish:Connect.PID=" . posix_getpid() . PHP_EOL;
    }
    
    $serv->on('Receive', 'my_onReceive');
    $serv->on('Task', 'my_onTask');
    $serv->on('Finish', 'my_onFinish');
    $serv->start();
    

      

    2.客户端代码

    <?php
    $link=new swoole_client(SWOOLE_SOCK_TCP,SWOOLE_SOCK_SYNC);//TCP方式、同步
    $link->connect('127.0.0.1',9508);//连接
    $link->send('SELECT * FROM `test2`');//执行查询
    $res=$link->recv();
    
    if(!$res){
        echo 'Failed!';
    }
    else{
        print_r($res);
    }
    $link->close();
    

      

    三.异步mysql客户端

    <?php
    
    $db = new swoole_mysql;
    $server = array(
        'host' => '192.168.2.15',
        'port' => '3306',
        'user' => 'root',
        'password' => 'root',
        'database' => 'test',
        'charset' => 'utf8', //指定字符集
        'timeout' => 30,
    );
    
    $db->connect($server, function ($db, $r) {
        if ($r === false) {
            var_dump($db->connect_errno, $db->connect_error);
            die;
        }
        $sql = 'select *,sleep(5) from test2';
        $db->query($sql, function (swoole_mysql $db, $r) {
            if ($r === false) {
                var_dump($db->error, $db->errno);
            } elseif ($r === true) {
                var_dump($db->affected_rows, $db->insert_id);
            }
            var_dump($r);
            $db->close();
        });
    });
    
    echo 'ok';
    

      

    以上代码先输出ok,在输出mysql查询结果

      

  • 相关阅读:
    JS实现菜单滚动到一定高度后固定
    原生js如何获取某一元素的高度
    在Vue项目中,添加的背景图片在服务器上不显示,如何处理
    单行文本截断 text-overflow
    使用line-height垂直居中在安卓手机上效果不好
    css 苹方字体
    十二. for of 示例 (可以解决大多数应用场景)
    npm详解
    webpack搭建服务器,随时修改刷新
    探讨弹性布局Flexible Box
  • 原文地址:https://www.cnblogs.com/itfenqing/p/7111833.html
Copyright © 2020-2023  润新知