|
автор: 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.
Заранее благодарю! | |
|
|
|
|
|
|
|
для: 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 также прчоесть нужный мне кусочек на страничке ? | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: helpdes
(08.01.2006 в 01:26)
| | Хм... интересно, почему придурошный Internet Explorer исполняет код txt-файла, в то время как любой нормальный браузер должен выдавать код... | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: helpdes
(08.01.2006 в 02:00)
| | Тогда блок
<?php
if($f=@fopen('http://bla-bla.nets','r')){
$txt = '';
while (!feof($f)){
$txt .= fread($f, 8192);
}
?>
|
следует заменить на
<?php
<?php
$fp = fsockopen("games.mysite.net.ua", 80, $errno, $errstr, 30);
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($fp, 8192);
}
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, $errstr, 1);
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($fp, 8192);
}
$p1=strpos($txt,"Онлайн : <b>")+12;
$p2=strpos($txt,"Чат каналов")-15;
$kod2=substr($txt,$p1,$p2-$p1);
fclose($fp);
}
echo $kod2;
?>
|
Что ему не хватает ? :думает: | |
|
|
|
|
|
|
|
для: 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.
Никакого положительного результата. | |
|
|
|
|
|
|
|
для: helpdes
(08.01.2006 в 02:57)
| | это глюки библиотеки php под win. Из-за этого я перешел на "другие" сокеты (socket_create()) | |
|
|
|
|
|
автор: helpdes (08.01.2006 в 03:29) |
|
|
для: cheops
(08.01.2006 в 03:13)
| | Верно... Проблема была в win-сервере.
Поставил на Freebsd и все ок .
Всем спасибо за ночную дискусию, очень приятно, что есть такие люди.
До встречи с новой проблемой ;) | |
|
|
|
|
|
|
|
для: 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, $errstr, 5);
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($fp, FALSE);
stream_set_timeout($fp, 5);
if($get)
{
$status = stream_get_meta_data($fp);
while (!feof($fp) && !$status['timed_out'])
{
$buffer .= fgets($fp, 128);
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")
?>
|
| |
|
|
|