2012-08-12 3 views
0

백그라운드에서 실행되는 PHP로 서비스를 실행하고 싶습니다. PHP에서 exec() 함수를 사용하여 시도했지만 서비스가 무한 루프로 실행되고 있으며 컨트롤이 PHP 파일로 돌아 오지 않습니다. 나는 인터넷을 통해 더 많은 검색을했지만 해결책을 찾을 수 없습니다. 이 일을 성취하기 위해 나에게 약간의 아이디어 나 참고를주십시오.PHP에서 별도의 프로세스를 실행하는 방법

echo"hello"; 
exec("raintree.frm"); 
echo"hello1"; 

raintree.frm 내가 실행하고자하는 서비스입니다 -이 :

이 내가하고 싶은 것을 참조 코드입니다. 여기서 PHP 스크립트는 브라우저에서 "hello"를 인쇄하지만, 제어가 exec() 함수에서 멈추기 때문에 "hello1"에 오지 않습니다.

+2

즉,'raintree.frm'이 그 일을하고 있음을 의미합니다. –

+3

http://php.net/manual/en/function.exec.php 참조 : "[exec]로 프로그램을 시작한 경우 프로그램이 백그라운드에서 계속 실행 되려면 프로그램의 출력을 리디렉션해야합니다 파일이나 다른 출력 스트림으로 보내야합니다. 그렇게하지 않으면 프로그램 실행이 끝날 때까지 PHP가 중단됩니다. " – irrelephant

+0

일부 코드는 http://www.php.net/manual/en/function.exec.php#101506 및 http://www.php.net/manual/en/function.exec.php#107456 – irrelephant

답변

3

서비스가 제목과 같이 별도의 프로세스로 실행되도록하려면 새 프로세스를 만든 다음 서비스를 실행해야합니다. PHP에서는 pcntl_fork()으로 새 프로세스를 만들고 하위 프로세스에서 서비스를 시작할 수 있습니다. 더 설명 매뉴얼 (pcntl_fork()에 위의 링크)를 읽을뿐만 아니라 주제 (또는 오히려 콜)에 대한 몇 가지 C/유닉스 자습서 봐 fork()exec()은이

echo "hello"; 
$pid = pcntl_fork(); 
switch($pid){ 
    case -1: // pcntl_fork() failed 
     die('could not fork'); 
    case 0: // you're in the new (child) process 
     exec("raintree.frm"); 
     // controll goes further down ONLY if exec() fails 
     echo 'exec() failed'; 
    default: // you're in the main (parent) process in which the script is running 
     echo "hello1"; 
} 

비슷 해요.

+2

을 참조하십시오. 위의,'pcntl_fork'의 간단한 예제는 PHP 매뉴얼을 가져올 필요가 없기 때문에 유용하다고 생각했습니다. 감사! – Jimbo

-1

exec() 함수는 외부에서 실행 된 명령의 출력을 받기 위해 대기 중입니다.

당신은 다른 곳에서 출력을 리디렉션 할 수 있습니다, 이런 일이 발생을 방지하기위한 방법은 다음과 같습니다

<?php 

echo 'hello1'; 
exec('raintree.frm > /dev/null &'); 
echo 'hello2'; 

이 예제의 출력 "hello1hello2을"raintree.frm > /dev/null &가 완료 될 때까지 기다리지 않고.

(이것은 유닉스 계열의 운영체제에서만 가능합니다)

관련 문제