[php] PHP의 비동기 셸 실행
쉘 스크립트를 호출해야하지만 출력에 전혀 신경 쓰지 않는 PHP 스크립트가 있습니다. 셸 스크립트는 많은 SOAP 호출을 수행하며 완료 속도가 느리므로 응답을 기다리는 동안 PHP 요청 속도를 늦추고 싶지 않습니다. 실제로 PHP 요청은 쉘 프로세스를 종료하지 않고 종료 할 수 있어야합니다.
나는 여러 가지로 검토 한 결과 exec()
, shell_exec()
, pcntl_fork()
, 등의 기능을하지만, 그들 중 누구도 정확히 내가 원하는 것을 제공하기 위해 보이지 않는다. (또는 그들이 그렇게한다면 방법이 명확하지 않습니다.) 어떤 제안?
답변
“출력에 신경 쓰지 않으면” &
프로세스의 백그라운드로 스크립트에 대한 exec를 호출 할 수 없습니까?
편집 -@ AdamTheHut 이이 게시물에 댓글을 달았을 때이를 호출에 추가 할 수 있습니다 exec
.
" > /dev/null 2>/dev/null &"
그러면 stdio
(first >
) 및 stderr
( 2>
)가 /dev/null
백그라운드로 리디렉션 되어 백그라운드에서 실행됩니다.
같은 일을하는 다른 방법이 있지만 가장 읽기 쉬운 방법입니다.
위의 이중 리디렉션에 대한 대안 :
" &> /dev/null &"
답변
실제로 독립 프로세스를 시작하기 때문에 이것을 사용 했습니다 .
<?php
`echo "the command"|at now`;
?>
답변
모든 Windows 사용자에게 : 비동기 PHP 스크립트를 실행하는 좋은 방법을 찾았습니다 (실제로 거의 모든 것이 작동합니다).
popen () 및 pclose () 명령을 기반으로합니다. Windows와 Unix에서 모두 잘 작동합니다.
function execInBackground($cmd) {
if (substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start /B ". $cmd, "r"));
}
else {
exec($cmd . " > /dev/null &");
}
}
답변
Linux에서는 다음을 수행 할 수 있습니다.
$cmd = 'nohup nice -n 10 php -f php/file.php > log/file.log & printf "%u" $!';
$pid = shell_exec($cmd);
명령 프롬프트에서 명령을 실행 한 다음 PID를 반환하면> 0을 확인하여 작동하는지 확인할 수 있습니다.
이 질문은 비슷합니다 : PHP에는 스레딩이 있습니까?
답변
php-execute-a-background-process 에는 좋은 제안이 있습니다. 나는 내 것이 꽤 좋다고 생각하지만 편견이 있습니다. 🙂
답변
Linux에서는 명령 끝에 앰퍼샌드를 추가하여 새로운 독립 스레드에서 프로세스를 시작할 수 있습니다.
mycommand -someparam somevalue &
Windows에서는 “start”DOS 명령을 사용할 수 있습니다
start mycommand -someparam somevalue
답변
그것을하는 올바른 방법 (!)
- 포크()
- setsid ()
- execve ()
포크 포크, setsid는 현재 프로세스가 마스터 프로세스 (부모 없음)가되고 호출 프로세스가 호출 된 프로세스로 대체되도록 지시합니다. 부모는 자녀에게 영향을 미치지 않고 종료 할 수 있습니다.
$pid=pcntl_fork();
if($pid==0)
{
posix_setsid();
pcntl_exec($cmd,$args,$_ENV);
// child becomes the standalone detached process
}
// parent's stuff
exit();