2012-07-17 3 views
-4

데이터베이스에서 작업 목록을 검색하고 데이터베이스 (기본적으로 프로세스 대기열)에서 찾은 내용을 기반으로 다른 PHP 스크립트를 시작하는 PHP 스크립트가 있습니다.PHP shell_exec 스크립트가 완료 될 때까지 기다리는 중입니까?

큐 러너 스크립트가 실행하는 스크립트 중 일부는 실행을 마치려면 30 초 정도 걸릴 수 있습니다 (비디오 변환, 이미지 크기 조정 등).

문제는 큐 러너 스크립트의 shell_exec()가 처리 스크립트를 호출하지만 완료 될 때까지 대기하지 않아 큐가 완료되지 않는 것입니다.

큐 러너 스크립트 :

#!/usr/bin/php 
<?php 
    // Loop through database and find jobs to be done 
    shell_exec("nohup $command > /dev/null 2> /dev/null & echo $! &"); 
?> 

명령 줄에서 직접 작업 스크립트를 실행 작동 및 PDF가 생성됩니다.

해결 방법에 대한 의견이 있으십니까? 또는 프로세스 큐를 실행하는 더 나은 방법은?

+0

** ** nohup ** 및 ** & **을 사용하는 이유는 무엇입니까? 포 그라운드에서 명령을 실행하십시오! – inVader

+0

답변에 대한 관심이 있습니까? – inVader

답변

3

shell_exec는 문제의 원인이 아닙니다. 기다리고 명령 출력을 반환합니다. 그러나 백그라운드에서 명령을 시작하고 nohup을 사용하면 안됩니다.

nohup을는 호출되지만 즉시 그 자식 프로세스를 시작으로 그 과정이 완료 될 때까지 immediatelly, 따라서 shell_exec 기다릴 것이다 종료됩니다 명령입니다. 백그라운드에서 명령을 실행하지 않으려면 &과 같이 입력해야합니다.

0

먼저 PHP에서 코드를 실행하지 말고 가능하면 PHP 래퍼와 라이브러리를 사용하는 것이 좋습니다.

내가보기에 하나의 문제는 처리가 동기식이라는 것입니다. 즉, 사용자가 진행중인 작업에 대해 아무런 단서도없이 서버가 응답 할 때까지 기다려야한다는 것을 의미합니다. 그는 제어하지 않고 서버의 부하를 증가시키는 페이지를 새로 고칠 수도 있습니다. 이것은 매우 심각한 문제입니다. 이렇게하면 DOS 공격이 가능합니다.

이러한 장기 실행 작업에는 AJAX가 좋습니다. 웹 페이지에서 진행 상황을 표시하고 완료되면 AJAX를 업데이트하거나 다른 페이지로 전환 할 수있는 항목을 표시 할 수 있습니다. 사용자는 자바 스크립트에서 해당 이벤트를 잡아 당겨 프로세스를 종료함으로써 페이지를 종료 할 수 있습니다.

+0

BTW, 당신은 명령의 반환 코드를 확인하지 않습니다. 그런 다음 사용자는 작업의 성공에 대한 단서가 없습니다. – tiktak

+0

shell_exec()가 호출 결과를 반환하기 때문에 어쨌든 리턴 값은 없습니다. 그러나 stderr를 포함한 모든 것이/dev/null로 이동합니다. 의도 한 사용자 상호 작용이 없다면 적어도 로그 파일로 이동해야합니다. – inVader

관련 문제