本文以Windows为例,讲解安装和使用php_pthreads扩展。
1.安装pthreads
打开 http://localhost/?phpinfo=1 找到 ‘PHP Extension Build’ 的版本
去 http://windows.php.net/downloads/pecl/releases/pthreads/ 上下载与你的php对应版本的 pthreads (要区分是 32 bit 还是 64 bit) 和 php extension build (本文使用的是 VC11)。解压 php_pthreads-2.0.9-5.6-ts-vc11-x64.zip
- 复制 php_pthreads.dll 到 ‘bin\php\ext\’ 安装目录
- 复制 pthreadVC2.dll 到 ‘bin\php\’ 安装目录
- 复制 pthreadVC2.dll 到 ‘bin\apache\bin’ 安装目录
- 复制 pthreadVC2.dll 到 ‘C:\windows\system32’ 安装目录
配置 php.ini 文件,新增一行:
extension=php_pthreads.dll
重启 Apache 并查看 phpinfo() 来确认是否安装成功。
2. 基于 Pthreads 扩展的多线程示例
如下例子引用 http://blog.phpha.com/archives/54/,打印 1 - 99,每次打印之间间隔 100ms。
<?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.760s
[单线程] EXECUTE_TIMES: 10.091s