ส่วนประกอบการตรวจสอบไฟล์

พื้นหลัง:

Workerman ทำงานในหน่วยความจำถาวร ซึ่งสามารถหลีกเลี่ยงการอ่านดิสก์ซ้ำ การตีความซ้ำ และการคอมไพล์ PHP เพื่อให้ได้ประสิทธิภาพสูงสุด ดังนั้นหลังจากเปลี่ยนแปลงโค้ดธุรกิจ จึงจำเป็นต้องทำการ reload หรือ restart ด้วยตนเองเพื่อให้มีผล

ในขณะเดียวกัน Workerman ยังให้บริการตรวจสอบการอัปเดตไฟล์ ซึ่งจะทำการอัตโนมัติ reload เมื่อมีการตรวจพบการอัปเดตไฟล์ โดยนักพัฒนาสามารถนำไปใช้ในโปรเจ็กต์ของตนได้ตั้งแต่เริ่มต้นโปรเจ็กต์

ลิงค์ดาวน์โหลดบริการตรวจสอบไฟล์:

  1. เวอร์ชันไม่พึ่งพา: https://github.com/walkor/workerman-filemonitor

  2. เวอร์ชันที่พึ่งพา inotify: https://github.com/walkor/workerman-filemonitor-inotify (ต้องติดตั้ง inotify extension)

ความแตกต่างระหว่างสองเวอร์ชัน:

เวอร์ชันที่อยู่ในลิงค์ 1 ใช้วิธีการตรวจสอบว่าไฟล์ได้รับการอัปเดตโดยการตรวจสอบเวลาการปรับปรุงไฟล์ทุกวินาที

ในขณะที่ลิงค์ 2 ใช้กลไก inotify ของ Linux kernel ซึ่งเมื่อมีการอัปเดตไฟล์ ระบบจะส่งการแจ้งเตือนไปยัง Workerman โดยตรง

โดยทั่วไปแล้วสามารถใช้เวอร์ชันที่ไม่มีการพึ่งพาได้

วิธีการใช้งาน

ให้คัดลอกไดเรกทอรี Applications/FileMonitor ไปยังไดเรกทอรี Applications ของโปรเจ็กต์ของคุณ

ถ้าโปรเจ็กต์ของคุณไม่มีไดเรกทอรี Applications สามารถคัดลอกไฟล์ Applications/FileMonitor/start.php ไปยังตำแหน่งใดก็ได้ในโปรเจ็กต์ของคุณ จากนั้น require ในสคริปต์ที่เริ่มต้น

ส่วนประกอบการตรวจสอบจะตรวจสอบในไดเรกทอรี Applications เป็นค่าเริ่มต้น หากต้องการเปลี่ยนแปลงสามารถแก้ไขตัวแปร $monitor_dir ในไฟล์ Applications/FileMonitor/start.php โดยแนะนำให้ใช้ค่าเป็นเส้นทางที่เป็นไฟล์ทั้งหมด

หมายเหตุ:

  • ระบบปฏิบัติการ Windows ไม่สนับสนุนการ reload ไม่มีบริการตรวจสอบนี้.
  • จะมีผลเฉพาะในโหมด debug เท่านั้น ไม่ทำงานในโหมด daemon (ทำไมไม่สนับสนุนโหมด daemon ดูคำอธิบายด้านล่าง).
  • ไฟล์ที่ถูกโหลดหลังจากที่ Worker::runAll ทำงานจะสามารถได้รับการอัปเดตแบบร้อน หรือกล่าวได้ว่าเฉพาะไฟล์ที่โหลดในคอลแบค onXXX เท่านั้นที่จะสามารถได้รับการอัปเดตแบบร้อน.

ทำไมไม่สนับสนุนโหมด daemon?

โหมด daemon โดยทั่วไปจะใช้ในการทำงานในสภาพแวดล้อมการผลิต ถ้าในสภาพแวดล้อมการผลิตเผยแพร่เวอร์ชันปกติ มักจะมีการเผยแพร่ไฟล์หลายไฟล์ซึ่งอาจมีการพึ่งพากัน เนื่องจากการซิงค์ไฟล์หลายไฟล์ลงดิสก์ต้องใช้เวลา ทำให้มีความเสี่ยงที่ไฟล์บนดิสก์จะไม่ครบถ้วนในช่วงเวลาหนึ่ง หากตรวจสอบการอัปเดตไฟล์ในช่วงเวลานั้นและทำการ reload จะมีความเสี่ยงที่จะเกิดข้อผิดพลาดร้ายแรงจากการไม่พบไฟล์

นอกจากนี้ในสภาพแวดล้อมการผลิตบางครั้งจะมีการแก้ไขข้อบกพร่องแบบออนไลน์ หากมีการแก้ไขโค้ดและบันทึก ก็จะมีผลทันที อาจทำให้เกิดข้อผิดพลาดทางไวยากรณ์ที่ทำให้บริการออนไลน์ไม่สามารถใช้งานได้ วิธีที่ถูกต้องคือการบันทึกโค้ดแล้วตรวจสอบด้วย php -l yourfile.php ว่ามีข้อผิดพลาดทางไวยากรณ์หรือไม่ จากนั้นจึงทำการ reload เพื่ออัปเดตโค้ด

หากนักพัฒนาจำเป็นต้องเปิดฟังก์ชันการตรวจสอบไฟล์ในโหมด daemon และการอัปเดตอัตโนมัติ สามารถแก้ไขโค้ดใน Applications/FileMonitor/start.php โดยการนำค่าการตรวจสอบในส่วน Worker::$daemonize ออกได้.