|
|
|
| Получить содержимое удалённого файла за 3 секунды? Меня не интересует целостность содержимого. Только первые 10Kb (или меньше, если файл меньше).
Но вот хотелось бы время на соединение контролировать отдельно от времени чтения файла. Т.к. на время соединения я мог бы потратить 3 секунды, а на чтение 10Kb одной секунды хватит вполне. Я делаю так:
<?php
$fp = @fopen('http://'.$url, "r");
if($fp)
{
stream_set_timeout($fp, 3);
$tfile=fread($fp, 10240);
fclose ($fp);
$isfinished=(stristr($tfile,'</wml>') || stristr($tfile,'</html>'));
}
|
Но так контролируется только общее время. А часто бывает так, что для соединения требуется основное время. Содержимое добывается мгновенно. | |
|
|
|
|
|
|
|
для: OZ_
(11.09.2005 в 14:05)
| | Может можно через сокеты это сделать? Пожалуйста, помогите. | |
|
|
|
|
|
|
|
для: OZ_
(12.09.2005 в 11:42)
| | Хм... первый пост больше похож на утверждение, чем на вопрос... не очень понятно, что требуется сделать? | |
|
|
|
|
|
|
|
для: cheops
(12.09.2005 в 12:37)
| | Ну дык и поставь stream_set_timeout($fp, 3); перед fopen, и будешь соединение контролить, а потом и чтение отдельно, или что-то другое надо сделать?
Сорри, конечно set_time_limit а не stream_set_timeout. | |
|
|
|
|
|
|
|
для: cheops
(12.09.2005 в 12:37)
| | Нужно как-то проконтролировать время соединения. То есть после выполнения команды нужно точно знать, что соединение установлено, а потом начинать чтение содержимого файла, используя это соединение. Я не знаю, как провести соединение без чтения содержимого файла. Можно это сделать? | |
|
|
|
|
|
|
|
для: OZ_
(12.09.2005 в 16:39)
| | >Я не знаю, как провести соединение
>без чтения содержимого файла. Можно это сделать?
Т.е. существует удалённый файл или нет? | |
|
|
|
|
|
|
|
для: cheops
(12.09.2005 в 19:47)
| | Неизвестно. У меня есть url, надо получить содержимое. На соединение можно потратить только 3 секунды. На чтение файла - секунду. Это можно реализовать? | |
|
|
|
|
|
|
|
для: OZ_
(12.09.2005 в 23:01)
| | Ну это от каналов зависит и даже от времени суток... может на том конце модем... Вообще говоря можно вероятно, если и приложение и конечный документ расположены на быстрых серверах и между ними широкий канал. | |
|
|
|
|
|
|
|
для: cheops
(13.09.2005 в 01:18)
| | А скриптом это узнать можно? Если соединение больше 3 секунд - просто прекратить его и выйти. | |
|
|
|
|
|
|
|
для: OZ_
(13.09.2005 в 02:19)
| | Во время загрузки файла скриптом
<?php
function get_content()
{
// Формируем сегодняшнюю дату
$date = date("d/m/Y");
// Формируем ссылку
$link = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date";
// Загружаем HTML-страницу
$fd = fopen($link, "r");
$text="";
if (!$fd) echo "Запрашиваемая страница не найдена";
else
{
// Чтение содержимого файла в переменную $text
while (!feof ($fd)) $text .= fgets($fd, 4096);
}
// Закрыть открытый файловый дескриптор
fclose ($fd);
return $text;
}
?>
|
можно поставить в цикле проверку текущего времени выполнения скрипта, то это может не помочь, если связь плохая... | |
|
|
|
|
|
|
|
для: cheops
(12.09.2005 в 12:37)
| | XPraptor, set_time_limit контролирует время выполнения всего скрипта, а не соединения.
stream_set_timeout($fp, 3); перед fopen, - нельзя передать результат выполнения ($fp) функции до вызова этой функции ($fopen). | |
|
|
|
|
|
|
|
для: OZ_
(11.09.2005 в 14:05)
| | Может быть, кому-то это всё-таки понадобится.
Cheops, cпасибо, что всё-таки ответили.
Просьба к вам - научите людей брать файлы через сокеты - выложите этот скрипт как статью. На авторство не претендую, лишь бы народ не парился над этим так, как я.
Вот как это делается:
<?php
$in="header";
$data="";
$get_by=128;
$i=0;
$header_=array();
$bsize=0;
$body="";
$target="example.html";
$host="http://exapmle.com";
$fp = fsockopen($host, 80, $errno, $error, 3); // ЗДЕСЬ УКАЗАНО max.ВРЕМЯ ОТВЕТА- 3 секунды
if (!$fp)
{
print "Ошибка сокета: [$errno] $error\n";
continue;
}
fputs($fp, "GET /".$target." HTTP/1.0\r\nHost: ".$host."\r\n\r\n");
while(!feof($fp))
{
$data=fgets($fp,$get_by);
if ($in=="header")
{
$header_[$i]=trim($data);
if ($header_[$i]=="")
{
$in="body";
$get_by=1024;
$data="";
continue;
}
else
{
if ($i<2)
{
$uploadstatus=trim(strtoupper($header_[0]));
if (($uploadstatus!='HTTP/1.1 200 OK')&&($uploadstatus!='HTTP/1.0 200 OK'))
{
print " отменено по ответу сокета: ".$uploadstatus."\n";
break;
}
if (substr(strtolower($header_[$i]),0,15)=='content-length:') $size_=trim(substr($header_[$i],15))+0;
if ($size_>5242880)
{
print " отменено по ответу сокета: превышение допустимого размера.\n";
break;
}
if (substr(strtolower($header_[$i]),0,13)=='content-type:') $ext_=trim(substr($header_[$i],13));
}
}
$i++;
}
else
{
$body=$body.$data;
$bsize=$bsize+strlen($data);
if ($bsize_>5242880)
{
$body="";
print " превышение допустимого размера.\n";
break;
}
}
}
?>
|
в $header_ будут заголовки, в $body - тело файла. | |
|
|
|
|
|
|
|
для: OZ_
(17.10.2005 в 04:09)
| | Хм... мы подробно рассматриваем работу с сокетами в нашей третьей книге "PHP 5 на примерах", наверное стоит выложить статью или пример для работы с сокетами, так как метод GET ещё люди осиливают, а с POST начинаются проблемы. | |
|
|
|