명령어가 완료될 때까지 기다리지 않고 shell_exec을 사용할 수 있는 방법이 있습니까?
백그라운드에서 실행하고 싶은 프로세스 부하가 높은 작업이 있습니다.
사용자가 페이지를 클릭하면 PHP 스크립트가 실행됩니다.마지막으로 필요한 경우 셸 스크립트(예:
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
(write도 Deny로 설정합니다).
PHP 사용popen
명령어. 예:
pclose(popen("start c:\wamp\bin\php.exe c:\wamp\www\script.php","r"));
그러면 하위 프로세스가 생성되고 스크립트는 출력을 기다리지 않고 백그라운드에서 실행됩니다.
네, 다음에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
만약 웹페이지에서 벗어나 있다면 어떤 종류의 신호(디렉토리에 파일을 드롭)를 생성하여 cron 작업을 통해 필요한 작업을 픽업할 것을 권장합니다.그렇지 않으면, 우리는 사용 영역에 들어갈 수 있습니다.pcntl_fork()
그리고.exec()
아파치 프로세스에서 나온 건데, 그건 나쁜 모조일 뿐이야.
이 기능은 동작하지만 백그라운드에서 실행되는 이 함수를 호출할 때마다 새로운 프로세스가 생성되므로 서버에 과부하가 걸리지 않도록 주의해야 합니다.동시 콜이 1개밖에 없는 경우는, 이 회피책이 효과가 있습니다.
그렇지 않다면 예를 들어 beanstalkd/gearman/amazon sqs와 같은 메시지 큐를 실행하는 것이 좋습니다.
언급URL : https://stackoverflow.com/questions/1019867/is-there-a-way-to-use-shell-exec-without-waiting-for-the-command-to-complete
'programing' 카테고리의 다른 글
개체 배열을 여러 필드로 정렬하려면 어떻게 해야 합니까? (0) | 2023.01.13 |
---|---|
MySQL Workbench에서 Mariadb(Centos 7)에 액세스할 수 없음 (0) | 2023.01.13 |
PHP 정규식:끝 구분 기호 '^'을(를) 찾을 수 없습니다. (0) | 2023.01.13 |
PHP 배열의 각 항목에 접두사 추가 (0) | 2023.01.13 |
봄철 ContextLoaderListener의 역할/목적 (0) | 2023.01.13 |