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

Форум PHP

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

 

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

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

тема: get_file_contents за 3 секунды
 
 автор: OZ_   (11.09.2005 в 14:05)   письмо автору
 
 

Получить содержимое удалённого файла за 3 секунды? Меня не интересует целостность содержимого. Только первые 10Kb (или меньше, если файл меньше).
Но вот хотелось бы время на соединение контролировать отдельно от времени чтения файла. Т.к. на время соединения я мог бы потратить 3 секунды, а на чтение 10Kb одной секунды хватит вполне. Я делаю так:

<?php
      $fp 
= @fopen('http://'.$url"r");
      if(
$fp)
      {
        
stream_set_timeout($fp3);
        
$tfile=fread($fp10240);
        
fclose ($fp);
        
$isfinished=(stristr($tfile,'</wml>') || stristr($tfile,'</html>'));
      }

Но так контролируется только общее время. А часто бывает так, что для соединения требуется основное время. Содержимое добывается мгновенно.

   
 
 автор: OZ_   (12.09.2005 в 11:42)   письмо автору
 
   для: OZ_   (11.09.2005 в 14:05)
 

Может можно через сокеты это сделать? Пожалуйста, помогите.

   
 
 автор: cheops   (12.09.2005 в 12:37)   письмо автору
 
   для: OZ_   (12.09.2005 в 11:42)
 

Хм... первый пост больше похож на утверждение, чем на вопрос... не очень понятно, что требуется сделать?

   
 
 автор: XPraptor   (12.09.2005 в 14:00)   письмо автору
 
   для: cheops   (12.09.2005 в 12:37)
 

Ну дык и поставь stream_set_timeout($fp, 3); перед fopen, и будешь соединение контролить, а потом и чтение отдельно, или что-то другое надо сделать?

Сорри, конечно set_time_limit а не stream_set_timeout.

   
 
 автор: OZ_   (12.09.2005 в 16:39)   письмо автору
 
   для: cheops   (12.09.2005 в 12:37)
 

Нужно как-то проконтролировать время соединения. То есть после выполнения команды нужно точно знать, что соединение установлено, а потом начинать чтение содержимого файла, используя это соединение. Я не знаю, как провести соединение без чтения содержимого файла. Можно это сделать?

   
 
 автор: cheops   (12.09.2005 в 19:47)   письмо автору
 
   для: OZ_   (12.09.2005 в 16:39)
 

>Я не знаю, как провести соединение
>без чтения содержимого файла. Можно это сделать?
Т.е. существует удалённый файл или нет?

   
 
 автор: OZ_   (12.09.2005 в 23:01)   письмо автору
 
   для: cheops   (12.09.2005 в 19:47)
 

Неизвестно. У меня есть url, надо получить содержимое. На соединение можно потратить только 3 секунды. На чтение файла - секунду. Это можно реализовать?

   
 
 автор: cheops   (13.09.2005 в 01:18)   письмо автору
 
   для: OZ_   (12.09.2005 в 23:01)
 

Ну это от каналов зависит и даже от времени суток... может на том конце модем... Вообще говоря можно вероятно, если и приложение и конечный документ расположены на быстрых серверах и между ними широкий канал.

   
 
 автор: OZ_   (13.09.2005 в 02:19)   письмо автору
 
   для: cheops   (13.09.2005 в 01:18)
 

А скриптом это узнать можно? Если соединение больше 3 секунд - просто прекратить его и выйти.

   
 
 автор: cheops   (13.09.2005 в 13:04)   письмо автору
 
   для: 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($fd4096); 
    } 
    
// Закрыть открытый файловый дескриптор 
    
fclose ($fd); 
    return 
$text
  } 
?>

можно поставить в цикле проверку текущего времени выполнения скрипта, то это может не помочь, если связь плохая...

   
 
 автор: OZ_   (12.09.2005 в 16:41)   письмо автору
 
   для: cheops   (12.09.2005 в 12:37)
 

XPraptor, set_time_limit контролирует время выполнения всего скрипта, а не соединения.
stream_set_timeout($fp, 3); перед fopen, - нельзя передать результат выполнения ($fp) функции до вызова этой функции ($fopen).

   
 
 автор: OZ_   (17.10.2005 в 04:09)   письмо автору
 
   для: 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($host80$errno$error3); // ЗДЕСЬ УКАЗАНО 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 - тело файла.

   
 
 автор: cheops   (17.10.2005 в 12:28)   письмо автору
 
   для: OZ_   (17.10.2005 в 04:09)
 

Хм... мы подробно рассматриваем работу с сокетами в нашей третьей книге "PHP 5 на примерах", наверное стоит выложить статью или пример для работы с сокетами, так как метод GET ещё люди осиливают, а с POST начинаются проблемы.

   
Rambler's Top100
вверх

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