"Не удалось открыть сокет" - PullRequest
5 голосов
/ 13 июля 2010

Как мне устранить ошибку «Не удалось открыть сокет», которая происходит на моем сайте?

У меня есть проблема с CAPTCHA (я использую reCAPTCHA).Эта ошибка отображается только на двух страницах, где я использую reCAPTCHA.

Я генерирую новые наборы ключей, и иногда это работает, а иногда нет.Например, он работал на Safari и иногда нет, но на Firefox и наоборот, и работал для меня, а не для одного из моих партнеров и наоборот.

Как я могу решить эту проблему?Может ли быть так, что мой сервер испытывает проблемы с выполнением команды fsocketopen?Если так, как я могу это исправить?

1 Ответ

9 голосов
/ 13 июля 2010

Может быть, мой сервер испытывает проблемы с выполнением команды fsocketopen?

Точно - хотя это не обязательно означает, что что-то не так с вашим сервером. Это просто означает, что где-то между вашим сервером и сервером recaptcha существует проблема сетевого взаимодействия, которая препятствует открытию сокетного соединения.

Это может быть много вещей. Это может быть проблема конфигурации вашего кода или вашего сервера (особенно, если на вашем сервере есть какой-то динамический аспект конфигурации), это может быть проблема с уровнем подключения вашего сервера, это может быть сетевая конфигурация проблема, где размещен ваш сервер, это может быть проблема конфигурации сети в любом месте между вашим сервером и сервером recaptcha, это может быть проблема пропускной способности, где они размещены, это может быть проблема конфигурации на их стороне. Возможно, вы захотите использовать дополнительные аргументы сообщения об ошибках для fsockopen, чтобы посмотреть, сможете ли вы получить какие-либо сообщения, которые имеют смысл. Вы также можете попробовать свои настройки как минимум на 2-3 разных серверах в совершенно разных сетях - это также может дать вам несколько конкретное представление о том, где проблема.

Другой вопрос, однако, заключается в том, как вы собираетесь управлять такими вещами в целом. fsockopen просто иногда не удается установить соединение, потому что даже в наилучшей конфигурации сетевой среды нет гарантии связи. Аппаратные сбои, случаются аварии, у сетевых администраторов бывают неприятные моменты, удаленные серверы запутываются, глобальная термоядерная война может вывести из строя центр обработки данных - вы просто никогда не узнаете Таким образом, вы должны написать свой код (и управлять настройками), чтобы у вас были запасные случаи, когда происходит сбой, и отображались сообщения об ошибках, приемлемые для конечного пользователя.

Возможно, вы захотите заглянуть в PHP-функцию set_error_handler и настроить функцию, которая будет вызываться в случаях, когда fsockopen завершается ошибкой. В некоторых ситуациях я стал использовать его для вызова исключений, что-то вроде этого:

function throw_error_exception($number = 0, $str = '',$file = null,$line = null) {
   throw new ErrorException($str, 0, $number, $file, $line);
}

set_error_handler('throw_error_exception',E_ALL);

С этой настройкой вы можете управлять fsockopen соединениями примерно так:

try {
   fsockopen('remote.host.com',8080,$fso_errnum,$fso_errstr,30);
} catch(Exception $e) {
   // here you can look at properties/methods of $e, and $fso_* values, and 
   // figure out what nice error messages you want to display for your users
}
...