2009-05-20 19 views
0

は私のスクリプトは基本的に細かい実行されますが、時にはそれは、関数fread関数呼び出しに応答を停止し、私は失敗の理由を見つけるように見えることはできません。popenのファイル操作

private function run_lengthy_job($command, $message) { 
    for($handle = popen($command, 'r'); !feof($handle); sleep(2)) { 
     printf("[%s]\t%s\n", time(), $message); 

     // log the operation 
     exec(sprintf('logger "%s"', 
      escapeshellarg(fread($handle, 1024)))); 
    } 

    pclose($handle); 
} 

大きなリポジトリをクローニングしながら、今では失敗しているため

hg clone -v --debug http://some.repository.com/hgwebdir.cgi/some_repo some_repo 

コマンド例。私がfreadsをfgetsに変えても同じ問題が残る。

私のPHP環境は、Ubuntu 8.04.2

EDIT上で実行

PHP 5.2.4-2ubuntu5.6 with Suhosin-Patch 0.9.6.2 (cli) (built: Apr 17 2009 14:29:38) 
Copyright (c) 1997-2007 The PHP Group 
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies 
    with Xdebug v2.0.3, Copyright (c) 2002-2007, by Derick Rethans 

についての簡単な情報は:代わりにpopenのは、proc_open、スクリプトが同じ場所で立ち往生してみました。 EDIT:$ハンドルへのアクセスがされているので、関数freadを呼び出すことはおそらくありながらstream_get_contentsでのfreadを交換し、それでも同じ場所で立ち往生...

答えて

0

私の現在のソリューション

private function run_lengthy_job($command, $message) { 
    printf("%s\t", $message); 

    for($handle = popen($command, 'r'), 
     stream_set_blocking($handle, FALSE), 
     stream_set_timeout($handle, 3); 
     !feof($handle); sleep(1)) { 

     echo '.'; 

     exec(sprintf('logger "%s"', 
      escapeshellarg(stream_get_contents($handle)))); 
    } 

    $exit_status = pclose($handle); 

    if(pcntl_wifexited($exit_status) 
     && pcntl_wexitstatus($exit_status) == 0) { 
     echo "done!\n"; 
    } else { 
     echo "failed!\n"; 
    } 
} 

長い待ち時間が発生しましたpopenが出力を書き込むのをブロックします。