PHP ยังสามารถเริ่มต้นและยุติกระบวนการ daemon ได้โดยตรง เมื่อเทียบกับเปลือกหอยมันง่ายกว่าและสะดวกกว่าที่จะเข้าใจ แน่นอนว่าหาก PHP daemon ต้องการรีสตาร์ทโดยอัตโนมัติมันก็ยังคงขึ้นอยู่กับกำหนดการ crontab ของเชลล์ ดำเนินการสคริปต์ทุกครั้งในขณะที่ดูว่าสคริปต์จำเป็นต้องรีสตาร์ทหรือไม่ หากจำเป็นให้ฆ่ากระบวนการและลบไฟล์ runfile รีสตาร์ทและเขียน PID ในไฟล์ runfile
การคัดลอกรหัสมีดังนี้:
<? php
ฟังก์ชั่นเริ่มต้น ($ ไฟล์) {
$ path = dirname (__ ไฟล์ __). '/';
$ runfile = $ path. $ ไฟล์ '. run';
$ diefile = $ path. $ ไฟล์ '. ตาย';
$ file = $ path "data/{$ file} .php";
Clearstatcache ();
if (file_exists ($ runfile)) {
$ oldpid = file_get_contents ($ runfile);
$ nowpid = shell_exec ("ps aux | grep 'php -f process.php' | grep $ {oldpid} | awk '{พิมพ์ $ 2}'");
// หากหมายเลข PID ใน runfile สามารถจับคู่ที่กำลังทำงานได้และความแตกต่างระหว่างครั้งสุดท้ายที่คุณเข้าถึง RunFile และความแตกต่างในปัจจุบันน้อยกว่า 5 นาทีจากนั้นกลับมา
if (($ oldpid == $ nowpid) && (เวลา () - fileatime ($ runfile) <300)) {
echo "$ ไฟล์เป็นวงกลมที่เรียกใช้ไม่ได้";
กลับ;
}อื่น{
// หมายเลข PID ไม่ตรงกันหรือคำสั่ง LOOP ไม่ได้ทำงานเป็นเวลา 300 วินาที เพียงแค่ฆ่ากระบวนการและรีสตาร์ท
$ pid = file_get_contents ($ runfile);
shell_exec ("ps aux | grep 'php -f process.php' | grep {$ pid} | xargs-if-no-run-appy kill");
-
}อื่น{
// เขียนไฟล์ PID ไปยังไฟล์รัน
if (! ($ newpid = getMypId ()) ||! file_put_contents ($ runfile, $ newpid)) {
กลับ;
-
ในขณะที่ (จริง) {
// รับหมายเลขกระบวนการสิ้นสุดใหม่สิ้นสุดกระบวนการและลบไฟล์ที่เกี่ยวข้อง
if (file_exists ($ diefile) && unlink ($ runfile) && unlink ($ diefile)) {
กลับ;
-
/*นี่คือสิ่งที่ daemon ต้องทำ*/
file_put_contents ($ file, "ฉันกำลังทำงานอยู่ตอนนี้" .php_eol, file_append);
-
สัมผัส ($ runfile);
นอนหลับ (5);
-
-
-
เริ่มต้น ("ทดสอบ");
บางจุดให้ความสนใจเมื่อเขียน Daemons กับ HP:
1. สิ่งแรกคือฟังก์ชั่น ClearStatCache () ฟังก์ชั่น เมื่อดูที่คู่มืออย่างเป็นทางการคุณสามารถรู้ได้ว่าฟังก์ชั่นจะล้างแคชสถานะไฟล์ เมื่อตรวจสอบสถานะแคชของไฟล์เดียวกันหลายครั้งในสคริปต์ข้อผิดพลาดจะเกิดขึ้นหากไม่ได้ใช้ฟังก์ชัน ฟังก์ชั่นที่ได้รับผลกระทบคือ: stat (), lstat (), file_exists (), is_writable (), is_readable (), is_executable (), is_file (), is_dir (), is_link (), filectime (), ไฟล์ () Fileperms ()
2. เมื่อสคริปต์ทำงานหลายครั้งจะตรวจพบก่อนที่จะทำงาน ระยะเวลาของการวนรอบสุดท้ายตอนนี้มากกว่า 300s หรือหมายเลข PID ไม่ตรงกันจะเริ่มต้นใหม่ (ต้องอัปเดตเวลาในการดำเนินการลูปแต่ละครั้ง)
3. การรีสตาร์ทอัตโนมัติยังใช้กำหนดการของ Crontab เพิ่มไฟล์ลงในตาราง:
การคัดลอกรหัสมีดังนี้:
crontab -e
#เปิดตารางโหมดภาพประกอบ
*/3 * * * */usr/bin/php -f process.php
#execute ทุก ๆ 3 นาทีให้วางกระบวนการเพื่อแขวน
นี่เป็นเรื่องปกติ หากมีฟังก์ชั่นเฉพาะคุณต้องเปลี่ยนรหัส