يمكن لـ PHP أيضًا بدء عملية الخفي وإنهاءها. بالمقارنة مع القشرة ، فهو أكثر بساطة وأكثر ملاءمة لفهم. بالطبع ، إذا كان PHP Daemon يحتاج إلى إعادة تشغيل تلقائيًا ، فسيظل ذلك يعتمد على جدول Crontab الخاص بقذيفة. قم بتنفيذ البرنامج النصي كل مرة لمعرفة ما إذا كان البرنامج النصي يحتاج إلى إعادة تشغيل. إذا لزم الأمر ، اقتل العملية وحذف ملف RunFile ، وأعد تشغيل PID واكتبه في ملف RunFile.
نسخة الكود كما يلي:
<؟ PHP
وظيفة بدء (ملف $) {
$ path = dirname (__ file __). '/' ؛
$ runfile = $ path. $ file. '. run' ؛
$ diefile = $ path. $ file. '. die' ؛
$ 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 '{print $ 2}'") ؛
// إذا كان رقم PID في Runfile يمكن أن يتطابق مع الرقم الجري ، والفرق بين آخر مرة يمكنك الوصول فيها إلى Runfile والفرق الحالي أقل من 5 دقائق ، ثم العودة
if (($ oldpid == $ nowpid) && (time () - fileatime ($ runfile) <300)) {
صدى "ملف $ هو تشغيل دائرة لا" ؛
يعود؛
}آخر{
// لا يتطابق رقم PID أو لم يتم تشغيل بيان الحلقة لمدة 300 ثانية. فقط اقتل العملية وأعد تشغيلها
$ pid = file_get_contents ($ runfile) ؛
shell_exec ("ps aux | grep 'php -f process.php' | grep {$ pid} | xargs-if-no-run-repty kill") ؛
}
}آخر{
// اكتب ملف الملف إلى ملف التشغيل
if (! ($ newPid = getMyPid ()) ||! file_put_contents ($ runfile ، $ newPid)) {
يعود؛
}
بينما (صحيح) {
//استقبل رقم عملية نهاية جديد ، وإنهاء العملية ، وحذف الملفات ذات الصلة
if (file_exists ($ diefile) && inflink ($ runfile) && unlink ($ diefile)) {
يعود؛
}
/*هذا ما يحتاج الخفيون إلى فعله*/
file_put_contents (ملف $ ، "أنا أقوم الآن" .php_eol ، file_append) ؛
/********************/
Touch ($ runfile) ؛
النوم (5) ؛
}
}
}
ابدأ ("اختبار") ؛
بعض النقاط للانتباه إلى عند كتابة الشياطين مع HP:
1. أول شيء هو وظيفة ClearStatCache (). بالنظر إلى الدليل الرسمي ، يمكنك معرفة أن الوظيفة تقوم بمسح ذاكرة التخزين المؤقت لحالة الملف. عند التحقق من حالة ذاكرة التخزين المؤقت لنفس الملف عدة مرات في البرنامج النصي ، سيحدث خطأ إذا لم يتم استخدام الوظيفة. الوظائف المتأثرة هي: STAT () ، lstat () ، file_exists () ، is_writable () ، is_readable () ، is_executable () ، is_file () ، is_dir () ، is_link () ، filectime () ، filemtime () ، fileInode () fileperms ().
2. عندما يتم تشغيل البرنامج النصي عدة مرات ، سيتم اكتشافه قبل التشغيل. أصبحت المسافة الزمنية للحلقة الأخيرة أكبر من 300s أو سيتم إعادة تشغيل رقم PID (يجب تحديث الوقت في كل تنفيذ حلقة).
3. يستخدم إعادة التشغيل التلقائي أيضًا جدول Crontab ، أضف الملف إلى الجدول:
نسخة الكود كما يلي:
crontab -e
#افتح الجدول الزمني ، وضع أقحم
*/3 * * */usr/bin/php -f process.php
#execute كل 3 دقائق ، ضع العملية للتعليق
هذا جيد في الأساس. إذا كانت هناك وظائف محددة ، فأنت بحاجة إلى تغيير الرمز.