명령이 완료되기를 기다리지 않고 shell_exec을 사용할 수 있습니까?
PHP명령이 완료되기를 기다리지 않고 shell_exec을 사용할 수 있습니까?
백그라운드에서 실행하고 싶은 프로세스 집약적 인 작업이 있습니다.
사용자가 페이지를 클릭하면 PHP 스크립트가 실행되고 마지막으로 조건에 따라 필요한 경우 쉘 스크립트 인 E.G .:를 실행해야합니다.
shell_exec('php measurePerformance.php 47 844 email@yahoo.com');
현재 shell_exec을 사용하고 있지만, 스크립트가 출력을 기다려야합니다. 완료되기를 기다리지 않고 원하는 명령을 실행할 수있는 방법이 있습니까?
해결법
-
==============================
1.방법에 대해 추가하십시오.
방법에 대해 추가하십시오.
"> /dev/null 2>/dev/null &" shell_exec('php measurePerformance.php 47 844 email@yahoo.com > /dev/null 2>/dev/null &');
이것은 stdio와 stderr를 제거합니다.
-
==============================
2.이렇게하면 명령이 실행되고 실행중인 프로세스와의 연결이 끊어집니다. 물론 원하는 모든 명령이 가능합니다. 그러나 테스트를 위해 sleep (20) 명령을 사용하여 PHP 파일을 만들 수 있습니다.
이렇게하면 명령이 실행되고 실행중인 프로세스와의 연결이 끊어집니다. 물론 원하는 모든 명령이 가능합니다. 그러나 테스트를 위해 sleep (20) 명령을 사용하여 PHP 파일을 만들 수 있습니다.
exec("nohup /usr/bin/php -f sleep.php > /dev/null 2>&1 &");
-
==============================
3.또한 출력을 즉시 클라이언트에 제공하고 나중에 PHP 코드를 계속 처리 할 수 있습니다.
또한 출력을 즉시 클라이언트에 제공하고 나중에 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에서 확인할 수 있습니다.
-
==============================
4.Windows 2003에서는 기다리지 않고 다른 스크립트를 호출하기 위해 다음과 같이 사용했습니다.
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에 대한 읽기 및 실행을 추가합니다 (또한 쓰기를 거부로 설정).
-
==============================
5.PHP의 popen 명령을 사용하십시오 (예 :
PHP의 popen 명령을 사용하십시오 (예 :
pclose(popen("start c:\wamp\bin\php.exe c:\wamp\www\script.php","r"));
그러면 하위 프로세스가 생성되고 스크립트는 출력을 기다리지 않고 백그라운드에서 실행됩니다.
-
==============================
6.물론, 윈도우에서는 다음을 사용할 수 있습니다.
물론, 윈도우에서는 다음을 사용할 수 있습니다.
$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
-
==============================
7.그래도 작동 할 것이지만 백그라운드에서 실행될이 함수를 호출 할 때마다 새로운 프로세스를 만들 것이므로 서버에 과부하가 걸리지 않도록주의해야합니다. 동시에 하나의 동시 호출 만있는 경우이 해결 방법으로 작업을 수행 할 수 있습니다.
그래도 작동 할 것이지만 백그라운드에서 실행될이 함수를 호출 할 때마다 새로운 프로세스를 만들 것이므로 서버에 과부하가 걸리지 않도록주의해야합니다. 동시에 하나의 동시 호출 만있는 경우이 해결 방법으로 작업을 수행 할 수 있습니다.
그렇지 않다면 예를 들어 beanstalkd / gearman / amazon sqs와 같은 메시지 대기열을 실행하는 데 도움이됩니다.
-
==============================
8.웹 페이지가 아닌 경우, 어떤 종류의 신호 (디렉토리에 파일을 놓기 등)를 생성하고 cron 작업을 수행해야하는 작업을 선택하는 것이 좋습니다. 그렇지 않으면 아파치 프로세스 내부에서 pcntl_fork ()와 exec ()를 사용하는 영역에 들어갈 가능성이 높습니다.
웹 페이지가 아닌 경우, 어떤 종류의 신호 (디렉토리에 파일을 놓기 등)를 생성하고 cron 작업을 수행해야하는 작업을 선택하는 것이 좋습니다. 그렇지 않으면 아파치 프로세스 내부에서 pcntl_fork ()와 exec ()를 사용하는 영역에 들어갈 가능성이 높습니다.
-
==============================
9.shell_exec ()를 호출하는 페이지에 항상 AJAX를 게시 할 수 있습니다.
shell_exec ()를 호출하는 페이지에 항상 AJAX를 게시 할 수 있습니다.
from https://stackoverflow.com/questions/1019867/is-there-a-way-to-use-shell-exec-without-waiting-for-the-command-to-complete by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
PHP로 1 주일을 보냅니 까? (0) | 2018.09.14 |
---|---|
php5에서 인라인 문자열과 연결을 사용하는 속도 차이? (0) | 2018.09.14 |
PHP AES 암호화 / 해독 (0) | 2018.09.14 |
PHP cURL을 사용하여 원격 사이트에 로그인하십시오. (0) | 2018.09.14 |
페이스 북의 그래프 API로 사진을 앨범에 업로드 (0) | 2018.09.14 |