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

Php 当脚本因阻塞io而超时时,如何生成自定义响应? 目标,php,iis,io,serial-port,blocking,Php,Iis,Io,Serial Port,Blocking,我正在开发一个JSON端点,当用户向其发送GET请求时,它基本上会将数据从服务器端COM端口读入一个文件(在服务器端)。来自服务器的响应必须是格式正确的JSON响应,其中包含内容转储到的文件名。如果COM端口的响应时间过长,则该文件将被关闭,并且对于从COM端口读取的任何内容,该文件仍然被视为有效。仍然提供了有效的响应 问题 当COM端口不再提供数据时,它会阻塞,直到脚本超时。这会导致错误,IIS会在json端点上提供一个通用错误页面。这不是有效的json,但它也不包含com数据转储到的文件名

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

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

细节
  • 我必须使用PHP Direct IO扩展与串行com端口接口
  • 这是阻塞IO,在windows上不支持异步IO(据我所知)
  • register_shutdown_函数不保证在客户端的连接仍然打开时执行它,因此我无法使用它打印有效的响应

对于JSON端点,您可以创建一个调用IO脚本的包装器脚本。为尝试获取响应设置一个超时,然后返回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']);

什么决定了文件的名称?PHP脚本创建了它,还是它已经存在?文件名是在服务器端生成的。Php脚本创建新文件。嗯,我可以让客户选择。不过,一定有办法解决阻塞io的问题。嗯,谢谢。这似乎有点挑剔,但似乎是最好的路线。我认为最好的选择是使用一个本地脚本来执行IO并使用shell_exec执行(可以设置超时时间),然后将超时设置为小于使用set_time_limit设置的超时。这样,只要支持设置时间限制,我就不会对服务器配置做太多的抗争。是的,我同意这样听起来更好。我的回答是,我知道基于您已经在做的事情,您肯定能够使用这些东西,因为不是每个人都启用了shell_exec。但总体思路大致相同。