fsockopen () не работает на определенном веб-хостинге?

#php #apache #cpanel #fsockopen #connection-timeout

#php #apache #cpanel #fsockopen #время ожидания соединения

Вопрос:

Один из наших клиентов сказал, что у них есть очень простой скрипт, который использует fsockopen (), чтобы определить, подключен сервер к сети или нет. Они сказали, что до недавнего времени это нормально работало на их веб-сайте через нас, но недавно просто перестало работать, поэтому я предполагаю, что это настройка.

Моей первой мыслью было, что он использует его как TCP и использует IP / порт для игрового сервера, однако мы с ним оба подтвердили, что скрипт отлично работает на разных других веб-хостингах.

В чем может быть проблема, в частности, на нашем?

Работает: http://crazygfl.xfactorservers.com/query.php?ip=www.xfactorservers.comamp;port=80

Работает: http://crazygfl-stats.com/query.php?ip=109.73.163.231amp;port=27015

Не работает: http://crazygfl.xfactorservers.com/query.php?ip=109.73.163.231amp;port=27015

Вот код…

 <?php

    $timeout = (isset($_GET['timeout']) ? ($_GET['timeout'] <= 0 ? 30 : ((int)$_GET['timeout'])) : 30);

    if(empty($_GET['ip'])amp;amp;empty($_GET['port'])){
        echo 'No IP/Port specified.';
    }else{
        if(fsockopen($_GET['ip'], $_GET['port'], $errno, $errstr, $timeout) === false){
            echo 'offline';
        }else{
            echo 'online';
        }
    }
  

Комментарии:

1. вы уверены, что функция fsockopen не отключена?

2. может быть, умный и сообразительный человек заблокировал запросы от хоста, который не работает (при условии, что он находится на другом IP), от других. это объясняет непоследовательное поведение

3. Что вы подразумеваете под «работает» / «не работает» Возвращает ли это сообщение, но не ожидаемое? Это не дает никаких выходных данных? Истекает ли время ожидания?

Ответ №1:

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

Кстати, использовать данные непосредственно из пользовательского ввода ($ _GET, $ _POST и т.д.) Без какой-либо проверки — КРАЙНЕ плохая идея!

Комментарии:

1. На самом деле МЫ являемся хостом. Однако веб-хостинг — это всего лишь дополнительная услуга, которую мы предлагаем нашим клиентам бесплатно в качестве дополнительного стимула. К сожалению, наш веб-мастер не очень хорошо говорит по-английски, поэтому будет лучше, если я просто обращусь к нему с решением, а не буду пытаться разобраться с ним. Поскольку скрипт работает с другими портами нашего хостинга, я склоняюсь к последнему. Должен ли порт, который не работает, быть специально отключен брандмауэром?

2. @Brett Powell: Да, похоже, существуют (более или менее) конкретные правила, которые запрещают скрипт на crazy—.—-torservers.com при подключении к игровому серверу. Если вы введете адрес веб-сервера и порт (например, ip = www.heise.de amp; port = 80), он будет работать нормально. Возможно, брандмауэр разрешает только некоторые стандартные порты (http, ftp, ssh, …) или только порты ниже 1024 или что-то в этом роде.

Ответ №2:

Все три хоста, которые вы указали выше, находятся на одном компьютере или они на разных машинах? Возможно, конфигурации между ними не согласованы. Проверьте, включен ли ‘fsockopen’:

  <?php
 if(function_exists('fsockopen')) {
      echo "fsockopen function is enabled";
 }
 else {
      echo "fsockopen is not enabled";
 }
 ?>
  

Если он включен, проверьте, не блокируют ли правила брандмауэра хост, который не прошел успешно.

В противном случае перенесите ваш скрипт на реализацию на основе cURL: http://ch.php.net/curl и посмотрим, поможет ли это решить проблему.

Комментарии:

1. Отлично, спасибо. Разве что-то подобное не должно работать для подхода libcurl? pastie.org/2829896 Он показывает, что все еще отображается в автономном режиме с использованием порта игрового сервера, поэтому я собираюсь продолжить и проверить компьютер, хотя я думаю, что брандмауэр отключен AFAIK.