我想将消息从基于PHP的Web前端传输到Linux服务器上的后端服务。
我正在用file_put_contents
发送消息。当后端服务侦听和读取使用mkfifo mypipe
创建的管道时,该接口可以正常工作。
但是,我想为后端服务失败的情况做好准备。在这种情况下,应该通知前端用户并提供其他选择。
当前,当后端未运行时,由于file_put_contents
被阻止,前端变得无响应。
我尝试了各种方法来解决问题。这包括尝试在fopen
之前使用stream_context_create
打开管道,并使用ini_set('default_socket_timeout', 10);
或
$context = stream_context_create(array('http'=>array(
'timeout' => 10
)
));
if(file_put_contents("mypipe",$data,FILE_APPEND | LOCK_EX,$context)==FALSE){
error_log("Could not write to pipe.");
}else{
echo "Sent message";
}
我也尝试了PHP函数is_writable("mypipe")
,但是,正如预期的那样,它与接收器是否正在侦听无关地表示是。
如何检查管道是否阻塞并避免前端无响应的情况。
答案 0 :(得分:1)
执行fopen
,stream_set_blocking
,fwrite
和fclose
,而不要使用file_put_contents
。当您这样做时,您将能够检测到它何时会阻塞,因为fwrite
只会返回它没有写任何东西而不是阻塞了。