Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: fopen с таймаутом
 
 автор: helpdes   (08.01.2006 в 00:20)
 
 

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

if($f=@fopen('http://bla-bla.nets','r')){ 
    $txt = ''; 
    while (!feof($f)){ 
        $txt .= fread($f, 8192); 
    } 
    fclose($f); 
    $p1=strpos($txt,"some text")+10; 
    $p2=strpos($txt,"some text 2")-10; 
    $kod2=substr($txt,$p1,$p2-$p1); 

Все работает, главное внимательно разгрызть страничку.
Суть:
Бывают моменты когда сервер в дауне и прочесть соответсвенно ничего не получается, и в этот момент выводятся сообщения ошибки PHP-машины, которые рвут весь дизайн и т.п. Вообщем неприятно, хотя стоит @ перед оператором.
Вопрос:
Как сделать таймаут, допустим 5 секунд и если сервер не отвечает вернуть 0.
Заранее благодарю!

   
 
 автор: cheops   (08.01.2006 в 01:02)   письмо автору
 
   для: helpdes   (08.01.2006 в 00:20)
 

Для загрузки страницы можно воспользоваться сокетами, установив время таймаута (последний параметр функции fsockopen()) равным 5 секундам. Подробнее о сокетах можно почитать в темах по ссылкам
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=5045
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=8337
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=8843

   
 
 автор: helpdes   (08.01.2006 в 01:10)
 
   для: cheops   (08.01.2006 в 01:02)
 

Мало что понятно в указаных Вамитемах....
Скажите, могу ли я спомощью fsockopen также прчоесть нужный мне кусочек на страничке ?

   
 
 автор: cheops   (08.01.2006 в 01:15)   письмо автору
 
   для: helpdes   (08.01.2006 в 01:10)
 

Да, причём тем же самым циклом while. Если у вас будут сложности - вы можете обращаться, я помогу вас настройкой скрипта под конкретный сайт.

   
 
 автор: helpdes   (08.01.2006 в 01:24)
635 байт
 
   для: cheops   (08.01.2006 в 01:15)
 

Вот файл в аттаче.
Качаем и смотрим, в нем указана информация о сервере и пр., но меня больше всего интересует кол-во игроков online, вот через fsockopen можно ли это выдрать ?

   
 
 автор: helpdes   (08.01.2006 в 01:26)
 
   для: helpdes   (08.01.2006 в 01:24)
 

И еще...Не в обиду, но на Вашем форуме можно очень даже бесплатно размещать и хостить свои странички:
http://www.softtime.ru/forum/files/11229-20060108012133.txt

   
 
 автор: cheops   (08.01.2006 в 01:51)   письмо автору
 
   для: helpdes   (08.01.2006 в 01:26)
 

Хм... интересно, почему придурошный Internet Explorer исполняет код txt-файла, в то время как любой нормальный браузер должен выдавать код...

   
 
 автор: cheops   (08.01.2006 в 01:53)   письмо автору
 
   для: helpdes   (08.01.2006 в 01:24)
 

Да выдрать это не сложно, а как выглядит адрес страницы с этой информации? Для использования в fsockopen() его нужно поделить на хост и путь с параметрами...

   
 
 автор: helpdes   (08.01.2006 в 02:00)
 
   для: cheops   (08.01.2006 в 01:53)
 

Дело в том, что сайт у меня в локальной сети, а адреес к нему таков:
games.mysite.net.ua/bnet/monitor.php

   
 
 автор: cheops   (08.01.2006 в 02:31)   письмо автору
 
   для: helpdes   (08.01.2006 в 02:00)
 

Тогда блок
<?php
if($f=@fopen('http://bla-bla.nets','r')){ 
    
$txt ''
    while (!
feof($f)){ 
        
$txt .= fread($f8192); 
    }
?>

следует заменить на
<?php
<?php 
  $fp 
fsockopen("games.mysite.net.ua"80$errno$errstr30); 
  if (!
$fp
  { 
    echo 
"$errstr ($errno)<br />\n"
  } else { 
    
$out "GET /bnet/monitor.php HTTP/1.1\r\n"
    
$out .= "Host: games.mysite.net.ua\r\n"
    
$out .= "Connection: Close\r\n\r\n"

    
fwrite($fp$out); 
    
$txt ''
    while (!
feof($fp)) { 
        
$txt .= fgets($fp8192); 
    } 
    
fclose($fp); 
?>


http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=600

   
 
 автор: helpdes   (08.01.2006 в 02:48)
 
   для: helpdes   (08.01.2006 в 00:20)
 

Вот код, модифицировал при Вашй помощи так сказать.
Все работает, за что очень Вам благодарен, но есть одно НО.
Выставил таймаут как видите 1 секунду, а скрипт думает гараздо дольше, около 15-20.
В чем может быть подвох?

<?php 
$fp 
fsockopen("gamer.mysite.net.ua"80$errno$errstr1); 
  if (!
$fp
  { 
$kod2 "0"
} else { 
    
$out "GET /pvpgn-stats/index.php HTTP/1.1\r\n"
    
$out .= "Host: games.mysite.net.ua\r\n"
    
$out .= "Connection: Close\r\n\r\n"
    
fwrite($fp$out); 
    
$txt '';
    while (!
feof($fp)) { 
        
$txt .= fgets($fp8192); 
    } 
    
$p1=strpos($txt,"Онлайн : <b>")+12
    
$p2=strpos($txt,"Чат каналов")-15
    
$kod2=substr($txt,$p1,$p2-$p1); 
    
fclose($fp);
}
echo 
$kod2;
?> 

Что ему не хватает ? :думает:

   
 
 автор: cheops   (08.01.2006 в 02:53)   письмо автору
 
   для: helpdes   (08.01.2006 в 02:48)
 

Вообще сокеты достаточно медленная вещь, попробуйте строку
<?php
    $out 
"GET /pvpgn-stats/index.php HTTP/1.1\r\n";
?>

заменить на
<?php
    $out 
"GET /pvpgn-stats/index.php HTTP/1.0\r\n";
?>

   
 
 автор: helpdes   (08.01.2006 в 02:57)
 
   для: cheops   (08.01.2006 в 02:53)
 

Вычитал в указаных Вами ссылках и заменил на 1.0.
Никакого положительного результата.

   
 
 автор: Artem S.   (08.01.2006 в 03:04)   письмо автору
 
   для: helpdes   (08.01.2006 в 02:57)
 

это глюки библиотеки php под win. Из-за этого я перешел на "другие" сокеты (socket_create())

   
 
 автор: cheops   (08.01.2006 в 03:13)   письмо автору
 
   для: Artem S.   (08.01.2006 в 03:04)
 

Об них, кстати, можно почитать в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=600.

   
 
 автор: helpdes   (08.01.2006 в 03:29)
 
   для: cheops   (08.01.2006 в 03:13)
 

Верно... Проблема была в win-сервере.
Поставил на Freebsd и все ок .
Всем спасибо за ночную дискусию, очень приятно, что есть такие люди.
До встречи с новой проблемой ;)

   
 
 автор: Artem S.   (08.01.2006 в 03:28)   письмо автору
 
   для: helpdes   (08.01.2006 в 02:48)
 

Попробуйте так:
<?php
/*
Получение станицы методом GET */
function getData($host$path$proxy false$proxyport 80$get true$maxsize false)
{
    
$buffer true;
    if (empty(
$path)) $path='/';
    if ( !
$proxy ) {
         
$proxy $host;
         
$out  "GET $path HTTP/1.0\r\n";
         
$out .= "Host: $host\r\n";
     } else {
         
$out  "GET http://$host$path HTTP/1.0\r\n";
         
$out .= "Host: $host\r\n";
     }
     
$fp = @fsockopen("tcp://".$proxy$proxyport$errno$errstr5);
     if (!
$fp) {
         return 
false;
     } else {
         
$out .= "Referer: $host$path\r\n";
         
$out .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n";
         
$out .= "Connection: close\r\n";
         
$out .= "\r\n";
         
fwrite($fp$out);
         
stream_set_blocking($fpFALSE);
         
stream_set_timeout($fp5);
         if(
$get)
         {
             
$status stream_get_meta_data($fp);
             while (!
feof($fp) && !$status['timed_out'])
             {
                 
$buffer .= fgets($fp128);
                 if(
$maxsize) {
                     if( 
strlen($buffer) > $maxsize ) break;
                 }
                 
$status stream_get_meta_data($fp);
             }
         }
         
fclose($fp);
     }
     return 
$buffer;
}
echo 
getData("gamer.mysite.net.ua""/pvpgn-stats/index.php")
?>

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования