现在的数据处理越来越复杂,串行的执行过程中如果遇到某项占用时间过长,会验证影响下面的执行,这时候并行处理就很有优势了。
做这个测试需要创建三个文件:f1.php,f2.php,control.php
f1.php内容和f2.php基本一样,职责是输出程序执行状态
control.php职责是异步的执行f1.php和f2.php,并把他们反馈的结果打印出来!
f1.php内容:
set_time_limit(0);
$secs = 60;
while ($secs > 0) {
echo 'f1.php::excute ',$secs,' seconds';
flush();
@ob_flush();
$secs--;
sleep(1);
}
?>f2.php内容略,把第五行f1.php改成f2.php就成了
control.php内容:<?php
function asyncRequest($host, $url, $port=80, $conn_timeout=30, $rw_timeout=86400) {
$errno = '';
$errstr = '';
$fp = fsockopen($host, $port, $errno, $errstr, $conn_timeout);
if (!$fp) {
echo "Server error:$errstr($errno)";
return false;
}
stream_set_timeout($fp, $rw_timeout);
stream_set_blocking($fp, false);
$rq = "GET $url HTTP/1.0\r\n";
$rq .= "Host: $host\r\n";
$rq .= "Connect: close\r\n\r\n";
fwrite($fp, $rq);
return $fp;
}
function asyncFetch(&$fp) {
if ($fp === false) return false;
if (feof($fp)) {
fclose($fp);
$fp = false;
return false;
}
return fread($fp, 10000);
}
$fp1 = asyncRequest('localhost', '/test/f1.php');
$fp2 = asyncRequest('localhost', '/test/f2.php');
while (true) {
sleep(1);
$r1 = asyncFetch($fp1);
$r2 = asyncFetch($fp2);
if ($r1 == false && $r2 == false) break;
echo $r1,'
',$r2,'
','------------------------
';
flush();
@ob_flush();
}
echo '
Job Complete
';?>
访问http://localhost/test/control.php就会看到类似下边的输出结果
HTTP/1.1 200 OK Date: Mon, 24 Nov 2008 06:51:29 GMT Server: Apache/2.2.8 (Win32) PHP/5.2.5 X-Powered-By: PHP/5.2.5 Connection: close Content-Type: text/html
HTTP/1.1 200 OK Date: Mon, 24 Nov 2008 06:51:29 GMT Server: Apache/2.2.8 (Win32) PHP/5.2.5 X-Powered-By: PHP/5.2.5 Connection: close Content-Type: text/html
------------------------
f1.php::excute 60 seconds
f2.php::excute 60 seconds
------------------------
f1.php::excute 59 seconds
f2.php::excute 59 seconds
------------------------
f1.php::excute 58 seconds
f2.php::excute 58 seconds
------------------------
f1.php::excute 57 seconds
f2.php::excute 57 seconds
------------------------
这个技术在处理大批量数据的并行处理时能很大的提高效率