gpt4 book ai didi

php - PHP stream_socket_enable_crypto无限期挂起。无论如何要解决?

转载 作者:行者123 更新时间:2023-12-03 11:53:43 26 4
gpt4 key购买 nike

我有一个PHP脚本,可用于将电子邮件发送到我的一个站点中的新闻稿列表。

该脚本使用STARTTLS进行加密连接,并使用以下行建立SSL握手:

stream_set_timeout($s, 35, 0);                                  
if(false == stream_socket_enable_crypto($s, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)){
$msg = "452 failed on tls connection";
} else {
$in_tls = true;
}

套接字$ s设置为阻塞,并在发出STARTTLS命令后已连接到远程服务器,并准备在此阶段开始TLS握手。如您所见,握手前我正在使用stream_set_timeout。根据PHP文档,它应该在X秒钟后中止握手,但似乎并不影响握手。

现在,这段代码大部分时间都可以运行,但是有时我会遇到TLS握手无限期阻塞的服务器,从而导致脚本挂起。

我曾尝试研究非阻塞解决方案,但是它们都不适用于我的PHP版本(我使用v5.1.6)。

唯一的其他选择是以某种方式监视此行的超时(我不确定是否可行),或以某种方式将套接字句柄转移到可以使用超时控制方法运行的另一个进程。

有人知道如何解决这个问题吗?

最佳答案

您可以尝试在流上设置超时,有关stream_set_timeout($s)的信息,请参见php manual

When the stream times out, the 'timed_out' key of the array returned by stream_get_meta_data() is set to TRUE, although no error/warning is generated.



也可以在PHP手册上找到

In case anyone is puzzled, stream_set_timeout DOES NOT work for sockets created with socket_create or socket_accept. Use socket_set_option instead.


Instead of:
<?php
stream_set_timeout($socket,$sec,$usec);
?>

Use:
<?php
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec'=>$sec, 'usec'=>$usec));
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec'=>$sec, 'usec'=>$usec));
?>

更新:这使OP能够解决问题 ini_set('default_socket_timeout', 1);

关于php - PHP stream_socket_enable_crypto无限期挂起。无论如何要解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53981590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com