proc_open и большие объемы данных

Hoot

Guest
proc_open и большие объемы данных

Из скрипта вызваю бинарник, который думает минут 10 и после этого на stdout вываливает текстовый файл ~5mb.

С бинарником работаю через proc_open. Проблема в том, что по каким-то причинам скрипт подвисает. Использовал stream_set_blocking, не помогло, тот же результат.
 

tony2001

TeaM PHPClub
никаких данных, кроме констатации факта проблемы.
остается только пожать плечами и сказать "а у меня все работает".
 

Hoot

Guest
Попробую объяснить подробней :)

В скрипте делаю следущее

PHP:
$descriptorspec=array( 
    0 => array( "pipe", "r" ), 
    1 => array( "pipe", "w" ),
    2 => array( "file", "/dev/null", "a" )  );

$process=proc_open( REPORT_KERNEL, $descriptorspec, $pipes );

set_time_limit( 1800 ); 

stream_set_blocking($pipes[0], FALSE);
fwrite( $pipes[0], $docid );
fclose( $pipes[0] );

stream_set_blocking($pipes[1], FALSE);
while( !feof( $pipes[1] ) ) 
  $reporter_answer.=fgets( $pipes[1], 1024 );
fclose( $pipes[1] );

$return_value=proc_close( $process );
REPORT_KERNEL - это бинарник который фрмирует текстовый документ (на это уходит при работе из командной строки ~7минут) и выдает его на stdout. Когда REPORT_KERNEL формируте небольшие документы ~100кб никаких проблем не возникает. Когда документ ~5мб, скрипт подвисает при считывании данных (в цикле). Браузер больше часа ждет ответ и не дождавшись выводит сообщение - "Невозможно отобразить страницу".

Я пробовал еще сделать так:
PHP:
$descriptorspec=array( 
    0 => array( "pipe", "r" ), 
    1 => array( "file", $tmpfname, "a" ),
    2 => array( "file", "/dev/null", "a" )  );
т.е. перенаправить вывод в файл, и потом считать его из файла. Как только данные оказывались в файле, скрипт тут же прекращал свою работу и в браузер нечего не передавалось.

PHP Version 4.3.3
Apache
SunOS asv 5.8 Generic_108529-23 i86pc
 

slach

Новичок
set_memory_limit
посмотри
5 метров твой бинарник
и еще непонятно сколько памяти отжирает сам скрипт...
 

Hoot

Guest
Попробовал. Не помогло.

Зато нашел, где возникают проблемы.

Если вывод бинарника идет через трубу, то скрипт подвисает в цикле while, причем ни одна итерация цикла так и не выполняется.

Если вывод перенаправлен в файл, скрипт прекращает свою работу на строчке proc_close.
PHP:
$descriptorspec=array( 
    0 => array( "pipe", "r" ), 
    1 => array( "file", $tmpfname, "a" ),
    2 => array( "file", "/dev/null", "a" ) );
        	         
$process=proc_open( REPORT_KERNEL, $descriptorspec, pipes );
  

fwrite( $pipes[0], $docid );
fclose( $pipes[0] );
  
journal_add( EVENT_ACTION, "Данные в ядро послали" );
  
$return_value=proc_close( $process );
  
journal_add( EVENT_ACTION, "Закрыли процесс" );
т.е. в журнал заносится строчка "Данные в ядро послали" а "Закрыли процесс" уже нет. При этом скрипт прекращает свою работу как раз в тот момент когда документ оказыается в файле.

-~{}~ 02.11.04 14:48:

Нашел в чем проблема. Проблема в браузерах. Ie например через 5 минут посылате повторный запрос и скрипт запускается снова, потом еще раз и так далее. Т.е. бинарник не успевает отработать :(
 

zigar_alex

Guest
Hoot
Будь внимателен!
Еще apache по умолчанию отводит на выполнение скрипта 5 минут, см. переменную (на память не припомню как называтся). имей в виду.

один раз долго бился с этим.
вообще такие скрипты лучше запускать через shell
 
Сверху