Проблема с чтением файла, или нужна задержка?

  • Автор темы Illusive
  • Дата начала

Illusive

Guest
Проблема с чтением файла, или нужна задержка?

Добрый день.
Есть орокловый репорт-сервер, которому отправляются запросы, после чего читаются выходные файлы. Делается это примерно так.
PHP:
 $query="Строка с каким-то корректно работающим запросом";
 $fname="результирующий файл";

  $handle_query=fopen($query,"r");//отправляется запрос серверу. он его обрабатывает, 
выкидывает результат в определенный файл.
   fclose($handle_query);

for ($l=0;$l<20;$l++)
  {sleep(1);
    flush();
  }
   $handle_res=fopen($fname,"r");//открываю результирующий файл, вывожу
   $contents = fread($handle_res, 600000);
   fclose($handle_res);
   mb_convert_encoding($contents,"CP1251");
echo "<html><META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=windows-1251\"><body><pre>".$contents."</pre></body></html>";
  }
?>
В результате на экране видится только часть выходного файла. ТАкое ощущение, что он либо не весь читается (хотя размеры файлов не более 300 кил), либо его хватает раньше, чем он успевает полностью сформироваться.
Проверяю файл выходной - он нормальный, длинный. Все данные в нем есть.
Куда копать?..
 

P.Anton

Новичок
Может по таймауту скрипт обрубается. попробуй set_time_limit()
 

Illusive

Guest
Автор оригинала: chisto_tolyan
$contents = fread($handle_res, 600000);
и зачем ждать 20 секунд с флушем?
Чтобы не поймать файл, прежде чем он будет создан.
Там сервер отчетов какое-то время работает - пока отпарвит запрос к БД, пока получит ответ, пока сформирует отчет..
Можно меньше 20 сек - я смотрел, что отчет раньше формируется.

-~{}~ 03.08.05 18:38:

Автор оригинала: P.Anton
Может по таймауту скрипт обрубается. попробуй set_time_limit()
Пробовал в цикле выводить сообщения - идут.
Увеличение таймаута не помогает.. :rolleyes:
Там не в прекращении работы скрипта дело.
 

chisto_tolyan

Враг народа
ну так читай не $contents = fread($handle_res, 600000);, а$contents = fread($handle_res, filesize($handle_res));
 

Illusive

Guest
Автор оригинала: chisto_tolyan
ну так читай не $contents = fread($handle_res, 600000);, а$contents = fread($handle_res, filesize($handle_res));
Вот чего пишут про filesize.
Замечание: Эта функция не применима для работы с удаленными файлами, поскольку файл должен быть доступен через файловую систему сервера.

У меня скрипт работает на одной машине, которая доступан по вэбу извне, а все остальное крутится на другой.. Там только через http достучаться

-~{}~ 03.08.05 19:02:

Еще немного уточню.
Я проверяю факт создания выходного файла. До того, как в скрипте в фикле выведутся все контрольные сообщения, файл создается. Ну, я вижу, что фата файла изменилась, вижу, что содержимое корректное, потом смотрю страничку - там все еще кричат :"Осталось 3 секунды!, Осталось 2 секнды!." И т.д.
Т.е. скрипт как бы еще не дошел до места, где результирующий файл открывается. Правильно?
Потом мне показывают только кусочек того, что было надо..

-~{}~ 04.08.05 13:29:

Нашел решение. Был какой-то глюк непонятный. можно было другим путем пойти.
вот это
PHP:
    $handle_res=fopen($fname,"r"); 
   $contents = fread($handle_res, 600000); 
   fclose($handle_res); 
   mb_convert_encoding($contents,"CP1251"); 
echo "<html><META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=windows-1251\"><body><pre>".$contents."</pre></body></html>";
заменить на
PHP:
   $contents = file($fname);  
   mb_convert_encoding($contents,"CP1251"); 
echo "<html><META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=windows-1251\"><body><pre>".implode("",$contents)."</pre></body></html>";
Вот так работает корректно.
 
Сверху