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

То, как я облегчаю, "Не могло открыть сокет" ошибка, которая происходит на моем сайте?

Я диагностировал это, это - КАПЧА (я использую reCAPTCHA). Это только отображает эту ошибку на двух страницах, где я использую reCAPTCHA.

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

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

5
задан Peter Mortensen 14 March 2013 в 19:21
поделиться

1 ответ

Может быть, у моего сервера проблемы с выполнением команды 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
}
9
ответ дан 14 December 2019 в 01:01
поделиться