symfonyのproject:deployがやたらと遅い
最近symfony1.4.9を使っていてproject:deployコマンドがやたら遅くて、rsyncってこんな遅かったかな?と思ったらsfFileSystem::execute()が、出力バッファを読み込む度に0.1秒sleepしている。
lib/task/sfFilesystem.class.php <?php public function execute($cmd, $stdoutCallback = null, $stderrCallback = null) { $this->logSection('exec ', $cmd); $descriptorspec = array( 1 => array('pipe', 'w'), // stdout 2 => array('pipe', 'w'), // stderr ); $process = proc_open($cmd, $descriptorspec, $pipes); if (!is_resource($process)) { throw new RuntimeException('Unable to execute the command.'); } stream_set_blocking($pipes[1], false); stream_set_blocking($pipes[2], false); $output = ''; $err = ''; while (!feof($pipes[1]) || !feof($pipes[2])) { foreach ($pipes as $key => $pipe) { if (!$line = fread($pipe, 128)) { continue; } if (1 == $key) { // stdout $output .= $line; if ($stdoutCallback) { call_user_func($stdoutCallback, $line); } } else { // stderr $err .= $line; if ($stderrCallback) { call_user_func($stderrCallback, $line); } } } usleep(100000); } fclose($pipes[1]); fclose($pipes[2]); if (($return = proc_close($process)) > 0) { throw new RuntimeException('Problem executing command.', $return); } return array($output, $err); }
元々は、sleep(0.1)となっていたが、実際sleepは効いていなかったバグがあり、
ミリ秒ならusleepでしょ、という修正が入ったときに遅くなった模様。
deploy遅すぎるよ!とreopenしてpatchが添付されているが、特に対応されていない。
- http://forum.symfony-project.org/viewtopic.php?f=22&t=30457
- http://trac.symfony-project.org/ticket/8877
取り敢えず添付のpatchを適用すると速度改善されました。直前のfreadで読込めた場合はusleepしなくなります。deployのような出力が多いものだと結構変わりますね。