利用PHP V5开发多任务应用程序

2008-05-28 16:22 稿源:互联网  0条评论

大多数 PHP 页面已经足够快 —— 更好的性能会是一种优势,但是还不值得对新代码进行投入。

在 Web 页面中使用 PHP 可以放弃部分无关紧要的性能提升 —— 当惟一的价值标准是交付整个 Web 页面需要的时间时,那么重新安排计算以更快地获得中间结果并不重要。

PHP 不能控制本地瓶颈 —— 用户可能会为花 8 秒的时间提取帐户记录的详细信息而抱怨,但是那很可能是数据库处理或某种其他 PHP 外部资源的约束。即使将 PHP 处理降至零,单是查找就仍需要花费超过 7 秒的时间。

甚至很少有约束是并行的 —— 假定某特定页面将为具体列出的普通股计算建议交易价格,并且计算十分复杂,需要花费一段时间。计算在本质上可能是顺序执行的。没有一种明显的方法可以将其划分为 “团队协作”。

很少有 PHP 程序员能够认识到 PHP 实现并发的潜力。在具有使用并行实现性能需求的少数人当中,我遇到的大多数人全都说 PHP “不支持线程”,并且甘于使用现有的计算模型。

可是,有时我们可以做得更好。假定 PHP 页面需要计算两只股票价格,可能还需要将两者相比较,并且底层主机刚好是多处理器。在这种情况下,通过将两个截然不同并且十分耗时的计算分配给不同处理器,可能会提高几乎两倍的性能。

在所有 PHP 计算领域中,此类实例很少见。但是,由于我发现到处都没有对它的精确记录,因此需要在这里包括用于此类加速的模型。

清单 5. 延迟服务器实现

<?php
echo "Program starts at ". date('h:i:s') . ".
";
$timeout=10;
$streams=array();
$handles=array();
/* First launch a program with a delay of three seconds, then
one which returns after only one second. */
$delay=3;
for ($id=0; $id <= 1; $id++) {
  $error_log="/tmp/error" . $id . ".txt"
  $descriptorspec=array(
 0 => array("pipe", "r"),
 1 => array("pipe", "w"),
 2 => array("file", $error_log, "w")
  );
  $cmd='sleep ' . $delay . '; echo "Finished with delay of ' .
  $delay . '".';
  $handles[$id]=proc_open($cmd, $descriptorspec, $pipes);
  $streams[$id]=$pipes[1];
  $all_pipes[$id]=$pipes;
  $delay -= 2;
}
while (count($streams)) {
  $read=$streams;
  stream_select($read, $w=null, $e=null, $timeout);
  foreach ($read as $r) {
 $id=array_search($r, $strea**ms);
 echo stream_get_contents($all_pipes[$id][1]);
 if (feof($r)) {
  fclose($all_pipes[$id][0]);
  fclose($all_pipes[$id][1]);
  $return_value=proc_close($handles[$id]);
  unset($streams[$id]);
 }
  }
}
?>


此程序将生成如下输出:

Program starts at 10:28:41.
Finished with delay of 1.
Finished with delay of 3.

这里的关键在于 PHP 启动了两个独立子进程,取回待完成的第一个进程的输出,然后取回第二个进程的输出,即使后者启动得较早。如果主机是多处理器计算机,并且操作系统已正确配置,则操作系统本身负责将各个子程序分配给不同的处理器。这是在多处理器主机中良好应用 PHP 的一种方法。

PHP 支持多任务。PHP 不按照诸如 Java 编程语言或 C++ 等其他语言所采用的方法支持线程,但是以上示例表明 PHP 具有更多的超乎想象的加速潜力。

有好的文章希望站长之家帮助分享推广,猛戳这里我要投稿

相关文章

相关热点

查看更多

关闭