반응형
웹에서 사용자가 요청시 특정 프로세스를 백그라운드에서 돌려야하는 상황이 있다.
해결해야 되는건 2가지가 있었다.
첫번째로 사용자가 누르고 백그라운드에서 도는 동안 사용자는 페이지에서 다른 작업을 할 수 있어야한다.
두번째로 프로세스 실행시간이 길어 세션이 끊어지는 상황에서도 백그라운드에서 실행된 작업은 끊기지 않아야한다.
이 두 가지의 문제점으로 인해 처음 작업했던 코드이다.
php 의 코드이그나이터3를 사용했다.
// 사용자가 호출하는 함수
function test_start(){
$cmd = "php -f /www/index.php /phs/test_ing > /data/tmp/test_back.txt 2>&1 &";
exec($cmd, $output, $return_var);
print_r($cmd);
print_r($output);
print_r($return_var);
exit;
}
// 실제 백그라운드에서 돌아가는 함수
function test_ing(){
sleep("15");
$output_file = "/data/tmp/TEST111.txt";
$output_handle = fopen($output_file, 'w');
fwrite($output_handle, "TEST");
@fclose($output_handle);
exit;
}
ajax를 사용하여 test_start 를 호출하게 되면 &를 사용하여 명령을 백그라운드에서 실행하므로, test_start 함수는 즉시 종료되며, PHP CLI는 별도의 프로세스로 실행된다.
따라서 test_ing 함수가 실행되는 동안 웹 요청은 종료되고, 사용자에게 바로 리턴을 줄 수 있다.
여기서 체크해야될 부분이 하나 있는데 hook 을 사용한다면 test_ing 는 예외처리를 해줘야한다.
그리고 똑같은 기능을 하는 다른 방법도 있다고한다
리눅스의 nohup 명령어
이 명령어는 방금 내가 처리한 2가지의 함수를 거치는 방법과 동일하게 작동한다.
세션과의 연결이 종료되더라도 nohup 으로 돌린 프로세스는 데몬 형태로 실행되게 되어 종료되지 않고 계속 실행된다.
nohup php -f /www/index.php /phs/test_ing > /data/tmp/test_back.txt 2>&1 &
리눅스에서 실행하게 되는 경우 위의 명령어를 사용하면 될 것이다.
반응형
'리눅스' 카테고리의 다른 글
sh 활용 파일 비교 (0) | 2025.06.02 |
---|---|
리눅스 DB 백업 및 복원 (2) | 2025.04.09 |