За последние 24 часа нас посетили 91820 программистов и 5854 робота. Сейчас ищут 3114 программистов ...

Проблема с fsockopen

Тема в разделе "PHP для новичков", создана пользователем Gruts, 15 мар 2016.

  1. Gruts

    Gruts Новичок

    С нами с:
    7 ноя 2014
    Сообщения:
    19
    Симпатии:
    0
    Доброго времени суток вообщем у меня такая проблема, делаю мониторинг игровых серверов, получаю данные от сервера (кол. игроков, имя сервера и т.д) с помощью fsockopen через цикл while делает подключение к серверам которые добавлены в бд, вообщем все работает хорошо, но при добавлении нерабочего сервера.. начинает длительное время грузить страницу сайта, он ее загружает но в итоге показывает пустую информацию о не рабочем сервере вообщем как можно исправить? таймаут на подключение не работает... вообщем вот код подключения к серверу

    Проблема в долгой загрузке сайта, когда добавлен в список не рабочий сервер..
    И еще вопросик, как лучше быть чтобы прогружало сайт как можно быстрее с большим количеством серверов?

    Код fsockopen
    Код (PHP):
    1.                     <?php
    2.                                 do
    3. {      
    4. $ip = $row['ip'];  //ip-адрес игрового сервера
    5. $port = $row['port'];   //порт на игровом сервере для подключения
    6.  
    7.  
    8. $fp = fsockopen('udp://' . $ip, $port, 2);
    9.      stream_set_timeout($fp, 1, 0);
    10.      stream_set_blocking($fp, true);
    11.  
    12. if (!$fp) {
    13.  echo "Ошибка подключения: ";
    14. } else {
    15.  $packet = "SAMP";
    16.  $packet .= chr(strtok($ip, "."));
    17.  $packet .= chr(strtok("."));
    18.  $packet .= chr(strtok("."));
    19.  $packet .= chr(strtok("."));
    20.  $packet .= chr($port & 0xFF);
    21.  $packet .= chr($port >> 8 & 0xFF);
    22.  
    23.  fwrite($fp, $packet."i");
    24.  @fread($fp, 11);
    25.  @$is_passworded = ord(fread($fp, 1));
    26.  @$plr_count = ord(fread($fp, 2));
    27.  @$max_plrs = ord(fread($fp, 2));
    28.  @$strlen = ord(fread($fp, 4));
    29.  @$hostname = fread($fp, $strlen);
    30.  @$strlen = ord(fread($fp, 4));
    31.  @$gamemode = fread($fp, $strlen);
    32.  @$strlen = ord(fread($fp, 4));
    33.  @$mapname = fread($fp, $strlen);  
    34.  
    35.  
    36.  echo  '<div class="servers">
    37.                                 <div class="servers_info">
    38.                                         <div class="name_serv">'
    39.                                                  .$hostname.
    40.                                         '</div>
    41.                                         <div class="players_serv">'
    42.                                                 .$plr_count.'/'.$max_plrs.
    43.                                         '</div>
    44.                                         <div class="mode_serv">'
    45.                                                 .$gamemode.
    46.                                         '</div>
    47.                                 </div> 
    48.                         </div>
    49.                                                 <div class="play">
    50.                                 <div class="text_play">
    51.                                 PLAY!
    52.                                 </div> 
    53.                         </div> </br>';
    54.  
    55.  fclose($fp);
    56. }
    57.  
    58.          
    59. }
    60. while($row= mysqli_fetch_assoc($query))
    61. ?>
    Пример работы сайта с добавленным нерабочим сервером a0034544.xsph.ru ( не реклама)

    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, результаты array/object dump и т. д.
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.870
    Симпатии:
    955
    а не надо опрашивать серверы при генерации страницы. опрос надо по крону делать в фоне
     
  3. Gruts

    Gruts Новичок

    С нами с:
    7 ноя 2014
    Сообщения:
    19
    Симпатии:
    0
    Можно по подробнее??
    Этот термин я еще не слыхал) "фоне"

    Добавлено спустя 33 минуты 24 секунды:
    А если сделать так, херачим эту функцию fsockopen в крон задачу с интервалом запуска 10-15 сек, данные после каждого запуска перезаписываются в бд, а на гл. страничке мы тупо уже выводим данные с бд или это будет большая нагрузка на сервер если будет около 2-3к ип адресов? возможно будет большая часть не серверов "не отвечать на запрос" и будет долгая загрузка ...
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.870
    Симпатии:
    955
    ну вот как раз вариант сканировать в фоне, заносить в бд и потом показывать из нее - самый хороший. 2-3к адресов не проблема.
     
  5. Gruts

    Gruts Новичок

    С нами с:
    7 ноя 2014
    Сообщения:
    19
    Симпатии:
    0
    Спасибо за совет, сейчас буду пробовать)