Thành phần giám sát tệp

Bối cảnh:

Workerman là một ứng dụng chạy trong bộ nhớ, việc hoạt động trong bộ nhớ giúp tránh việc đọc lại ổ đĩa và biên dịch PHP nhiều lần, nhằm đạt được hiệu suất cao nhất. Do đó, sau khi thay đổi mã nguồn của ứng dụng, cần phải reload hoặc restart thủ công để các thay đổi có hiệu lực.

Đồng thời, Workerman cung cấp một dịch vụ giám sát cập nhật tệp, dịch vụ này sẽ tự động thực hiện reload khi phát hiện có tệp bị cập nhật, giúp tải lại các tệp PHP. Các nhà phát triển chỉ cần đưa dịch vụ này vào dự án và khởi động cùng với dự án.

Địa chỉ tải dịch vụ giám sát tệp:

  1. Phiên bản không phụ thuộc: https://github.com/walkor/workerman-filemonitor

  2. Phiên bản phụ thuộc inotify: https://github.com/walkor/workerman-filemonitor-inotify (cần cài đặt mở rộng inotify)

Sự khác biệt giữa hai phiên bản:

Phiên bản ở địa chỉ 1 sử dụng phương pháp poll mỗi giây để kiểm tra thời gian cập nhật tệp,

Trong khi đó, địa chỉ 2 tận dụng cơ chế inotify của nhân Linux, giúp hệ thống chủ động thông báo cho Workerman khi có tệp được cập nhật.

Thông thường, phiên bản không phụ thuộc đầu tiên là đủ.

Cách sử dụng

Sao chép thư mục Applications/FileMonitor vào thư mục Applications của dự án của bạn.

Nếu dự án của bạn không có thư mục Applications, bạn có thể sao chép tệp Applications/FileMonitor/start.php vào bất kỳ vị trí nào trong dự án của bạn, sau đó require tệp này trong tập lệnh khởi động.

Thành phần giám sát mặc định theo dõi thư mục Applications, nếu cần thay đổi, bạn có thể chỉnh sửa biến $monitor_dir trong tệp Applications/FileMonitor/start.php, giá trị của $monitor_dir nên là đường dẫn tuyệt đối.

Lưu ý:

  • Hệ thống Windows không hỗ trợ reload, không thể sử dụng dịch vụ giám sát này.
  • Chỉ có hiệu lực khi ở chế độ debug, trong daemon sẽ không thực hiện giám sát tệp (tại sao không hỗ trợ chế độ daemon sẽ được giải thích dưới đây).
  • Chỉ những tệp được nạp sau khi Worker::runAll chạy mới có thể được cập nhật nóng, hoặc nói cách khác, chỉ những tệp được nạp trong callback onXXX mới có thể được cập nhật nóng.

Tại sao không hỗ trợ chế độ daemon?

Chế độ daemon thường là chế độ hoạt động trong môi trường chính thức. Khi phát hành phiên bản trong môi trường chính thức, thường sẽ phát hành nhiều tệp cùng lúc, và các tệp có thể có sự phụ thuộc lẫn nhau. Do thời gian đồng bộ nhiều tệp lên ổ đĩa cần một khoảng thời gian nhất định, sẽ có thời điểm nào đó mà các tệp trên ổ đĩa chưa đầy đủ. Nếu vào thời điểm đó mà phát hiện có tệp được cập nhật và thực hiện reload, sẽ có nguy cơ gặp lỗi nghiêm trọng vì không tìm thấy tệp.

Ngoài ra, trong môi trường chính thức, đôi khi cần phải online để xác định lỗi. Nếu chỉnh sửa mã và lưu ngay, các thay đổi sẽ ngay lập tức có hiệu lực, có thể xảy ra lỗi cú pháp làm cho dịch vụ online không khả dụng. Phương pháp đúng nên là, sau khi lưu mã, kiểm tra xem có lỗi cú pháp hay không bằng cách sử dụng php -l yourfile.php, sau đó mới thực hiện reload để cập nhật mã nóng.

Nếu các nhà phát triển thực sự cần bật giám sát tệp và cập nhật tự động trong chế độ daemon, họ có thể tự sửa đổi mã trong Applications/FileMonitor/start.php, xóa điều kiện kiểm tra phần Worker::$daemonize.