PHP 스크립트를 데몬으로 실행하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/38596

  •  09-06-2019
  •  | 
  •  

문제

PHP 스크립트를 데몬으로 계속 실행하는 가장 좋은 방법은 무엇이며 다시 시작해야 하는지 확인하는 가장 좋은 방법은 무엇입니까?

연중무휴 24시간 실행해야 하는 스크립트가 있는데 대부분 다음을 사용하여 실행할 수 있습니다. 안돼.하지만 다운되면 자동으로 다시 시작될 수 있도록 모니터링하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

이 작업을 수행하기 위해 (적절한) init 구조를 사용할 수 없는 경우(공유 호스팅 등을 사용하는 경우) cron을 사용하여 몇 분마다 스크립트를 실행합니다(원하는 언어로 작성할 수 있음). 실행 중인지 확인하고 필요한 경우 다시 시작합니다.

다른 팁

출력을 메일로 파이프하여 데몬을 실행합니다.

php daemon.php | mail -s "daemon stopped" foo@example.org

그렇게 하면 데몬이 중지되면 메일을 보내고 우리는 그런 식으로 알림을 받게 됩니다.

물론 이는 여전히 데몬을 수동으로 다시 시작하는 것을 의미하지만, 우리는 즉시 알게 될 것입니다.일반적으로 데몬이 중지되면 어쨌든 처리해야 할 다른 문제가 있다는 의미이므로 일반적으로 괜찮습니다.

데몬을 다시 시작하는 빠르고 더러운 cron:

* * * * * USER ps auxww | grep SCRIPTNAME > /dev/null || SCRIPTNAME

USER를 데몬이 실행되는 사용자로 바꾸고 SCRIPTNAME을 스크립트 이름으로 바꿉니다.이것을 꽂으세요 /etc/cron.d/restart_php_daemon.매분마다 실행되어야 합니다.첫 번째 변경 * 에게 */2 또는 */5 덜 자주 실행합니다.

업데이트

이것을 자신의 crontab에 넣는 경우:

달리다 crontab -e 그리고 다음을 추가하세요:

* * * * * ps auxwww | grep SCRIPTNAME > /dev/null || SCRIPTNAME

가장 우아한 솔루션은 PHP 데몬 또는 반응PHP.

나는 wget을 실행하고 결과를 공유 서버의 /dev/null로 보내는 데 성공했습니다.

데몬은 백그라운드에서 실행되는 Linux 프로세스입니다.Apache 또는 mysql은 데몬입니다.Linux 환경에서는 cronjob을 사용하여 백그라운드 프로그램을 실행할 수 있지만 몇 가지 제한 사항이 있으며 일부 시나리오에서는 좋은 생각이 아닙니다.예를 들어 cronjob을 사용하면 이전 실행이 아직 완료되었는지 제어할 수 없습니다.따라서 프로세스를 데몬으로 실행하는 것이 더 편리한 경우가 많습니다.

// Daemonize
$pid = pcntl_fork(); // parent gets the child PID and child gets 0
if($pid){ // if pid is not 0
     // Only the parent will know the PID. Kids aren't self-aware
     // Parent says goodbye!
     print "Parent : " . getmypid() . " exiting\n";
     exit();
}
print "Child : " . getmypid() . "\n";

위의 코드는 PHP에서 데몬을 생성하는 방법에 대한 매우 유용한 기사에서 가져온 것입니다.이 내용은 다음에서 읽을 수 있습니다. 링크

저는 PHP 기반 스크립트를 사용하여 데이터베이스에서 읽고 이메일을 보냅니다(PEAR Mail_Queue 라이브러리 사용).bash 스크립트 내에서 실행하고 반환된 결과("exit $status;"에서)에 따라 중지하거나 X초 동안 절전 모드로 전환하거나 즉시 다시 시작합니다.(또한 메일 시스템에 스트레스를 주지 않기 위해 로드 평균/수면 검사를 PHP 스크립트에 넣었습니다.)

지속적으로 실행되어야 하는 장기 데몬에 대한 것이라면 동의합니다. 아마도 이것을 실행하는 것이 최선의 방법은 아닐 것입니다(비록 장기적으로 성공적으로 실행된 일부 소켓 서버에 대해 들었지만). PHP 5.3에는 이제 향상된 가비지 수집 기능이 있으며, 스크립트가 계획되지 않게 종료되지 않을 정도로 잘 작성되었다면 메모리 문제는 이전보다 훨씬 줄어들 것입니다.

나는 PHP가 이를 위한 최고의 도구가 아니라는 점에 동의합니다. 그러나 데이터베이스 액세스 등과 같은 애플리케이션의 구성 요소를 재사용할 수 있도록 PHP를 사용하려는 이유를 이해할 수 있습니다.

비슷한 문제가 있었고 결국 PHP 스크립트를 실행할 수 있는 C로 작성된 데몬인 The Fat Controller를 개발하게 되었습니다.또한 여러 스크립트 인스턴스를 병렬로 실행하는 다중 스레드 데몬으로 실행될 수도 있습니다.

여기에 더 많은 정보와 사용 사례가 있습니다. http://www.4pmp.com/fatcontroller/

TBH, PHP는 아마도 이를 위한 최고의 도구는 아니며 실제로 설계된 목적도 아닙니다.이것을 시도할 때 메모리 누수 및 기타 나쁜 일이 발생한다는 이야기를 들었습니다.또한 PHP는 스크립트 실행당 리소스 ID(파일 핸들, DB 연결 등)의 양이 한정되어 있다는 점을 명심하세요.

Python이나 Perl과 같은 다른 것을 사용하는 것이 더 나을 것입니다. 비록 저는 이런 종류의 앱을 실제로 작성해본 경험이 없지만 PHP가 여러분이 하려는 작업에 적합하지 않다는 것을 알고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top