У меня есть сценарий 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).
Единственный другой вариант - каким-то образом отслеживать эту строку на время ожидания (я не уверен, если это возможно) или каким-то образом передавать дескриптор сокета в другой процесс, который я могу запустить с помощьюметод контроля времени ожидания.
Кто-нибудь знает, как решить эту проблему?