error:使用fsockopen实现异步,发现请求会丢失,nginx 499 怎么办?

在上一篇,小编说到php异步请求,其中fsockopen会有一个缺点,那就是会出现请求丢失的情况,查看 nginx access log,发现这样的请求会以 499(Client Closed Request)记录。

 

为什么?

nginx对499的定义是”client has closed connection”,并且在这些情况下会返回这个状态码:

  1. upstream 在收到读写事件处理之前时发现连接不可用。
  2. server处理请求未结束,而client提前关闭了连接。
  3. upstream出错,执行next_upstream时发现连接不可用。

而我们问题是因为 fwrite之后马上执行fclose,nginx会直接返回499,客户端主动端口请求连接时,nginx不会将该请求代理给上游服务(FastCGI PHP 进程),这个时候 access log 中会以 499 记录这个请求。

要解决这个问题需要将 nginx FastCGI 忽略客户端中断配置打开:

fastcgi_ignore_client_abort on;

这样无论客户端是否断开,都会将这个请求代理给上游,并且会记录上游服务处理后的返回状态。

当然也可以在脚本头部中添加以下配置

ignore_user_abort (true);

 

你也可以这样?

一个不安全的做法是在fclose之前,让当前的进程先睡眠一段时间;使用usleep函数设置为10毫秒,这10毫秒的延迟对整个请求的影响不大,但是我也认为nginx不一定能在10毫秒内把请求转到fastcgi去执行。这个时间间隔很难把握,不能保证php一定有执行到。当然你也可以调整时间更长一些,但是这样我觉得异步就没必要了。

 

 

 

 

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: PHP 可以通过以下方式实现与中心平台通信协议的功能: 1. 读取 PDF 文件:使用 PHP 的文件处理函数,如 fopen、fread 等,可以打开并读取 PDF 文件。可以使用文件路径打开文件,并使用 fread 函数一次读取一定字节数的内容。 2. 解析 PDF 文件内容:PDF 文件是二进制文件,需要使用特定的库或工具进行解析。PHP 提供了一些第三方库和工具,如 TCPDF、FPDF 等,可以用来解析和操作 PDF 文件内容。 3. 提取所需信息:根据 PDF 文件的结构和内容,使用合适的方法提取所需的信息。可以通过正则表达式、关键字匹配、字符串截取等方式,根据文件中的特定标记或格式,抽取目标信息。 4. 与中心平台进行通信:根据通信协议中定义的请求和响应格式,使用 PHP 的网络相关函数或库,如 curl、fsockopen 等,与中心平台建立连接并发送请求。根据通信协议约定的方式,将提取到的信息打包成请求参数发送。 5. 处理中心平台的响应:通过 PHP 读取中心平台返回的响应,解析响应内容,根据协议约定的返回信息进行相应的处理。可以根据返回的状态码、错误码等进行错误处理或进一步的操作。 6. 其他功能:根据具体需求,还可以实现其他相关功能,比如数据存储、数据分析、日志记录等。可以使用 PHP 的文件处理函数、数据库操作函数、日志记录函数等,完成相应功能的实现。 总之,通过使用适当的文件处理、PDF 解析、网络通信等 PHP 函数和库,可以实现与中心平台通信协议的功能,并对充电桩(机)智能终端与中心平台的通信进行处理和交互。 ### 回答2: PHP 是一种流行的编程语言,可以用来实现各种 Web 应用程序的开发。要实现 《02-4.附件4:充电桩(机)智能终端与中心平台通信协议.pdf》的功能,首先需要通过 PHP 来建立与中心平台的通信。 首先,我们需要准备好 PHP 开发环境。安装好 PHP 后,可以使用相关的函数和类库来进行网络通信的操作。一般情况下,我们可以使用 curl 函数来发送 HTTP 请求。 - 首先,我们可以使用 curl 初始化一个话,并设置相关的选项,如 URL、请求头、请求方法等。 ```php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://example.com/api'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); ``` - 然后,我们可以执行该话,并获取返回结果。 ```php $response = curl_exec($ch); curl_close($ch); ``` - 最后,我们可以对返回结果进行处理和解析,根据具体的需求进行后续操作。 以上是一个简单的示例,具体的通信协议与接口需要根据《02-4.附件4:充电桩(机)智能终端与中心平台通信协议.pdf》的文档来进行实现。根据文档的要求,我们可能需要设置特定的请求头、请求方法、参数等。 总之,通过 PHP 实现与中心平台的通信,我们可以使用 curl 函数来发送 HTTP 请求,并根据文档中的定义和要求来处理请求和返回结果。另外,根据具体的需求,我们还可以使用其他的 PHP 类库或框架来简化开发过程,提高效率。 ### 回答3: PHP 是一种广泛用于开发 Web 应用程序的脚本语言,可以通过编写 PHP 代码来实现与其他系统之间的通信。要实现《02-4.附件4:充电桩(机)智能终端与中心平台通信协议.pdf》的功能,可以使用 PHP 对该通信协议进行解析和处理。 首先,可以使用 PHP 的文件操作函数来读取《02-4.附件4:充电桩(机)智能终端与中心平台通信协议.pdf》文件。使用文件读取函数,如 `file_get_contents` 可以将 PDF 文件内容读取为字符串。 接下来,针对该通信协议的格式和规范,可以使用字符串处理函数对读取到的 PDF 内容进行解析。可以使用字符串的分割、搜索等函数,根据协议中的标记和关键词进行数据提取和处理。 根据协议的要求,可以将解析得到的数据用于与中心平台进行通信。可以使用 PHP 的网络请求函数,如 `curl` 可以直接与中心平台进行 HTTP 请求,发送协议规定的数据。 在与中心平台通信的过程中,可以根据协议的要求将相关数据进行加密、编码等操作。PHP 提供了常用的加密、编码函数,如 MD5、Base64 等,可以根据协议要求使用这些函数进行数据处理。 最后,可以使用 PHP 将处理得到的数据进行存储和展示。可以使用数据库操作函数,如 MySQLi、PDO 等,将数据存储到数据库中,或者使用文件操作函数将数据保存到文件中。同时,可以使用 PHP 的模板引擎等工具将数据展示在 Web 页面上。 综上所述,可以使用 PHP 对《02-4.附件4:充电桩(机)智能终端与中心平台通信协议.pdf》进行处理、解析和通信。通过字符串处理、网络请求、加密编码等功能,可以实现与中心平台间的数据交互,并将数据存储或展示在前端页面上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝶开三月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值