php - stream_socket_enable_crypto();禁用 stream_set_timeout

标签 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 协商在此更改后工作,但我丢失了超时设置。

这是我的问题。 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/

相关文章:

java - 在 Java 中验证 SSL 证书的通用名称

asp.net - 你如何检查当前页面是否在 ASP.Net 中使用 SSL?

php - 删除 ckeditor 输出上的 <br> 标记

php - PDO_OCI - 进入 clob 字段

perl - 设置 Net::LDAP 连接超时

java - 是否可以使用 Unix 套接字在 C 应用程序和 Java 应用程序之间创建通信?

ssl - 受信任的 GPG 证书

ios - SSL 握手仅在 IOS 上失败

javascript - 使 Magento 1.9 产品过滤器可折叠

php - 无法使用 PHP INSERT INTO 数据库,没有抛出错误