易截截图软件、单文件、免安装、纯绿色、仅160KB

PHP中实现非阻塞模式

程序非阻塞模式,这里也可以理解成并发。而并发又暂且可以分为网络请求并发
和本地并发

先说一下网络请求并发
理论描述
假设有一个client,程序逻辑是要请求三个不同的server,处理各自的响应。传统模型当然是顺序执行,先发送第一个请求,等待收到响应数据后再发送第二个请求,以此类推。就像是单核CPU,一次只能处理一件事,其他事情被暂时阻塞。而并发模式可以让三个server同时处理各自请求,这就可以使大量时间复用。
画个图更好说明问题:
前者为阻塞模式,忽略请求响应等时间,总耗时为700ms;而后者非阻塞模式,由于三个请求可以同时得到处理,总耗时只有300ms。
代码实现
<?php
echo "Program starts at ". date('h:i:s') . ".\n";
$timeout = 3;
$sockets = array(); //socket句柄数组
//一次发起多个请求
$delay = 0;
while ($delay++ < 3)
{
$sh = stream_socket_client("localhost:80", $errno, $errstr, $timeout,
STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);
/* 这里需要稍微延迟一下,否则下面fwrite中的socket句柄不一定能真正使用
这里应该是PHP的一处bug,查了一下,官方bug早在08年就有人提交了
我的5.2.8中尚未解决,不知最新的5.3中是否修正
*/
usleep(10);
if ($sh) {
$sockets[] = $sh;
$http_header = "GET /test.php?n={$delay} HTTP/1.0\r\n";
$http_header .= "Host: localhost\r\n";
$http_header .= "Accept: */*\r\n";
$http_header .= "Accept-Charset: *\r\n";
$http_header .= "\r\n";
fwrite($sh, $http_header);
} else {
echo "Stream failed to open correctly.\n";
}
}
//非阻塞模式来接收响应
$result = array();
$read_block_size = 8192;
while (count($sockets))
{
$read = $sockets;
$n = stream_select($read, $w=null, $e=null, $timeout);
//if ($n > 0) //据说stream_select返回值不总是可信任的
if (count($read))
{
/* stream_select generally shuffles $read, so we need to
compute from which socket(s) we're reading. */
fo


相关文档:

PHP 类 的使用

用户定义的类,也是学好 PHP 所必备的条件之一。而 PHP 的类,和其它的面向对象语言比较起来,还算蛮单纯的。PHP 只有类别 (class)、方法 (method)、属性、以及单一继承 (extensions) 等。对不习惯使用 C++、Java、Delphi 等面向对象语言来开发程序的用户,不妨先阅读一下有关面向对象概念的书,相信可以带来许多的收获。
......

php基础应用:php批量转换文件编码

遍历目录文件,替换编码部分,删除原文件,再重新转码原文件内容,重新生成新文件。
function explorerdir($sDir){

static $aTempArr=array();
$dp=opendir($sDir);
while ($sFileName = readdir($dp)){

if ($sFileName !='.' && $sFileName !='..'){

......

PHP中foreach循环遍历数组

<?php
 
  //声明数组变量
  $arr = array('张三','李四','王五','李明');
 
  //foreach循环遍历数组
  foreach($arr as $key => $value){
   //注意“$value”后必须要一个空格,否则输出的结果不正确
   echo "值$value 的下标为$key<br/ ......

PHP中foreach循环遍历数组(3)

<?php
 
  //声明数组变量
  $arr = array(val1 =>'张三',val2 => '李四',val3 => '王五',val4 => '李明',val5 => '周燕妮');
 
  //foreach循环遍历数组
  foreach($arr as $key => $value){
   //注意“$value”后必须要一个空格,否则输 ......

PHP中如何更新数组

原文链接:http://www.phpdo.net/index.php/20100410/55.html
在PHP中更新数组的内容可以直接指定键名并且对该键名赋值。 例如:
 <?php
 $php = array(“php”,”phpdo”,”phpdo.net”);
 $php[2] = “www.phpdo.net”;
 print_r($php);
&nbs ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号