Запрос cURL / PHP Выполняет 50% времени

После всего поиска я не могу понять, почему запросы cURL, выданные удаленному хосту с поддержкой SSL, удаются только 50% времени в моем случае. Вот ситуация: у меня есть последовательность запросов cURL, все они выдаются на удаленный хост HTTPS, в рамках одного PHP-скрипта, который я запускаю с помощью PHP CLI. Иногда, когда я запускаю скрипт, запросы выполняются успешно, но по какой-то причине большую часть времени я запускаю его, я получаю следующую ошибку от cURL:

* About to connect() to www.virginia.edu port 443 (#0) * Trying 128.143.22.36... * connected * Connected to www.virginia.edu (128.143.22.36) port 443 (#0) * successfully set certificate verify locations: * CAfile: none CApath: /etc/ssl/certs * error:140943FC:SSL routines:SSL3_READ_BYTES:sslv3 alert bad record mac * Closing connection #0 

Если я попробую снова несколько раз, я получаю тот же результат, но потом, после нескольких попыток, запросы пройдут успешно. Запуск сценария после этого снова приводит к ошибке, и шаблон продолжается. Исследование ошибки «alert bad record mac» не помогло мне ничего полезного, и я не решаюсь обвинять его в проблеме SSL, поскольку сценарий по-прежнему запускается изредка.

Я на Ubuntu Server 10.04, с установленными php5 и php5-curl, а также с последней версией openssl. С точки зрения специальных опций cURL, CURLOPT_SSL_VERIFYPEER устанавливается в значение false, и для CURLOPT_TIMEOUT и CURLOPT_CONNECTTIMEOUT установлено значение 4 секунды. Дальнейшей иллюстрацией этой проблемы является тот факт, что такая же самая точная ситуация возникает на моей машине Mac OS X dev – запросы проходят через ~ 50% времени.

    Удаленный хост, возможно, не настоящий уникальный хост. Возможно, это какое-то решение для балансировки нагрузки с несколькими серверами, принимающими входящие запросы. Что заставляет меня думать, что это может быть «ошибка mac» в сообщении об ошибке. Это может означать, что MAC-адрес удаленного хоста был изменен, в то время как реакция SSL была все еще запущена. И это может объяснить, что иногда у вас нет проблем.

    Но, возможно, не 🙂 Проблемы с SSL довольно сложно найти.

    Я не понимаю вашего ответа на prefork MPM vs Worker MPM, если вы запускаете PHP в режиме cli, ваш MPA Apache не используется, вы даже не используете apache.

    Вам может понадобиться эта опция:

    CURLOPT_FORBID_REUSE

    Пройти по. Установите значение 1, чтобы следующая передача явно закрыла соединение по завершении. Как правило, libcurl сохраняет все соединения живыми, когда выполняется с одной передачей, если последует одно следующее, которое может повторно использовать их. Этот вариант следует использовать с осторожностью и только если вы понимаете, что он делает. Установите для 0, чтобы libcurl не открывал соединение для возможного последующего повторного использования (поведение по умолчанию).

    Вы пробовали? curl_setopt ($ handle, CURLOPT_SSLVERSION, 3);