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秒のディレイをかけているようなので、速度重視なところでは注意が必要です。

HOMMA Teppei

