Работает ли сайт? [ fsockopen ]

Discussion in 'PHP' started by N2kroot, 27 Aug 2010.

  1. N2kroot

    N2kroot New Member

    Joined:
    25 Oct 2009
    Messages:
    75
    Likes Received:
    3
    Reputations:
    0
    Возникла необходимость проверить сайт - включен ли он ?

    Проблемы :

    1. Сайтов много, а у меня рейтинг : выводится 50 штук на страницу.
    Т.е. если я пишу так :
    PHP:
    $try_access fsockopen($row['S_ip'], $row['S_port'], &$errno, &$errstr1);
    то на каждый сайт отводится 1 секунда. Итого : 50 секунд ожидания 0_o.

    2. Как скрыть ошибки этой функции? Достаточно ли просто @fsockopen, чтобы сайт не перекошивало и не писало лишний текст аля нельзя подключиться?
     
  2. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Сделать функции проверки сайтов в отдельном файле и запускать его по cron. Ошибки видеть никто не будет, задержка 50 сек тоже волновать никого не будет.
     
  3. N2kroot

    N2kroot New Member

    Joined:
    25 Oct 2009
    Messages:
    75
    Likes Received:
    3
    Reputations:
    0
    Т.е. записывать информацию в БД?
    Вот пользователь зашёл и видит список : а в нём должно быть отражено - включен сайт или нет.
     
  4. Failure

    Failure Elder - Старейшина

    Joined:
    21 Sep 2008
    Messages:
    179
    Likes Received:
    46
    Reputations:
    16
    PHP:
    <?php
    $sites 
    array_map('parse_url'file("файл_с_урлами.txt"));
    /** пример что должно быть в файле:
     * http://google.ru:80
     * http://fuck.ru:666
     */
    $result "";
    foreach(
    $sites as $url
        
    $result .= @fsockopen($url['host'], $url['port'], $errno$errstr1) ? $url['host']." доступен\n" $url['host']." не доступен\n"
    file_put_contents('result.txt'$result);
    ?>
    это на крон, как писали выше
    на странице где надо список просто
    PHP:
    <?php
    echo file_get_contents('result.txt');
    ?>
     
    1 person likes this.
  5. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    По cron запускать скажем раз в 10 минут скрипт, который будет обновлять информацию в БД. А основной сайт просто будет выводить оттуда ее.
    Пример привели выше.
     
    1 person likes this.
  6. N2kroot

    N2kroot New Member

    Joined:
    25 Oct 2009
    Messages:
    75
    Likes Received:
    3
    Reputations:
    0
    Спасибо большое, а можно примерчик под MySQL ?
    Мне всегда говорили, что файлы для аудитории менее 100 человек, у меня намного больше.
     
  7. Failure

    Failure Elder - Старейшина

    Joined:
    21 Sep 2008
    Messages:
    179
    Likes Received:
    46
    Reputations:
    16
    =\ проблема самому переделать под бд?
    PHP:
    <?php
    /**
        mysql> describe `sites`;
        +--------+--------------+------+-----+---------+----------------+
        | Field  | Type         | Null | Key | Default | Extra          |
        +--------+--------------+------+-----+---------+----------------+
        | id     | int(3)       | NO   | PRI | NULL    | auto_increment | 
        | url    | varchar(256) | YES  |     | NULL    |                | 
        | status | int(1)       | YES  |     | 0       |                | 
        +--------+--------------+------+-----+---------+----------------+
        3 rows in set (0.00 sec)
    */
    mysql_connect(localhostrootpass);
    mysql_select_db(site);
    $result mysql_query("SELECT * FROM `sites`");
    while(
    $row mysql_fetch_assoc($result))
        
    $sites[] = $row['url'];
        
    $sites array_map('parse_url'$sites);

    foreach(
    $sites as $key=>$url) {
        
    $status = @fsockopen($url['host'], $url['port'], $errno$errstr1) ? 0;
        
    mysql_query("UPDATE `sites` SET `status`='{$status}' WHERE `id`='{$key}'");
    }
    ?>
    это на крон, на страничке выводить так:
    PHP:
    <?php
    //mysql_connect
    $result mysql_query("SELECT * FROM `sites`");
    while(
    $row mysql_fetch_assoc($result)) {
        
    $row['url'] = parse_url($row['url']);
        echo 
    $row['status'] ? $row['url']['host']." доступен\n" $row['url']['host']." не доступен";
    }
    ?>
    Выглядит так:
    Code:
    mysql> SELECT * FROM `sites`;
    +----+-----------------------+--------+
    | id | url                   | status |
    +----+-----------------------+--------+
    |  0 | http://google.ru:80   |      1 | 
    |  1 | http://antichat.ru:80 |      1 | 
    |  2 | https://rdot.org:443  |      1 | 
    |  3 | http://ya.ru:80       |      1 | 
    |  4 | http://fuck.you:22    |      0 | 
    +----+-----------------------+--------+
    
     
    #7 Failure, 27 Aug 2010
    Last edited: 27 Aug 2010
    1 person likes this.
  8. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,174
    Likes Received:
    1,157
    Reputations:
    202
    Еще вариант попросить написать на Перле многопоточный, время ожидания значительно сократиться, до 5-8 секунд, и стата будет в рил-тайме.
     
    1 person likes this.