PHP fsockopen异步调用出现不执行的问题
2016-11-07 21:57
302 查看
因为项目出现一个异步调用的场景,即有些动作需要执行,但没必要等待其执行完返回结果。所以想通过php来模拟下异步调用(众所周知:php在异步调用就是鸡肘),之前用curl实现过,现在想用fsockopen来尝试下。
function doSocket($get){
$url = "http://www.webyang.net";
$fp = fsockopen($url, 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET /".$get." HTTP/1.1\r\n";
$out .= "Host: ".$url."\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
/*忽略执行结果
while (!feof($fp)) {
echo fgets($fp, 128);
}*/
fclose($fp);
}
}
这样执行的时候,结果发现很多丢失,并没有处理。网上查了下,发现很多这种情况。看了下access.log文件,http的状态是499(client has closed connection)。和这篇文章:www.cnblogs.com/zhangweishi/p/5306813.html 很类似。
于是将此方法做了调整:
function doSocket($get){
$url = "http://www.webyang.net";
$fp = fsockopen($url, 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
stream_set_blocking($fp,0); //开启非阻塞模式
stream_set_timeout($fp, 3); //设置超时时间(s)
$out = "GET /".$get." HTTP/1.1\r\n";
$out .= "Host: ".$url."\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
usleep(300000); //等待300ms
/*忽略执行结果
while (!feof($fp)) {
echo fgets($fp, 128);
}*/
fclose($fp);
}
}
并且在异步脚本的头部添加了:
ignore_user_abort (true);
set_time_limit (30);
观察了一段时间,没发现啥异样。
要解决这个问题需要将 NGINX FastCGI 忽略客户端中断配置打开:
如果是服务器(fastcgi)的话,可以尝试下:
fastcgi_ignore_client_abort on;
不过这个可能给服务器带来没必要的开销,和意想不到的其他问题。
有兴趣的可以研究下:swoole,workerman。
更多请支持原创博客:http://www.webyang.net/Html/web/article_281.html
function doSocket($get){
$url = "http://www.webyang.net";
$fp = fsockopen($url, 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET /".$get." HTTP/1.1\r\n";
$out .= "Host: ".$url."\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
/*忽略执行结果
while (!feof($fp)) {
echo fgets($fp, 128);
}*/
fclose($fp);
}
}
这样执行的时候,结果发现很多丢失,并没有处理。网上查了下,发现很多这种情况。看了下access.log文件,http的状态是499(client has closed connection)。和这篇文章:www.cnblogs.com/zhangweishi/p/5306813.html 很类似。
于是将此方法做了调整:
function doSocket($get){
$url = "http://www.webyang.net";
$fp = fsockopen($url, 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
stream_set_blocking($fp,0); //开启非阻塞模式
stream_set_timeout($fp, 3); //设置超时时间(s)
$out = "GET /".$get." HTTP/1.1\r\n";
$out .= "Host: ".$url."\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
usleep(300000); //等待300ms
/*忽略执行结果
while (!feof($fp)) {
echo fgets($fp, 128);
}*/
fclose($fp);
}
}
并且在异步脚本的头部添加了:
ignore_user_abort (true);
set_time_limit (30);
观察了一段时间,没发现啥异样。
要解决这个问题需要将 NGINX FastCGI 忽略客户端中断配置打开:
如果是服务器(fastcgi)的话,可以尝试下:
fastcgi_ignore_client_abort on;
不过这个可能给服务器带来没必要的开销,和意想不到的其他问题。
有兴趣的可以研究下:swoole,workerman。
更多请支持原创博客:http://www.webyang.net/Html/web/article_281.html
相关文章推荐
- 关于php执行liux命令出现的问题,记载
- bat 执行 php 出现问题 原因php 引用 相对路径
- php 执行事务的时候pdo出现问题
- crontab定时执行bash脚本出现错误 手动没有问题
- PHP返回mysql数据库中文字符出现乱码问题之解决方案
- 配置IIS是出现的问题-执行访问被拒绝-备忘
- php出现Cannot modify header information问题的解决方法大全
- PHP 5.2 出现的Nesting level too deep - recursive dependency问题
- 关于php页面最大执行时间问题(set_time_limit函数在windows下不起作用的解决)
- 提高php的执行效率问题
- PHP中处理截取汉字,出现乱码问题的2个类
- PHP 出现乱码和Sessions验证问题的解决方法!
- 从php3升级到php4出现的一个参数传递问题
- PHP中处理截取汉字,出现乱码问题的2个类
- SQL2008的查询分析器怪异问题,出现长时间“正在进行分析…”或“正在进行执行…”的状态栏
- LR执行中出现的问题
- PHP中处理截取汉字,出现乱码问题的2个类
- Linux下安装PHP经常出现的问题
- Eclipse中执行Ant脚本出现Could not find the main class的问题及解
- 关于PHP中出现乱码和Sessions验证问题的解决方法!