복붙노트

PHP 백그라운드 쉘 커맨드 실행시키기

PHP

PHP 백그라운드 쉘 커맨드 실행시키기


PHP에서는 request time limit 이라는 게 있어서, 서버가 request를 받고 나서 특정 시간 내에 응답하지 않으면 request time limit이 걸려서 결과가 제대로 출력되지 않죠.


물론 request time out은 늘릴 수 있습니다만, 사용자는 결과가 너무 오래동안 안나오는 것에 답답해 할 것입니다.


게다가 PHP는 쓰레드라는 개념도 없어서 request를 실행하는 쓰레드와 백그라운드 쓰레드를 구분할 수도 없죠.


이럴때를 대비해서 리눅스의 쉘을 백그라운드로 작동시켜 봅시다.


아래 함수는 리눅스에서만 작동합니다.


또한 웹 호스팅 등에서는 작동하지 않을 가능성이 높으니 반드시 테스트하시고 사용하세요.


혹시 쉘 커맨드가 실행된다고 해도, 리눅스의 PHP는 아파치 유저의 권한만 가지고 실행되므로 root 의 명령어는 실행되지 않을 가능성이 높다는 점도 참고해 주세요.

PHP 백그라운드 쉘 커맨드 실행시키기

function run_shell($cmd, $outputfile, $pidfile){  
exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile));  
}  

// 사용하기  
$outputfile = "ls_output.txt";  
$pidfile = "ls_pid_file.txt";  

run_shell("ls -alh", $outputfile, $pidfile);  

// $outputfile 에는 $cmd (ls-alh)의 결과과 써집니다.  
// $pidfile 에는 리눅스의 PID 가 쓰여집니다.  

PHP 백그라운드 쉘 커맨드 실행중인지 체크해 보기

function isRunning($pid){  
try{  
$result = shell_exec(sprintf("ps %d", $pid));  
if( count(preg_split("/\n/", $result)) > 2){  
return true;  
}  
}catch(Exception $e){}  

return false;  
}  

일반적으로 백그라운드 쉘을 이용하는 절차

일반적으로 이걸 처리하는 절차는 다음과 같습니다.

  1. 유저(=클라이언트) 는 ajax로 백그라운드 작업을 시작하는 php 페이지를 호출합니다.
  2. php 페이지는 아래의 run_shell 함수로 오래걸리는 작업을 시켜 놓고 바로 기다리라는 응답을 내 보냅니다.
  3. 클라이언트는 주기적으로 계속 ajax 호출을 해서 백그라운드가 작업이 끝났는지 체크합니다.
  4. ajax 호출을 받은 백그라운드 작업 체크 php 파일은 실제로 백그라운드 작업이 끝났으면 그 결과를 ajax에 반환합니다. 아직 안 끝났으면 당연히 false를 반환해서 일정 시간 후에 다시 ajax call 을 하도록 유도합니다.