[php] 명령이 완료 될 때까지 기다리지 않고 shell_exec를 사용하는 방법이 있습니까?

백그라운드에서 실행하고 싶은 프로세스 집약적 인 작업이 있습니다.

사용자가 페이지를 클릭하면 PHP 스크립트가 실행되고 마지막으로 필요한 경우 일부 조건에 따라 쉘 스크립트 EG를 실행해야합니다.

shell_exec('php measurePerformance.php 47 844 email@yahoo.com');

현재 내가 사용 shell_exec , 하지만 출력을 기다리려면 스크립트가 필요합니다. 완료 때까지 기다리지 않고 원하는 명령을 실행할 수있는 방법이 있습니까?



답변

추가하는 것은 어떻습니까.

"> /dev/null 2>/dev/null &"

shell_exec('php measurePerformance.php 47 844 email@yahoo.com > /dev/null 2>/dev/null &');

이것은 또한 stdio 및 stderr를 제거합니다.


답변

이렇게하면 명령이 실행되고 실행중인 프로세스에서 연결이 끊어집니다. 물론 원하는 모든 명령이 될 수 있습니다. 그러나 테스트를 위해 sleep (20) 명령으로 PHP 파일을 만들 수 있습니다.

exec("nohup /usr/bin/php -f sleep.php > /dev/null 2>&1 &");


답변

또한 출력을 즉시 클라이언트에 다시 제공하고 나중에 PHP 코드를 계속 처리 할 수 ​​있습니다.

이것은 클라이언트 측에 영향을 미치지 않는 Ajax 호출을 오랫동안 기다리는 데 사용하는 방법입니다.

ob_end_clean();
ignore_user_abort();
ob_start();
header("Connection: close");
echo json_encode($out);
header("Content-Length: " . ob_get_length());
ob_end_flush();
flush();
// execute your command here. client will not wait for response, it already has one above.

자세한 설명은 http://oytun.co/response-now-process-later 에서 찾을 수 있습니다.


답변

Windows 2003에서 기다리지 않고 다른 스크립트를 호출하기 위해 다음을 사용했습니다.

$commandString = "start /b c:\\php\\php.EXE C:\\Inetpub\\wwwroot\\mysite.com\\phpforktest.php --passmsg=$testmsg";
pclose(popen($commandString, 'r'));

이것은 변경 권한을 부여한 후에 만 ​​작동합니다 cmd.exe-읽기 및 실행을 추가하십시오 IUSR_YOURMACHINE(쓰기도 거부로 설정했습니다).


답변

물론 windows다음을 사용할 수 있습니다.

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:/path/to/php-win.exe -f C:/path/to/script.php", 0, false);

노트 :

당신이 얻을 경우 COM오류를, 당신에 확장자를 추가 php.ini하고 다시 시작 apache:

[COM_DOT_NET]
extension=php_com_dotnet.dll


답변

PHP의 popen명령을 사용하십시오 . 예 :

pclose(popen("start c:\wamp\bin\php.exe c:\wamp\www\script.php","r"));

그러면 자식 프로세스가 생성되고 스크립트는 출력을 기다리지 않고 백그라운드에서 실행됩니다.


답변

웹 페이지에서 벗어난 경우 일종의 신호를 생성하고 (아마도 디렉토리에 파일을 드롭) cron 작업이 수행해야 할 작업을 선택하도록하는 것이 좋습니다. 그렇지 않으면, 우리는 사용의 영토에 들어갈 가능성이 pcntl_fork()exec()아파치 프로세스 내부에서, 그리고 그건 그냥 나쁜 모조입니다.