2012-03-29 2 views
2

내 프로젝트는 if-else 조건으로 실행되는 3 개의 PHP 스크립트를 요구합니다. 첫 번째 스크립트는 사이트의 색인 페이지에로드되어 조건이 설정되어 있는지 확인하고, 조건이 충족되면 두 번째 스크립트를 호출합니다. 두 번째 스크립트는 다른 조건이 설정되어 있는지 확인하고 모든 것이 좋으면 마지막 스크립트를 호출합니다.php shell_exec() 백그라운드에서 스크립트를 실행하는 데 도움이 필요합니다.

이제는 if 문에 스크립트를 포함 시켜서이 작업을 수행 할 수 있지만 최종 결과는 MySQL 덤프 호깅 리소스이므로 원래 트리거 페이지와 독립적으로 실행해야합니다.

또한 이러한 스크립트는 인덱스 페이지의 사용자 작업에 관계없이 트리거 된 후에도 계속 수행해야합니다.

마지막으로 한 가지 : win과 nix에서 실행할 수 있어야합니다.

어떻게 하시겠습니까?

다음 코드가 의미가 있습니까?

if ($blah != $blah-size){ 
shell_exec ('php first-script.php > /dev/null 2>/dev/null &'); 
} 
//If the size matches, die 
else { 
} 

미리 감사드립니다.

업데이트 : 누군가 다른 사람이 동일한 거래를하고있는 경우를 대비해서. 스크립트를 cgi로 실행할 때 PHP에서 버그가있는 것 같지만 Apache의 명령 줄은 테스트 한 모든 버전에서 작동합니다.

exec("php-cli mybigfile.php > /dev/null 2>/dev/null &"); 

또는 당신은 쉘로 호출 할 수 있습니다

그래서 대신 내가 스크립트를 다음과 같이 호출 버그에게 https://bugs.php.net/bug.php?id=11430

를 참조하십시오. 그것은 nix 시스템에서 작동하지만 내 로컬 윈도우는 희망이 없으므로 누구나 윈도우에서 실행하면 작동합니다. 내가 생각할 수있는

+0

cron/windows scheduler가 실행하는 다른 스크립트 작성자 – zerkms

+0

작성 요점은 cron을 사용하지 않고 사용자를 트리거하는 것이 었습니다.:) – Chris81

답변

1

가장 쉬운 방법은 ("화면이 -m PHP는 장기 실행-이 script.php -d")

간부를 할 수 있다는 것입니다;

그런 다음 즉시 돌아와 백그라운드에서 실행됩니다. 화면으로 연결하여 무슨 일이 일어나는지 볼 수 있습니다.

'nohup php long-running-script.php'로 작업하거나 daemonize()를 수행 한 다음 간단한 스크립트를 실행하여 간단한 C 프로그램을 작성하여 작업을 수행 할 수도 있습니다.

+0

아래를 참조하십시오. – Chris81

+0

exec (" screen -d -m php myfile.php "); 내 코드가 작동하지 않습니다. 브라우저에서 각 스크립트를 직접 실행하면 수행해야하는 작업을 수행하지만 모두 함께 연결되지는 않습니다. nohub의 경우 exec ('nohup php myfile.php >/dev/null &'); ? 감사합니다 죄송합니다 코드가 엉망이되고 있었기 때문에 내 질문에 대답했다. – Chris81

+0

nohup을위한 "연결"이라는 말의 의미를 얻지 못했습니다. 네, 적절한 방법입니다. (대부분 "이 응용 프로그램을 실행하고 터미널이 없어 졌다고 말하지 마십시오. HUP 신호)) '화면'이 작동하지 않는 경우 - 컴퓨터에 설치되지 않았을 수 있습니다. –

4

한 번에 이러한 리소스 호깅 프로세스가 얼마나 많은지를 제어 할 수 없기 때문에 쉘 exec에서는이 작업을 수행하지 않습니다. 따라서 사용자는 클릭 - 클릭 - 클릭으로 본질적으로 기계를 정지시킬 수 있습니다.

대신 작업 대기열을 만듭니다. 덤프를 직접 실행하는 대신 스크립트는 일종의 FIFO 대기열 (어딘가에있는 데이터베이스 테이블이나 텍스트 파일 일 수 있음)에 레코드를 제출 한 다음 즉시 반환합니다. 다음으로 정기적 인 간격으로 실행되는 cron 스크립트를 가지고 대기열을 점검하여 수행 할 작업이 있는지 확인하십시오. 그렇다면 가장 오래된 것을 고르고 실행합니다. 이렇게하면 한 번에 하나의 덤프 만 실행한다는 것을 확신 할 수 있습니다.

+0

안녕하세요 알렉스, 시간 간격, 데이터베이스의 크기 및 몇 가지 것들을 확인하기 위해 데이터베이스 테이블을 확인하기 위해 스크립트가 regimented. 조건이 주어진다면 이미 사용자가 동일한 작업을 시작할 수있는 방법은 없습니다 . 성명이 충족되지 않으면 else 문이 데이터베이스 연결을 종료합니다 .Cron 작업은 cron 탭을 설정하지 않고 모든 설정에서 실행되도록 설정되어 있으므로 문제가되지 않습니다. 다시 한 번 감사드립니다. – Chris81