PHP 백그라운드 쉘 커맨드 실행시키기
PHPPHP 백그라운드 쉘 커맨드 실행시키기
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;
}
일반적으로 백그라운드 쉘을 이용하는 절차
일반적으로 이걸 처리하는 절차는 다음과 같습니다.
- 유저(=클라이언트) 는 ajax로 백그라운드 작업을 시작하는 php 페이지를 호출합니다.
- php 페이지는 아래의 run_shell 함수로 오래걸리는 작업을 시켜 놓고 바로 기다리라는 응답을 내 보냅니다.
- 클라이언트는 주기적으로 계속 ajax 호출을 해서 백그라운드가 작업이 끝났는지 체크합니다.
- ajax 호출을 받은 백그라운드 작업 체크 php 파일은 실제로 백그라운드 작업이 끝났으면 그 결과를 ajax에 반환합니다. 아직 안 끝났으면 당연히 false를 반환해서 일정 시간 후에 다시 ajax call 을 하도록 유도합니다.
'PHP' 카테고리의 다른 글
PHP 배열 요소 삭제하기 (0) | 2017.11.25 |
---|---|
PHP 다른 페이지 컨텐츠 가져오기 (0) | 2017.11.25 |
php 최대 요청 시간 늘리기 (0) | 2017.11.24 |
PHP 문자열이 특정 글자로 끝나는지 체크하는 함수 (0) | 2017.11.23 |
PHP 문자열이 특정 글자로 시작하는지 체크하는 함수 (0) | 2017.11.23 |