因此,我在让服务器端事件与PHP一起工作时遇到了问题.我在网上try 了使用无限While循环的各种不同的教程,但我所有的try 都在几分钟后以500错误告终,而不是发送数据.

对于我的应用程序,我需要脚本在无限循环中运行,因为我正在通过TCP套接字从硬件设备获取更新,而要使设备向我发送更新,我必须保持套接字连接打开.

My setup is as follows:
PHP Version 7.3.33
Windows Server 2022 with IIS 10 (Also tried on Windows Server 2016 with IIS 10)
output_buffering and zlib.output_compression are both set to "Off"
responseBufferLimit is set to 0 in the FastCGI Handler settings for PHP.

我目前使用的基本测试代码如下:

Sse.php

<?PHP
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while(true) {
   $now = date('r');
   echo "data: The time is : {$now}\n\n";
   @ob_flush();
   flush();
   sleep(2);
}
?>

Test.html

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
</head>

<body>
    <script>
    var source = new EventSource("Sse.php");
    source.onopen = function(e) {
   console.log("The connection to your server has been opened");
}
    source.onmessage = function(e) {
   

   console.log ("message: " + e.data);
}
    source.onerror = function(e) {
   console.log("The server connection has been closed due to some errors");
}
    </script>
</body>
</html>

这(理论上)应该每隔2秒向客户端发送一个当前时间的数据字符串,但实际上是500个错误.我必须补充的是,只有在实现While循环时才会出现这种情况.如果我删除了While循环,那么它会让客户端每隔3秒重新连接一次(这对我的应用程序不起作用).

The PHP logs only show the following errors which don't appear to be linked to my issue, unless anyone can suggest otherwise:
[17-Nov-2022 21:26:28 UTC] PHP Warning: Module 'mysqli' already loaded in Unknown on line 0
[17-Nov-2022 21:26:28 UTC] PHP Warning: Module 'mbstring' already loaded in Unknown on line 0
[17-Nov-2022 21:26:28 UTC] PHP Deprecated: Directive 'track_errors' is deprecated in Unknown on line 0

几天来,我一直在寻找一种解决方案,但到目前为止还没有奏效.有没有人对需要更改IIS/PHP设置以使其正常工作的潜在设置有什么建议?

一些教程建议进行以下配置更改: Php.ini&gt;Output_Buffering和zlib.OutputCompression值设置为"OFF" 在PHP的FastCGI处理程序设置中,ResponseBufferLimit设置为0.

但这两点都没有对 playbook 产生任何影响.

推荐答案

因此,经过大量的试验和错误,我已经弄清楚了问题所在.如果其他人有类似的问题,这里是我采取的步骤.

  1. 似乎在我的IIS安装中,PHP被引用了2次(第二次被称为Fast-CGI,这就是我第一次错过它的原因),所以我不得不向两个处理程序都添加了"ResponseBufferLimit=0".这使得无限循环能够正常工作,而不会出现500错误.

  2. 在IIS的服务器配置页面上,有一些用于FastCGISetting的选项.其中有一个用于"请求超时"的设置.默认情况下,该值设置为90秒.我将其设置为600秒(或10分钟),现在在脚本超时并再次启动之前,我得到了持续10分钟的数据流.您只能 Select 一个介于10秒和2592000秒之间的值,但是对于我的应用程序来说,10分钟应该足够了.

非常感谢所有提出建议的人!

Php相关问答推荐

PHP FFI—将PHP数组转换为C指针数组

MariaDB 11.3.2+PHP:服务器向客户端发送未知的字符集(0).请向开发人员报告

WooCommerce在store 页面上显示兼容多语言的产品属性

RediSearch PHP希望我在每次使用时定义所有字段

有没有办法为整个PHP应用程序启用严格类型

如何在WooCommerce产品子类别中显示特定内容

使用PHP编码的字符串与使用OpenSSL编写的shell 代码之间的差异

Codeigniter 3中SMTP.office 365.com的截断问题

从字符串转换日期和/或时间时,Laravel转换失败

将自定义字段添加到管理产品中 WooCommerce 3.2+ 中的快速编辑

如何在 Woocommerce 中自动删除旧的已完成订单

使用产品自定义字段作为 WooCommerce 中特定用户角色的折扣百分比

Firefox 115 会话行为:为什么页面无法找到要加载的现有会话 ID?

使用 Composer 找不到 Google APIClient 类

使用 PHP 的 OAuth 2.0 MAC

跟踪通过 WooCommerce 分层定价表插件进行的购买

在WooCommerce单产品页面中显示特价产品的节省金额

如何在PHP中对多个脚本调用进行排队?

mysql / sql修复多对多数据库中的行

如何通过路由传递变量