programing

명령어가 완료될 때까지 기다리지 않고 shell_exec을 사용할 수 있는 방법이 있습니까?

goodsources 2023. 1. 13. 19:53
반응형

명령어가 완료될 때까지 기다리지 않고 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

반응형