[PHP] 백그라운드로 동시에 프로그램 실행
php 는 순차적으로 프로그램일 실행되기 때문에 여러 서버에 접속하여 결과를 받아오는 등의 프로세스에서 느린 서버 때문에 전체적인 프로그램 실행이 치제되는 경우가 발생한다. 이럴 때 AJAX와 같이 비동기 방식으로 프로그램을 실행하게 되면 동시에 여러 서버에 접속하여 결과를 가져오기 때문에 실행시간이 감소할 수 있다. 이를 위해 php의 exec()를 이용하는 간단한 테스트 코드를 아래와 같이 작성했다.
<?php
error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING );
// 백그라운드 실행
function backgroundExec($cmd) {
if (substr(php_uname(), 0, 7) == 'Windows'){
pclose(popen("start /B ". $cmd, "r"));
} else {
exec($cmd . " > /dev/null &");
}
}
$stime = preg_replace('#[^0-9]#', '', $argv[1]);
$sleepTimes = array(5, 17, 13, 9, 19);
exec('which php', $out);
$phpBinPath = $out[0];
if(strlen($stime) < 1) {
foreach($sleepTimes as $val) {
$cmd = $phpBinPath . ' ' . basename(__FILE__) . ' ' . $val;
backgroundExec($cmd);
}
} else {
$logFile = './sleepTimeLog';
sleep($stime);
// write log
$f = fopen($logFile, 'a+');
fwrite($f, 'Sleep Time : ' . $stime . PHP_EOL);
fclose($f);
}
exit(0);
위 코드를 backgroudExec.php 파일로 저장하고 shell 에서 실행하게 되면 아래와 같이 추가적인 PHP 프로세스가 생성된다.
실행 결과로 로그 파일에는 아래와 같이 기록된다.
Sleep Time : 5
Sleep Time : 9
Sleep Time : 13
Sleep Time : 17
Sleep Time : 19
위와 같은 기능을 처리하게 위해 공개된 doorman 등의 라이브러리를 사용할 수 있다.