PHP fsockopen 异步调用接口在nginx上偶尔实效的情况
private function fsock_asy_do($get){
$fp = fsockopen("ssl://www.xxx.com", 443, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
stream_set_blocking($fp,0);//开启非阻塞模式
$out = "GET /".$get." HTTP/1.1\r\n";
$out .= "Host: www.xxxx.com\r\n";
$out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out);
/*忽略执行结果
while (!feof($fp)) {
echo fgets($fp, 128);
}*/
usleep(1000);
fclose($fp);
}
}
在这段代码里面,调用后忽略执行结果直接返回,可用于php异步执行。
在nginx服务器上有一个比较诡异的情况就是有时候无法调用异步的脚本。
查阅相关资料后,是nginx 499 的问题。
其中解决方案有以下,经过对每一个方案的验证最终得出结果:
1、NGINX 499
查看 NGINX access log,发现这样的请求会以 499
(Client Closed Request)记录。确定问题是因为:客户端主动端口请求连接时,NGINX 不会将该请求代理给上游服务(FastCGI PHP 进程),这个时候 access log 中会以 499 记录这个请求。
要解决这个问题需要将 NGINX FastCGI 忽略客户端中断配置打开:
fastcgi_ignore_client_abort on;
这样无论客户端是否断开,都会将这个请求代理给上游,并且会记录上游服务处理后的返回状态。
2、NGINX 线程原因
将nginx的worker_processes 由之前的auto修改为2(我的是单核服务器)
3、NGINX 499
nginx对499的定义是”client has closed connection”,并且在这些情况下会返回这个状态码:
- upstream 在收到读写事件处理之前时发现连接不可用。
- server处理请求未结束,而client提前关闭了连接。
- upstream出错,执行next_upstream时发现连接不可用。
一个不安全的做法是在fclose之前,让当前的进程先睡眠一段时间;我这里设置为10毫秒,这10毫秒的延迟对我完成整个请求的影响不大,同时我也认为nginx一定能在10毫米内把请求转到fastcgi去执行。这个时间间隔很难把握,不能保证php一定有执行到。
这种方式并不是真正的异步,只是很取巧的强制关闭连接而不等待服务器端响应。所以在Laruence的那2篇文章中,有2个问题:
- PHP使用fsock不能叫做异步,只是伪异步。
- fwrite之后马上执行fclose,nginx会直接返回499
由于我的代码上面usleep为1000,初步估计是时间不够导致没发出去就close了,所以调整为20000。并进行最后测试。
结果晚点更新。
更新结果:测试2天结果显示正常,的确是usleep数值过小的问题。
PHP fsockopen 异步调用接口在nginx上偶尔实效的情况的更多相关文章
- jquery中ajax异步调用接口
之前写过一个原始的.无封装的页面,没有引入任何外部js,直接实例化Ajax的XmlRequest对象去异步调用接口,参见Ajax异步调用http接口后刷新页面,可对比一下. 现在我们用jquery包装 ...
- Axis2(8):异步调用WebService
在前面几篇文章中都是使用同步方式来调用WebService.也就是说,如果被调用的WebService方法长时间不返回,客户端将一直被阻塞,直到该方法返回为止.使用同步方法来调用WebService虽 ...
- SpringBoot集成篇(二) 异步调用Async
什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行. 如何实现异步调用? 多线程, ...
- Spring Boot使用@Async实现异步调用
原文:http://blog.csdn.net/a286352250/article/details/53157822 项目GitHub地址 : https://github.com/FrameRes ...
- 如何在Spring异步调用中传递上下文
以下文章来源于aoho求索 ,作者aoho 1. 什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步 ...
- SpringBoot第十二集:度量指标监控与异步调用(2020最新最易懂)
SpringBoot第十二集:度量指标监控与异步调用(2020最新最易懂) Spring Boot Actuator是spring boot项目一个监控模块,提供了很多原生的端点,包含了对应用系统的自 ...
- spring boot 学习(十一)使用@Async实现异步调用
使用@Async实现异步调用 什么是”异步调用”与”同步调用” “同步调用”就是程序按照一定的顺序依次执行,,每一行程序代码必须等上一行代码执行完毕才能执行:”异步调用”则是只要上一行代码执行,无需等 ...
- Python Django 协程报错,进程池、线程池与异步调用、回调机制
一.问题描述 在Django视图函数中,导入 gevent 模块 import gevent from gevent import monkey; monkey.patch_all() from ge ...
- 用Html5/CSS3做Winform,一步一步教你搭建CefSharp开发环境(附JavaScript异步调用C#例子,及全部源代码)上
本文为鸡毛巾原创,原文地址:http://www.cnblogs.com/jimaojin/p/7077131.html,转载请注明 CefSharp说白了就是Chromium浏览器的嵌入式核心,我们 ...
随机推荐
- 常用的sublime text插件(很爽哦)
个人比较懒,平时喜欢用webstorm,但是因为webstorm打开实在太慢了,并且太看设备,所以本人编辑简单的文件依然会选择使用sublime,虽然网上有很多关于此类插件的分享了,但是感觉都是片段, ...
- 安装openssl 扩展的时候出现Cannot find config.m4. Make sure that you run '/usr/local/php/bin/phpize' in the top level source directory of the module的解决方法
进入php源码包目录:cd /usr/local/php-5.6.25/ext/openssl 执行命令: cp ./config0.m4 ./config.m4 即可
- 用SqlBulkCopy批量安插数据时提示来自数据源的 String 类型的给定值不能转换为指定目标列的类型 int
dr["description"] = ds.Tables[0].Rows[i]["组织描述"].ToString(); dr[& ...
- mysql优化笔记之分页
过年闲得蛋疼,于是看看mysql优化,看了网上好多关于分页的优化方法,但是呢,我亲自试上一把的时候,没有出现他们说的现象...难道是我的机器问题么? 下面看看我的实践记录,希望看到的加入进来交流一下O ...
- 2016多校联合训练4 F - Substring 后缀数组
Description ?? is practicing his program skill, and now he is given a string, he has to calculate th ...
- 杨氏矩阵定义及其查找的实现C++
先介绍一下这个数据结构的定义,Young Tableau有一个m*n的矩阵,然后有一数组 a[k], 其中 k<=m*n ,然后把a[k]中的数填入 m*n 的矩阵中,填充规则为: 1. 每一 ...
- CI框架代码运行最详细的流程
最近在学习CI(3.1.0-dev)框架源码,一边看源码,一边在github上面写中文注释,https://github.com/pandancode/CI-note,有兴趣的同学可以看看. inde ...
- 51nod算法马拉松15
智力彻底没有了...看来再也拿不到奖金了QAQ... A B君的游戏 因为数据是9B1L,所以我们可以hash试一下数据... #include<cstdio> #include<c ...
- .net core Jwt 添加
Jwt 已经成为跨平台身份验证通用方案,如不了解请关注:https://jwt.io/. 为了和微软其他验证模块有个比较好的衔接,项目中采用了微软开发的jwt组件: System.IdentityMo ...
- 安卓(android)之实现断点下载功能
一.建立实体类 1.文件实体类 package com.example.zjw.myapplication.dao; import java.io.Serializable; /** * 预下载文件实 ...