То, как я облегчаю, "Не могло открыть сокет" ошибка, которая происходит на моем сайте?
Я диагностировал это, это - КАПЧА (я использую reCAPTCHA). Это только отображает эту ошибку на двух страницах, где я использую reCAPTCHA.
Я генерировал новые наборы ключей, и иногда это работает, и иногда это не делает. Например, это работало над Safari и иногда не, но над Firefox, и наоборот, и это работало на меня а не на одного из моих партнеров и наоборот.
Как я могу решить эту проблему? Могло случиться так, что мой сервер испытывает затруднения при выполнении команды fsocketopen? Если так, как я фиксирую это?
Может быть, у моего сервера проблемы с выполнением команды 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
}