파일 모니터링 컴포넌트
배경:
Workerman은 상주 메모리에서 실행되며, 상주 메모리는 디스크를 반복적으로 읽거나 PHP를 반복적으로 해석 및 컴파일하는 것을 피할 수 있어 최고 성능을 달성합니다. 따라서 비즈니스 코드를 변경한 후 수동으로 reload 또는 restart 해야만 효과가 있습니다.
동시에 Workerman은 파일 업데이트를 모니터링하는 서비스를 제공하며, 이 서비스는 파일 업데이트를 감지하면 자동으로 reload를 실행하여 PHP 파일을 새로 로드합니다. 개발자는 이를 프로젝트에 포함시켜 프로젝트 시작 시 함께 사용할 수 있습니다.
파일 모니터링 서비스 다운로드 주소:
-
inotify 의존성 버전: https://github.com/walkor/workerman-filemonitor-inotify ( inotify 확장 설치 필요)
두 버전의 차이점:
주소 1 버전은 매 초마다 파일 수정 시간을 확인하여 파일 업데이트 여부를 판단합니다.
주소 2는 Linux 커널의 inotify 메커니즘을 활용하여 파일이 업데이트될 때 시스템이 Workerman에 적극적으로 알립니다.
일반적으로 첫 번째 의존성 없는 버전을 사용하면 됩니다.
사용 방법
Applications/FileMonitor 디렉토리를 프로젝트의 Applications 디렉토리에 복사하면 됩니다.
프로젝트에 Applications 디렉토리가 없다면 Applications/FileMonitor/start.php 파일을 프로젝트의 임의 위치에 복사하고, 시작 스크립트에서 require하여 사용하면 됩니다.
모니터링 컴포넌트는 기본적으로 Applications 디렉토리를 모니터링하며, 변경하려면 Applications/FileMonitor/start.php의 $monitor_dir 변수를 수정하면 됩니다. $monitor_dir의 값은 절대 경로로 설정하는 것이 좋습니다.
주의:
- Windows 시스템은 reload를 지원하지 않으며, 이 모니터링 서비스를 사용할 수 없습니다.
- debug 모드에서만 활성화되며, daemon 모드에서는 파일 모니터링이 실행되지 않습니다(daemon 모드가 지원되지 않는 이유는 아래 설명 참조).
- Worker::runAll이 실행된 후 로드된 파일만 핫 업데이트가 가능하며, 즉 onXXX 콜백에서 로드된 파일만 핫 업데이트가 가능합니다.
왜 daemon 모드를 지원하지 않나요?
daemon 모드는 일반적으로 온라인 공식 환경에서 실행되는 모드입니다. 공식 환경에서 배포할 때는 여러 파일을 동시에 배포하며, 파일 간에 의존성이 있을 수 있습니다. 여러 파일이 디스크에 동시에 전송되는 데는 일정 시간이 필요하므로, 그 순간 디스크에 있는 파일이 완전하지 않을 수 있습니다. 이때 파일 업데이트를 감지하고 reload를 실행하면 존재하지 않는 파일로 인한 치명적 오류의 위험이 있습니다.
또한 공식 환경에서는 때때로 온라인에서 버그를 찾기 위해 직접 코드를 편집하고 저장하면 즉시 적용되어 구문 오류로 인해 온라인 서비스가 사용할 수 없게 될 수 있습니다. 올바른 방법은 코드를 저장한 후 php -l yourfile.php를 통해 구문 오류가 있는지 확인하고, 그 다음에 reload로 핫 업데이트하는 것입니다.
개발자가 정말로 daemon 모드에서 파일 모니터링 및 자동 업데이트를 필요로 한다면, Applications/FileMonitor/start.php 코드의 Worker::$daemonize 부분의 판단을 제거하여 직접 변경하면 됩니다.