https://www.yduba.com/biancheng-6852262344.html

    PHP 5.3 以版本,使用 pthreads PHP扩展,可以使PHP真正地支持多线程。多线程在处理重复性的循环任务,能够大大缩短程序执行时间。
    PHP多线程开发的配置 - 图1
    多数网站的性能瓶颈不在PHP服务器上,因为它可以简单地通过横向增加服务器或CPU核数来轻松应对(对于各种云主机,增加VPS或CPU核数就更方便了,直接以备份镜像增加VPS,连操作系统、环境都不用安装配置),而是在于MySQL数据库。如果用 MySQL 数据库,一条联合查询的SQL,也许就可以处理完业务逻辑,但是,遇到大量并发请求,就歇菜了。如果用 NoSQL 数据库,也许需要十次查询,才能处理完同样地业务逻辑,但每次查询都比 MySQL 要快,十次循环NoSQL查询也许比一次MySQL联合查询更快,应对几万次/秒的查询完全没问题。如果加上PHP多线程,通过十个线程同时查询NoSQL,返回结果汇总输出,速度就要更快了。我们实际的APP产品中,调用一个通过用户喜好实时推荐商品的PHP接口,PHP需要对BigSea NoSQL数据库发起500~1000次查询,来实时算出用户的个性喜好商品数据,PHP多线程的作用非常明显。
    PHP扩展下载:http://pecl.php.net/package/pthreads
    PHP手册文档:http://php.net/manual/zh/book.pthreads.php
    特别说明一点,在安装PHP的时候,一定要指定 —enable-maintainer-zts 参数。这是必选项,安装代码如下:(以下安装过程在 centos 6.5 环境中,此安装过程仅供参考,你在实例应用中,PHP的安装目录不一定要/www中)

    1. # 安装PHP
    2. tar zxvf php-7.0.0.tar.gz
    3. cd ../php-7.0.0
    4. ./configure --prefix=/www/php --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-openssl --with-libxml-dir --with-zlib --enable-mbstring --with-mysql=/www/mysql --with-mysqli=mysqlnd --enable-mysqlnd --with-pdo-mysql=/www/mysql --with-gd --with-jpeg-dir --with-png-dir --with-zlib-dir --with-freetype-dir --enable-sockets --with-curl --enable-maintainer-zts
    5. make && make install
    6. # 安装扩展
    7. wget http://pecl.php.net/get/pthreads-3.1.6.tgz
    8. tar zxvf pthreads-3.1.6.tgz
    9. cd pthreads-3.1.6
    10. phpize
    11. ./configure --with-php-config=/www/php/bin/php-config
    12. make && make install
    13. # 修改php.ini
    14. vim /www/php/lib/php.ini
    15. # 在php.ini中添加
    16. extension = "pthreads.so"
    17. # 重启
    18. kill -USR2 `cat /www/php/var/run/php-fpm.pid`
    19. # 运行 /www/php/bin/php -m | grep pthreads 发现 pthreads 已经安装成功

    这里用一个最简单的代码来说明一下多线程的实用方法

    <?php
    //这里用一个函数,表示操作日志,每操作一次花1秒的时间
    function doThings( $i )
    {
        //    Write log file
        sleep(1);
    }
    
    $s = microtime(true);
    for($i = 1; $i <= 10; $i ++)
    {
        doThings( $i );
    }
    $e = microtime(true);
    echo "For循环:" . ($e - $s) . "\n";  
    
    #############################################
    class MyThread extends Thread
    {
        private $i = null;
    
        public function __construct( $i )
        {
        $this->i = $i;
        }
    
        public function run()
        {
            doThings( $this->i );
        }
    }
    
    $s = microtime(true);
    $work = array();
    for($i = 1; $i <= 10; $i ++)
    {
        $work[$i] = new MyThread( $i );
        $work[$i]->start();
    }
    $e = microtime(true);
    echo "多线程:" . ($e - $s) . "\n";
    

    运行此文件之后,发现多线程的效率会远远高于 for 循环, 效果如图
    PHP多线程开发的配置 - 图2
    未经允许不得转载:易读小屋 » PHP多线程开发的配置