PHP多线程性能测试
2017-04-26 00:00
162 查看
php提到多线程,主要用到的就是pthreads和curl_multi_init(),闲暇之余,写了个脚本对比了下性能。
CPU型号: Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz
内存: 2G
环境
系统:CentOS Linux release 7.2.1511 x86_64
语言: php7
其他:nginx+fpm
curlmulti.php
curl.php
执行100次抓取的实验结果:
| 脚本 | CPU最高波动 | 执行时间 |
| --- | --- | --- |
| pthreads.php | 5.5 | 7.3s |
| curlmulti.php | 10 | 6.9s |
| curl.php | 0.1 | 31.3s |
由测试可知多线程对比单线程的优势是非常明显的,在php的两种多线程选择中,抓取业务的脚本建议使用curl_muliti_init处理,就是要注意cpu负载的问题。其余业务的多线程,建议使用多进程处理。
php 多进程使用pcntl扩展,popen()。
pcntl和popen的区别和优劣势?
配置如下
硬件CPU型号: Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz
内存: 2G
环境
系统:CentOS Linux release 7.2.1511 x86_64
语言: php7
其他:nginx+fpm
脚本
pthreads.php<?php class Request extends Thread { public $url; public $data; public function __construct($i) { $this->key = $i; } public function run() { $this->get(); //echo "线程 ".$this->key." 完成\n"; } public function get() { $url = 'http://baike.baidu.com/link?url=nEdHS2eAR0az63Q476rLmPaWvrCTzLzr6bBNhbVyATQxlFX1VkI4ogidtzzLendMU2PI-_hcpdOZFwpytlfRc8OGc49CKl01YEJpvPe8EOu2FgdqfMAGMLDaLfkF_FRlK5brnRe90jhqUFJhn8tg_K'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_exec($ch); curl_close($ch); } } for($i=0;$i<100;$i++) { $tmp[$i] = new Request($i); $tmp[$i]->start(); //echo "线程".$i."启动\n"; }
curlmulti.php
<?php $url = 'http://baike.baidu.com/link?url=nEdHS2eAR0az63Q476rLmPaWvrCTzLzr6bBNhbVyATQxlFX1VkI4ogidtzzLendMU2PI-_hcpdOZFwpytlfRc8OGc49CKl01YEJpvPe8EOu2FgdqfMAGMLDaLfkF_FRlK5brnRe90jhqUFJhn8tg_K'; $mh = curl_multi_init(); for($i=0; $i<100; $i++) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_multi_add_handle($mh, $ch); $chs[] = $ch; } do{ curl_multi_exec($mh, $running); curl_multi_select($mh); }while($running>0); foreach($chs as $ch) { curl_multi_getcontent($ch); curl_multi_remove_handle($mh, $ch); }
curl.php
<?php $url = 'http://baike.baidu.com/link?url=nEdHS2eAR0az63Q476rLmPaWvrCTzLzr6bBNhbVyATQxlFX1VkI4ogidtzzLendMU2PI-_hcpdOZFwpytlfRc8OGc49CKl01YEJpvPe8EOu2FgdqfMAGMLDaLfkF_FRlK5brnRe90jhqUFJhn8tg_K'; for($i=0; $i<100; $i++) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($ch); curl_close($ch); }
执行100次抓取的实验结果:
| 脚本 | CPU最高波动 | 执行时间 |
| --- | --- | --- |
| pthreads.php | 5.5 | 7.3s |
| curlmulti.php | 10 | 6.9s |
| curl.php | 0.1 | 31.3s |
备注
安装pthreads扩展的时候,非常麻烦,pthreads仅支持zts的php版本,由于本机已有php5.4,所以重新编译安装了php7,具体编译参数不详发,百度都能搜到。但是在安装pthreads扩展的时候,又出现问题,pecl.php.net上的扩展是有问题的,需要去github上源码clone下拉,phpize安装。由测试可知多线程对比单线程的优势是非常明显的,在php的两种多线程选择中,抓取业务的脚本建议使用curl_muliti_init处理,就是要注意cpu负载的问题。其余业务的多线程,建议使用多进程处理。
php 多进程使用pcntl扩展,popen()。
疑问
查阅了部分文章后,仍然对多进程和多线程的优劣势,没有一个清晰的认知,感觉跟共享内存,文件锁之类的有关,有时间需要深入了解。pcntl和popen的区别和优劣势?
相关文章推荐
- php开发wap常用技巧
- apache+php安装全攻略
- 使用VI编辑器开发PHP程序设置
- php 建立虚拟主机
- PHP网站打开速度很慢
- CentOS 6.3下源码安装LAMP(Linux+Apache+Mysql+Php)环境
- php文件上传
- PHP 签名
- php 删除cookie方法详解
- jsp与php混用的漏洞
- #redis redis-php安装配置
- PHP的命令行脚本开发
- 基于JSON的Ajax简易网络聊天程序(PHP)
- PHP 从数据库Mysql中读取数据生成excel(解决乱码问题,解决中文变问号问题)
- PHP utf-8中文截取无乱码
- PHP 编码规范 1 文件结构
- echo.php
- PHP商品秒杀计时实现(解决大流量方案)
- 第74篇 webrtc一对一研究(三)及php及windows/office激活
- php异常\错误处理类