PHP利用fscckopen实现异步处理


用fscckopen实现异步调用php , 这样客户端请求时就可以秒开,无阻塞,把一些耗时的任务放在后台运行。具体请参考原文:使用fscok实现异步调用PHP

文件test.php

我简化成只用GET方法。方便理解。并且调用同一页面,逻辑上调用其它页面可能会更好一点。不过测试没发现问题。

<?php

ignore_user_abort(TRUE); //如果客户端断开连接,不会引起脚本abort.
set_time_limit(0);//取消脚本执行延时上限

if($_GET){
 sleep(10);
 writelog("get=" . $_GET['get']); //10秒后创建log.txt
 exit;
}

$url="http://127.0.0.1/test.php?get=1";
triggerRequest($url);
echo "success";
function triggerRequest($url){
 $method = "GET"; //可以通过POST或者GET传递一些参数给要触发的脚本
 $url_array = parse_url($url); //获取URL信息,以便平凑HTTP HEADER
 $port = isset($url_array['port'])? $url_array['port'] : 80; 
 
 $fp = fsockopen($url_array['host'], $port, $errno, $errstr, 30); 
 if (!$fp) {
 return FALSE;
 }
 $getPath = $url_array['path'] ."?". $url_array['query'];

 $header = $method . " " . $getPath;
 $header .= " HTTP/1.1\r\n";
 $header .= "Host: ". $url_array['host'] . "\r\n"; //HTTP 1.1 Host域不能省略
 $header .= "Connection:Close\r\n\r\n";


 fwrite($fp, $header);
 //echo fread($fp, 1024); //我们不关心服务器返回. 关闭这里才不会阻塞
 fclose($fp);
 
 return true;
}
function writelog($message) {
 $path = './log.txt';
 $handler = fopen($path, 'w+b');
 if ($handler) {
 $success = fwrite($handler, $message);
 fclose($handler);
 }
}

 

在php-fpm fastcgi下,也可以用fastcgi_finish_request实现异步非阻塞。 请参考:使用fastcgi_finish_request提高页面响应速度


8条回应:“PHP利用fscckopen实现异步处理”