我已经创建了一个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-Negotation工作,但我丢失了超时设置。
这是我的问题。 stream_socket_enable_crypto 后的 stream_set_timeout 调用不起作用。
我有一个日志条目
echo "AFTER PROCESS MESSAGE QUEUE\n";
$buffer = fread($sock, 4096);
echo "AFTER SOCKET READ\n";
打印消息处理消息队列但 AFTER SOCKET READ 未打印出来,无论我等待多长时间。
有没有人可以将流读取超时设置回1000微秒?
有关您的信息: 我应该将stream_set_blocking设置为false的解决方案当前是 NOT 。 现在我只想要一个阻止解决方案。 如果真的没有其他解决方案可以使用非阻塞,那么我当然想知道:)
答案 0 :(得分:1)
我遇到了同样的问题。 stream_select
帮我解决了这个问题:
$buffer='';
$select=array('con1'=>$socket);
$timeout_sec=1;
if(stream_select($select, $null, $null, $timeout_sec)){
$buffer = fread($socket, $size);
}