Запрос cURL / PHP выполняется 50% времени - PullRequest
6 голосов
/ 21 декабря 2010

После полного поиска я не могу понять, почему запросы 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 - запросы выполняются только ~ 50% времени.

Ответы [ 3 ]

3 голосов
/ 22 декабря 2010

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

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

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

1 голос
/ 22 декабря 2010

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

CURLOPT_FORBID_REUSE

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

0 голосов
/ 22 января 2014

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

...