尝试使用这种技术在 PHP 中运行多个并行作业。在此示例中,我们有两个作业文件:我们要运行的 j1.php 和 j2.php。示例作业没有做任何花哨的事情。文件 j1.php 如下所示:
$jobname = 'j1';
set_time_limit(0);
$secs = 60;
while ($secs) {
echo $jobname,'::',$secs,"\n";
flush(); @ob_flush(); ## make sure that all output is sent in real-time
$secs -= 1;
$t = time();
sleep(1); // pause
}
我们flush()的原因;@ob_flush(); 是当我们回显或打印时,字符串有时会被 PHP 缓冲,直到稍后才发送。这两个功能确保立即发送所有数据。
然后我们有第三个文件 control.php,它负责协调作业 j1 和 j2。该脚本将使用 JobStartAsync() 中的 fsockopen 异步调用 j1.php 和 j2.php,因此我们能够并行运行 j1.php 和 j2.php。使用 JobPollAsync() 将 j1.php 和 j2.php 的输出返回到 control.php。
#
# control.php
#
function JobStartAsync($server, $url, $port=80,$conn_timeout=30, $rw_timeout=86400)
{
$errno = '';
$errstr = '';
set_time_limit(0);
$fp = fsockopen($server, $port, $errno, $errstr, $conn_timeout);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
return false;
}
$out = "GET $url HTTP/1.1\r\n";
$out .= "Host: $server\r\n";
$out .= "Connection: Close\r\n\r\n";
stream_set_blocking($fp, false);
stream_set_timeout($fp, $rw_timeout);
fwrite($fp, $out);
return $fp;
}
// returns false if HTTP disconnect (EOF), or a string (could be empty string) if still connected
function JobPollAsync(&$fp)
{
if ($fp === false) return false;
if (feof($fp)) {
fclose($fp);
$fp = false;
return false;
}
return fread($fp, 10000);
}
###########################################################################################
if (1) { /* SAMPLE USAGE BELOW */
$fp1 = JobStartAsync('localhost','/jobs/j1.php');
$fp2 = JobStartAsync('localhost','/jobs/j2.php');
while (true) {
sleep(1);
$r1 = JobPollAsync($fp1);
$r2 = JobPollAsync($fp2);
if ($r1 === false && $r2 === false) break;
echo "<b>r1 = </b>$r1<br>";
echo "<b>r2 = </b>$r2<hr>";
flush(); @ob_flush();
}
echo "<h3>Jobs Complete</h3>";
}
好读
PHP中的分而治之和并行处理
从源头