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

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

只粗略地涉及 PHP 的第三个并发实例是 PHP/TK。PHP/TK 是 PHP 的扩展,用于为核心 PHP 提供可移植图形用户界面(GUI)绑定。PHP/TK 允许用 PHP 编写代码构造桌面 GUI 应用程序。其基于事件的特性将模拟一种易于掌握并且比线程更少出错的并发形式。此外,并发是 “继承” 自一项辅助技术,而不是 PHP 的基本功能。

向 PHP 本身添加线程支持的试验已经做过多次。据我所知,没有一次是成功的。但是,Ajax 框架和 PHP/TK 的面向事件的实现表明事件可能比线程能更好地体现 PHP 的并发。PHP V5 证明事实确实如此。

PHP V5 将提供 stream_select()

使用标准的 PHP V4 和更低版本,必须按顺序执行 PHP 应用程序的所有工作。例如,如果程序需要在两个商业站点检索商品的价格,则请求第一个站点的价格,等待至响应到达,再请求第二个站点的价格,然后再次等待。

如果程序请求同时完成若干项任务会怎么样?总体来看,程序将在一段时间内完成,在这段时间内,将始终进行连续处理。

第一个示例

新的 stream_select 函数及它的几个助手使这成为可能。请考虑以下示例。

清单 1. 同时请求多个 HTTP 页面

<?php
echo "Program starts at ". date('h:i:s') . ".
";
$timeout=10;
$result=array();
$sockets=array();
$convenient_read_block=8192;
/* Issue all requests simultaneously; there's no blocking. */
$delay=15;
$id=0;
while ($delay > 0) {
  $s=stream_socket_client("phaseit.net:80", $errno,
 $errstr, $timeout,
 STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);
  if ($s) {
 $sockets[$id++]=$s;
 $http_message="GET /demonstration/delay?delay=" .
  $delay . " HTTP/1.0
Host: phaseit.net
";
 fwrite($s, $http_message);
  } else {
 echo "Stream " . $id . " failed to open correctly.";
  }
  $delay -= 3;
}
while (count($sockets)) {
  $read=$sockets;
  stream_select($read, $w=null, $e=null, $timeout);
  if (count($read)) {
 /* stream_select generally shuffles $read, so we need to
 compute from which socket(s) we're reading. */
 foreach ($read as $r) {
  $id=array_search($r, $sockets);
  $data=fread($r, $convenient_read_block);
  /* A socket is readable either because it has
  data to read, OR because it's at EOF. */
  if (strlen($data) == 0) {
 echo "Stream " . $id . " closes at " . date('h:i:s') . ".
";
 fclose($r);
 unset($sockets[$id]);
  } else {
 $result[$id] .= $data;
  }
 }
  } else {
 /* A time-out means that *all* streams have failed
 to receive a response. */
 echo "Time-out!
";
 break;
  }
}
?>

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

相关文章

相关热点

查看更多

关闭