파일 감시 구성 요소

배경:

Workerman은 메모리 상주로 실행되며, 이를 통해 디스크 반복 읽기 및 PHP 반복 해석 및 컴파일을 피하여 최상의 성능을 얻을 수 있습니다. 따라서 비즈니스 코드를 변경한 후에는 수동으로 다시로드하거나 다시 시작해야 합니다.

동시에 Workerman은 파일 업데이트를 감지하여 자동으로 다시로드하는 파일 모니터링 서비스를 제공합니다. 이 서비스는 파일이 업데이트되면 자동으로 reload되어 PHP 파일을 다시로드합니다. 개발자는 프로젝트와 함께 이를 실행하여 프로젝트가 시작될 때 사용할 수 있습니다.

파일 모니터링 서비스 다운로드 링크:

  1. 의존성 없는 버전: https://github.com/walkor/workerman-filemonitor

  2. inotify에 의존하는 버전: https://github.com/walkor/workerman-filemonitor-inotify (inotify 확장을 설치해야 함)

두 가지 버전의 차이:

주소 1 버전은 파일 업데이트 시간을 초 단위로 폴링하여 파일이 업데이트되었는지를 판단합니다.

주소 2는 Linux 커널의 inotify 메커니즘을 활용하여 시스템이 파일 업데이트 시 알림을 보내는 방식입니다.

보통 의존성이 없는 첫 번째 버전을 사용하는 것이 좋습니다.

사용 방법

Applications/FileMonitor 디렉토리를 프로젝트의 Applications 디렉토리에 복사하면 됩니다.

프로젝트에 Applications 디렉토리가 없는 경우, Applications/FileMonitor/start.php 파일을 프로젝트의 임의 위치에 복사하고 시작 스크립트에서 require하여 시작 스크립트에 추가하면 됩니다.

모니터링 구성 요소는 기본적으로 Applications 디렉토리를 모니터링하지만, 변경해야 하는 경우 Applications/FileMonitor/start.php의 $monitor_dir 변수를 수정할 수 있으며, $monitor_dir의 값은 절대 경로를 사용하는 것이 좋습니다.

주의사항:

  • 윈도우 시스템은 reload를 지원하지 않으므로 이 모니터링 서비스를 사용할 수 없습니다.
  • 디버그 모드에서만 작동하며, 데몬 모드에서는 파일 감시가 실행되지 않습니다 (데몬 모드를 지원하지 않는 이유는 아래 설명 참조).
  • Worker::runAll이 실행된 후 로드된 파일만 업데이트할 수 있으며, 즉 onXXX 콜백에서 로드된 파일만 업데이트할 수 있습니다.

왜 데몬 모드를 지원하지 않을까요?

데몬 모드는 일반적으로 운영 환경에서 실행되는 모드입니다. 운영 환경에서 릴리스 버전을 배포할 때 여러 파일을 한 번에 배포하거나 파일 간에 의존성이 있을 수 있습니다. 여러 파일을 디스크에 동기화하는 데 시간이 필요하며, 어느 순간에는 디스크에 모든 파일이 아직 없을 수 있습니다. 이때 파일 갱신이 감지되고 reload가 실행된다면 파일을 찾을 수 없어 치명적인 오류가 발생할 수 있습니다.

또한 실제 환경에서는 때로는 실시간으로 버그를 수정해야 할 때가 있습니다. 코드를 직접 편집하고 저장하면 즉시 영향을 받아 온라인 서비스가 사용 불가능해질 수 있습니다. 올바른 방법은 코드를 저장한 후 php -l yourfile.php로 구문 오류를 확인한 다음 reload하여 코드를 업데이트하는 것입니다.

만약 개발자가 데몬 모드에서 파일 감시 및 자동 업데이트를 활성화해야 하는 경우 Applications/FileMonitor/start.php 코드를 직접 수정하여 Worker::$daemonize 부분의 조건을 제거하면 됩니다.