fread .. Забирает часть файла с удаленного хоста, НО не весь

igortik

Новичок
fread .. Забирает часть [результата работы скрипта] с удаленного хоста, НО не весь

В общем ..

Создал линкообменник меж своими сайтами, есть некий seo_kernel.php, который получает через GET параметры и отдает результат (выводи перечень ссылок в зависимости от параметров).

Результат этот я получаю при помощи fread (файл закрепляется за потоком через http://) .. Директива allow_url_fopen = on.

P.S. На сервере более 10 доменов, их скрипты подхватывают полученный результат и удачно выводят его.

Т.е. очевидно, что все происходит в локальном пространстве!

Теперь задача немного меняется .. я загружаю "скрипт-инициатор вывода моего контента" на удаленный хост (на другом сервере).

Он также успешно закрепляет файл seo_kernel.php за потоком, отдает ему переменные гетом, НО ... теперь и возникает проблема,
т.к. результат fread возвращается не полностью... когда как.. иногда пол страницы отдаст, иногда всю (если повезет)..
это очевидно, т.к. иногда на экране появится оборванный хтмл-тег и т.д....

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

Как попросить "скрипт-инициатор" немного подождать? :)

-~{}~ 20.06.09 22:05:

p.s. сразу говорю.. filesize не виновен, он вообще здесь не работает, значение устанавливаю по максимуму.

-~{}~ 20.06.09 22:20:
 

igortik

Новичок
не думаю...
мне надо не расширить временные лимиты работы скрипта или наоборот, а скорее дело в скорости работы функций.. это теоретически ...

скрипт на удаленном хосте выводит не всю информацию, которая должна быть в $content = fread($handle,'20000').. отдает лишь часть.. иногда больше, иногда меньше... очень редко полностью (F5 раза с 20 вернул полный результат).

Приведу часть кода "скрипта-инициатора":
PHP:
$handle = fopen($file,"r");
$content = fread($handle,'20000');
echo $content;

Так вот сам $file содержит в себе нечто 'http://site.com/file.php?id=x&host=x';
-~{}~ 20.06.09 23:03:

собственно, задача простейшая, но возникла проблема при обращении за контентом к удаленному серверу....
 

dimagolov

Новичок
igortik, тебе непонятно, что fread с удаленного сайта может занять значительное время и оно с одной стороны легко превысит time_limit, а с другой стороны (раз у тебя все же что-то выводится) может не содержать всего, что ты ожидаешь. видимо site.com именно это что-то частью и отдает. убедись в этом прописал в лог strlen($content)

-~{}~ 20.06.09 16:24:

хотя эта срань у тебя наверняка в цикле и таки не хватает времени
 

vovanium

Новичок
igortik
Проблема не в time_limit. Проблема в функционировании fread, она читает из буфера. При fopen, php делает запрос и начинает скачивать файл в буфер, поскольку файл находится на удаленном сервере и весь ответ сервера не успевает загрузиться в буфер до вызова fread (в этом можно убедиться сделав перед fread sleep на пару секунд), поэтому функция fread выдает то что есть в буфере, даже есть там меньше 20000 байт.

Поэтому нужно либо выполнять fread в цикле, либо использовать file_get_contents
 

igortik

Новичок
dimagolov
да, там действительно у меня 2 цикла в скрипте (seo_kernel.php, который на стороне сервера) и отвечает за формирование контента.

Я поочередно отключал и циклы и по мере отключения первого, наполовину обрабатывался второй. Если же включить первый, то до второго дело редко доходит ...

vovanium
я так и предполагал.
p.s. fread в каком именно цикле?
не совсем понял ...

-~{}~ 21.06.09 01:18:

vovanium
Да, действительно ...
с file_get_contents таких проблем нет!

Большое спасибо !
 
Сверху