stream_socket_enable_crypto();禁用stream_set_timeout

时间:2015-01-20 14:55:57

标签: php sockets ssl timeout blocking

我已经创建了一个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 。 现在我只想要一个阻止解决方案。 如果真的没有其他解决方案可以使用非阻塞,那么我当然想知道:)

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。 stream_select帮我解决了这个问题:

$buffer='';
$select=array('con1'=>$socket);
$timeout_sec=1;
if(stream_select($select, $null, $null, $timeout_sec)){
    $buffer = fread($socket, $size);
}