php跑多线程从此打开新世界大门?


今早跟同事聊天说道php多线程问题,有位同事说作为世界上最好的语言,php有啥做不到的。虽然是句玩笑,但我是认真的。我想看看是否真的能实现呢?查阅一番文档发现,确实有多线程扩展。

pthreads 是一组允许用户在 PHP 中使用多线程技术的面向对象的 API。 它提供了创建多线程应用所需的全套工具,无论是 Web 应用还是控制台应用。 通过使用 Thread, Worker 以及 Threaded 对象,PHP 应用可以创建、读取、写入以及执行多线程应用,并可以在多个线程之间进行同步控制。 说白了php的这个模块就是对pthreads的包装,熟悉C的话,应该能很快入手这个php库了,只不过php中封装成了oop的接口了。

怎么样?是不是心动了呢?整天讨论用哪个并发框架的童鞋,是不是可以考虑官方提供的这个模块呢?

为了使用 pthreads 扩展,需要构建 PHP 时启用 ZTS (Zend Thread Safety)。需要编译时加上--enable-maintainer-zts 选项, Windows 平台为 --enable-zts。另外,需要注意的是ZTS 是构建期配置选项,只能通过构建时通过选项启用,无法在构建之后启用。官方下载针对Windows有相应的线程安全版本。

再就是下载php_pthreads扩展,下载地址:https://windows.php.net/downloads/pecl/releases/pthreads。根据php的版本选择pthreads版本。

将文件pthreadVC2.dll添加到与php.exe同级的目录下,如C:\xampp\php
将文件php_pthreads.dll添加到php的扩展目录下,如C:\xampp\php\ext
然后,修改php.ini文件,添加extension=php_pthreads.dll

执行php -m 看是否出现pthreads模块。

然后就可以开始php的多线程之旅了。配上websocket开发个聊天室怎么样?

示例代码:

class workerThread extends Thread {
    public function __construct($i){
        $this->i=$i;
    }

    public function run(){
        while(true){
            echo $this->i ."\n";
            sleep(1);
        }
    }
}

for($i=0;$i<50;$i++){
    $workers[$i]=new workerThread($i);
    $workers[$i]->start();
}

本程序运行成的环境:
win10x64
php-7.0.31-Win32-VC14-x64 下载地址:https://windows.php.net/downloads/releases/php-7.0.31-Win32-VC14-x64.zip
php_pthreads-3.1.6-7.0-ts-vc14-x64 下载地址:https://windows.php.net/downloads/pecl/releases/pthreads/3.1.6/

Archives