Symfony 1.4でシェルのプログラムを呼び出すときに、PHPのexec関数に代わる便利なメソッドがあったのでメモ。
sfFilesystem::execute()がそれです。
symfony API » sfFilesystem Class | symfony | Web PHP Framework
内部的にはproc_openで
戻り値は、標準出力と標準エラー出力が分離されて配列で返ってきます。
タスクから、呼び出すとこんな感じになります。
protected $outputBuffer = ''; protected function execute($arguments = array(), $options = array()) { // initialize the database connection $databaseManager = new sfDatabaseManager($this->configuration); $connection = $databaseManager->getDatabase($options['connection'] ? $options['connection'] : null)->getConnection(); // 処理待ちリストから一行取得 $process = Doctrine::getTable('Processes')->findOneByStatus('WAIT'); $command = $process['command']; // バッファクリア $this->outputBuffer = ''; try { // 実行。第二引数は標準出力、第三引数は標準エラー出力を受け取るコールバック関数 list($output, $err) = $this->getFilesystem()->execute($command, array($this, 'setBuffer'), array($this, 'setBuffer')); $process['status'] = 'SUCCESS'; $process['message'] = $output; $process->save(); } catch (RuntimeException $e) { // コマンドが実行できなかった場合と、終了時エラーの場合はRuntimeExceptionがthrowされる $process['status'] = 'FAILED'; // エラー時はexecuteの戻り値を取得できないのでコールバックの結果からメッセージを取得 $process['message'] = $this->outputBuffer; // 必要なら$e->getCode();でエラーコード取得できます $process->save(); } } public function setBuffer($output) { $this->outputBuffer .= $output; }
/vendor/pear/php/symfony/task/project/sfProjectDeployTask.class.phpがサンプルとして使えます。
もちろん、PHPのexec関数を使って
exec($command, $output = array(), $return_var = 0);
とかしてもいいと思います。
多分プラグインのインストール段階でmakeとかするときに使うんじゃないですかね。
標準出力を段階的に画面に表示できるので。
ただし、出力バッファの読み取り単位ごとに、0.1秒のディレイをかけているようなので、速度重視なところでは注意が必要です。