简介:Pthreads 是一组允许用户在 PHP 中使用多线程技术的面向对象的 API。 它提供了创建多线程应用所需的全套工具,无论是 Web 应用还是控制台应用。 通过使用 Thread, Worker 以及 Threaded 对象,PHP 应用可以创建、读取、写入以及执行多线程应用,并可以在多个线程之间进行同步控制。

1. PHP-5.6 下 Pthreads 扩展的安装

本文以 Windows(Win7x64) 环境为例进行说明:

软件版本:Apache-2.4.20 (Win64) / PHP-5.6.22-ts
PHP 安装路径:E:\DEVENV\PHP-5.6.22
Pthreads 扩展下载地址:php_pthreads-2.0.9-5.6-ts-vc11-x64.zip

注:PHP 必须采用线程安全 (Thread Safety Enabled) 版本

1 解压下载的压缩文件
复制 [pthreadVC2.dll] 到 PHP 安装目录 [E:\DEVENV\PHP-5.6.22]
复制 [php_pthreads.dll] 到 PHP 扩展目录 [E:\DEVENV\PHP-5.6.22\ext]

[2] 配置 php.ini 文件
新增一行:
extension=php_pthreads.dll

重启 Apache 并查看 phpinfo() 来确认是否安装成功
pthreads.png

2. 基于 Pthreads 扩展的多线程示例

<?php
/**
 * 多线程示例
 * @author PHPHa<mail@phpha.com>
 * @date 2016年8月15日
 * @copyright http://blog.phpha.com
 */

//继承父类
class Test extends Thread{
    
    public function __construct($arg){
        $this->arg = $arg;
    }
    
    public function run(){
        if($this->arg){
            //休眠[100]毫秒/否则效果不明显
            usleep(100000);
            echo $this->arg, PHP_EOL;
        }
    }
}

//多线程版本
$script_stime = getMicroTime();
//创建线程
for($i = 0; $i < 100; $i++){
    $pool[$i] = new Test($i);
    $pool[$i]->start();
}
//线程同步
foreach($pool as $work){
    while($work->isRunning()){
        usleep(10);
    }
    $work->join();
}
//输出执行时间
echo '[多线程]', outputTimes(), PHP_EOL;

//脚本开始时间
$script_stime = getMicroTime();
//单线程版本
for($i = 0; $i < 100; $i++){
    $Obj = new Test($i);
    $Obj->run();
}
//输出执行时间
echo '[单线程]', outputTimes(), PHP_EOL;

//GET_MICRO_TIME
function getMicroTime(){
    return round(microtime(true), 3);
}

//OPTPUT_EXECUTE_TIMES
function outputTimes(){
    global $script_stime;
    return sprintf('EXECUTE_TIMES: %.3fs', getMicroTime() - $script_stime);
}

运行结果如下:

[多线程] EXECUTE_TIMES: 0.319s
[单线程] EXECUTE_TIMES: 9.900s

引用资料:

PHP-Pthreads 官方介绍