我创建了一个xmpp服务器,首先使用了非tls,它可以按照我的要求正常工作,没有任何错误。漏洞身份验证有效,我可以毫无问题地聊天。
在我开始从插座上阅读之前,我做了:
stream_set_timeout($sock, 0, 1000);
这将使我能够在服务器没有新数据的时间内完成任务。
现在我实现了starttls。我做了
stream_socket_enable_crypto($sock, true, STREAM_CRYPTO_METHOD_TLS_SERVER);
它为我协商tls。这不起作用,因为发生了读取超时,tls协商失败。
我将上面的stream_socket_enable_crypto更改为
stream_set_timeout($sock, 30, 0);
stream_socket_enable_crypto($sock, true, STREAM_CRYPTO_METHOD_TLS_SERVER);
stream_set_timeout($sock, 0, 1000);
将超时设置得更高一点,这样客户端就有30秒的时间接受证书(如果是自签名的(并完成所有的tls操作。完成后,我真的需要将超时时间设置回1000微秒。TLS Negotiation在更改后工作,但我丢失了超时设置。
这是我的问题。stream_socket_enable_crypto之后的stream_set_timeout调用不起作用。
我有一个日志条目
echo "AFTER PROCESS MESSAGE QUEUEn";
$buffer = fread($sock, 4096);
echo "AFTER SOCKET READn";
将打印消息AFTER PROCESS message QUEUE,但不会打印出AFTER SOCKET READ并且无论我等待多长时间。
有人知道我如何将流读取超时设置回1000微秒吗?
供您参考:当前需要将stream_set_blocking设置为false的解决方案NOT。现在我只想要一个阻塞解决方案。如果真的没有其他解决方案来使用非阻塞,那么我当然想知道:(
我也遇到了同样的问题。stream_select
帮我解决了问题:
$buffer='';
$select=array('con1'=>$socket);
$timeout_sec=1;
if(stream_select($select, $null, $null, $timeout_sec)){
$buffer = fread($socket, $size);
}