如何检查FIFO管道在PHP中是否可写

时间:2018-10-06 12:02:48

标签: php pipe

我想将消息从基于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"),但是,正如预期的那样,它与接收器是否正在侦听无关地表示是。

如何检查管道是否阻塞并避免前端无响应的情况。

1 个答案:

答案 0 :(得分:1)

执行fopenstream_set_blockingfwritefclose,而不要使用file_put_contents。当您这样做时,您将能够检测到它何时会阻塞,因为fwrite只会返回它没有写任何东西而不是阻塞了。