2012-11-29 5 views
0

다음과 같은 exec() 명령에 & 기호가 끝에 있으므로 스크립트가 백그라운드에서 실행됩니다. 그러나 스크립트는 백그라운드에서 실행되고 있지 않습니다. 정확히 5.6 분 후에 브라우저에서 시간 초과되었습니다. 또한 브라우저를 닫으면 스크립트가 계속 실행되지 않습니다.PHP 실행 시간 초과

명령 줄을 통해 스크립트를 실행해도 시간이 초과되지 않습니다. 내 질문은 타임 아웃을 방지하는 방법입니다. 어떻게하면 브라우저에 의존하지 않도록 exec를 사용하여 백그라운드에서 스크립트를 실행합니까? 내가 뭘 잘못하고 무엇을 봐야하는지.

+0

에 http : // 유래합니다. com/questions/45953/php-execute-a-background-process –

+0

셸 명령을 "브라우저에서 시간 초과"할 수 있습니까? –

답변

3

exec() 함수는 실행 된 프로그램의 출력을 처리하므로 출력을 /dev/null (사용자가 쓰는 모든 데이터를 자동으로 잃어 버리는 가상 쓰기 가능 파일)로 리디렉션 할 것을 제안합니다.

는 실행 해보십시오 :

exec("/usr/local/bin/php -q /home/gooffers/somefile.php > /dev/null 2>&1 &"); 

참고 : 2>&1는 표준 출력 오류 출력을 리디렉션 및 > /dev/null은 가상 파일로 표준 출력을 리디렉션합니다.

여전히 어려움이 있다면 다른 스크립트 만 실행하는 스크립트를 만들 수 있습니다. exec()은 작업을 수행 할 때 프로세스를 따르지만 작업이 완료되면 해제합니다. 실행 된 스크립트가 다른 스크립트 만 실행하면 작업은 매우 빨라지고 exec도 같은 방식으로 해제됩니다.

구현을 살펴 보겠습니다. 포함하는 exec.php 만들기 :

<?php 

    if (count($argv) == 1) 
    { 
    die('You must give a script to exec...'); 
    } 
    array_shift($argv); 
    $cmd = '/usr/local/bin/php -q'; 
    foreach ($argv as $arg) 
    { 
    $cmd .= " " . escapeshellarg($arg); 
    } 
    exec("{$cmd} > /dev/null 2>&1 &"); 

?> 

지금, 다음 명령을 실행
exec("/usr/local/bin/php -q exec.php /home/gooffers/somefile.php > /dev/null 2>&1 &"); 

당신은 인자가있는 경우

, 당신은 그들도 제공 할 수 있습니다 :

exec("/usr/local/bin/php -q exec.php /home/gooffers/somefile.php x y z > /dev/null 2>&1 &"); 
0

대신 shell_exec()를 사용해야합니다 : 당신이 쉘 액세스 할 수있는 경우

말했다되고 그건
shell_exec("/usr/local/bin/php -q /home/gooffers/somefile.php &"); 

, 왜 cronjob에로 이것을 설치하지 마십시오? 왜 PHP 스크립트가 이와 같이 실행하도록 다른 스크립트를 호출하는지 잘 모르겠습니다.

+0

글쎄, Linux 환경에서'&'기호를 사용한다면'exec()'프로세스가 분리되지 않는 이유는 모르겠다. –

+0

나는 exec와 함께 변수를 전달하고있다. 그래서 나는 그것을 cron으로 호출 할 수 없다. – hedhud