"Не удалось открыть сокет"

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

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

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

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

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

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

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

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

Возможно, вы захотите заглянуть в функцию set_error_handler PHP и настроить функцию, которая будет вызываться в случаях, когда 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 }