当脚本因阻塞 io 而超时时,如何生成自定义响应?

How do I generate a custom response when a script times out due to blocking io?

目标

我正在开发一个 JSON 端点,当用户向它发送 GET 请求时,它基本上将数据从服务器端 COM 端口读取到文件(在服务器端)。来自服务器的响应必须是格式正确的 JSON 响应,其中包含内容被转储到的文件的名称。如果 COM 端口响应时间太长,则文件将关闭,并且对于它从 COM 端口读取的任何内容仍然被认为是有效的。仍提供有效回复。

问题

当 COM 端口不再接收数据时,它将阻塞直到脚本超时。这会导致错误,并且 IIS 在 json 端点上提供了一个通用错误页面。这是无效的 json,但它也不包含 com 数据转储到的文件的名称。

详情

对于您的 JSON 端点,您可以创建一个包装器脚本来调用您的 IO 脚本。为您尝试从它获得响应设置超时,然后 return JSON 使用它从脚本中获得的任何内容,或者如果脚本超时则使用一些自定义消息。

$timeout = 5;  // some reasonable time less than the wrapper script timeout

$data = ['filename' => 'something'];            // create the file name
$q = http_build_query($data);                   // pass it to the IO script

$context = stream_context_create(['http'=> ['timeout' => $timeout]]);
$response =  file_get_contents("http://yourserver/io_script.php?$q", false, $context);

echo json_encode($data + ['data' => $response ?: 'no data']);