网站首页php
PHP多进程采集cli模式及web模式分析
发布时间:2016-06-13 01:44:23编辑:阅读(3835)
一、在cli模式下开启多进程。
在cli下php开启多进程,需要开启pcntl扩展(限linux).
a、在编译PHP时在./configrue后加上--enable-pcntl
b、若已安装过PHP,可以直接编译pcntl源文件
# cd /usr/local/src/php-5.6.1/ext/pcntl # phpize # ./configure --with-php-config=/usr/local/php/bin/php-config # make && make install 把pcntl.so 加到php.ini中 extension=pcntl.so 重新启动php-fpm或apache完成。
然后就可以疯狂的开多进程了, 从网上找了个简化操作的库,在cli下会自动统计采集数据量,挺好用.
采集代码看起来非常简略(run.php):
<?php include('./process.lib.php'); include('./curl.lib.php'); multi_process($argv[1], true); while(true){ $tid = mp_counter('tid'); //$tid用于安装计数器种子,每次执行时+1 $url = "http://bbs.xxxxx.com/forum-1889-{$tid}.html"; do{ $html= curl_get($url, 'utf-8'); }while($html===FALSE); //对html内容进行处理 }
在cli下执行:
php -f run.php 1000
这样就可以开启1000个进程开始采集了。(注意你的服务器资源,可以根据cpu数量和内存容量多调试,找到最优的开启进程数。)
二、在web模式下开启多进程。
在web模式下开多进程的话, 我用的是鸟哥的rpc框架yar。
安装如下:
#wget #tar -zxvf yar-2.0.0.tgz #cd yar-2.0.0 #/usr/local/php/v70/bin/phpize #./configure --with-php-config=/usr/local/php/v70/bin/php-config #make && make install 在PHP.ini中添加yar.so extension=yar.so 重新启动php-fpm或apache完成。
使用的话,要先编写服务端(rpc.php):
<?php include('./curl.lib.php'); class RPC{ public function getData($tid){ $url = "http://bbs.xxxxx.com/forum-1889-{$tid}.html"; $html = curl_get($url, 'utf-8'); //对html内容进行处理 } } $service = new Yar_Server(new RPC()); $service->handle();
然后,就可以去客户端跑起多开了, 嗯 ,貌似是模拟的多进程,开了1000个并发。
数据处理主要在服务端完成,挺大的局限性,不过也能很好的完成任务:)
<?php function callback($retval, $callinfo) { if ($callinfo == NULL) { echo 'Done'; return TRUE; } print_r($retval); } for($i=1;$i<1000;$i++){ Yar_Concurrent_Client::call("http://host/rpc.php", "getData", array($i), "callback"); } Yar_Concurrent_Client::loop();
评论