我已经创建了一个 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 协商在此更改后工作,但我丢失了超时设置。
这是我的问题。 stream_socket_enable_crypto 之后的 stream_set_timeout 调用不起作用。
我有一个日志条目
echo "AFTER PROCESS MESSAGE QUEUE\n";
$buffer = fread($sock, 4096);
echo "AFTER SOCKET READ\n";
消息 AFTER PROCESS MESSAGE QUEUE 已打印,但 AFTER SOCKET READ 未打印出来,无论我等待多长时间都没有关系。
有人知道如何将流读取超时设置回 1000 微秒吗?
供您引用: 目前不需要需要我应该将 stream_set_blocking 设置为 false 的解决方案。 现在我只想要一个阻塞解决方案。 如果真的没有其他使用非阻塞的解决方案,那么我当然想知道:)
最佳答案
我遇到了同样的问题。 stream_select
帮我解决了问题:
$buffer='';
$select=array('con1'=>$socket);
$timeout_sec=1;
if(stream_select($select, $null, $null, $timeout_sec)){
$buffer = fread($socket, $size);
}
关于php - stream_socket_enable_crypto();禁用 stream_set_timeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28048428/