[الأصل] يعرف الجميع العملية الخفية (Daemon) في Linux/Unix، مثل httpd وmysqld شائعة الاستخدام وما إلى ذلك، وهي برامج تعمل في الذاكرة المقيمة، على غرار الخدمات الموجودة في Windows. بشكل عام، تتم كتابة العمليات الخفية بلغة C/C++، والتي يتم إنشاؤها من خلال عملية فرعية. عند إيقاف العملية الأصلية ضمن الغلاف الحالي، سيتم تشغيل العملية الفرعية في الخلفية حتى لا يتم إنشاء معلومات الإخراج على الجهاز يتم استخدام وظائف مثل سجل النظام لكتابة ملفات السجل.
نحن نعلم أن php هي لغة برمجة نصية ويتم تنفيذها من خلال محرك البرامج النصية php، لذلك من الصعب إجراء عملية خفية. اليوم سنقوم بدمج أوامر Unix/Linux لتحقيق وظيفة العملية الخفية لدينا.
[المبدأ] وظيفة أمر nohup في Unix هي تشغيل الأمر دون قطع الاتصال، وفي الوقت نفسه، يضع Nohup جميع مخرجات البرنامج في ملف nohup.out في الدليل الحالي غير قابل للكتابة، يتم وضعه في ملف <user home Directory> /nohup.out. لذا، بعد الحصول على هذا الأمر، يقوم برنامج php الخاص بنا بكتابة برنامج نصي shell ويستخدم حلقة للحفاظ على تشغيل البرنامج النصي الخاص بنا. وبعد ذلك، بغض النظر عما إذا كانت النافذة الطرفية الخاصة بنا مغلقة أم لا، يمكن أن يستمر برنامج php الخاص بنا في العمل. بالطبع، عندما يتم إيقاف عملية php الخاصة بنا أو إعادة تشغيل نظام التشغيل الخاص بنا، فسوف تنتهي بشكل طبيعي.
[وظيفة] سوف تسأل بالتأكيد، ما الفائدة من جعل برنامج php الخاص بنا برنامجًا خفيًا؟ بالطبع هناك، مثل الوظيفة الأكثر شيوعًا، والتي يمكن أن تحل محل وظيفة cron بشكل أساسي، على سبيل المثال، يمكن إجراء بعض العمليات التي نحتاج إلى تنفيذها بانتظام، ولم تعد هناك حاجة إلى cron تتم إعادة تشغيل الخادم، لا توجد طريقة، ومع ذلك، ليس من السهل إعادة تشغيل خوادم Unix العامة. بالإضافة إلى ذلك، يمكننا أيضًا إنشاء وظيفة بسيطة من جانب الخادم، مثل إنشاء خادم يمكنه استخدام Telnet، ويمكن تحويله إلى باب خلفي صغير، لكن التنفيذ معقد بعض الشيء.
[التمرين] المثال 1: إنشاء الملفات تلقائيًا سنقوم الآن بعمل مثالين لإثبات بياننا أعلاه. أولا وقبل كل شيء، الأول هو إنشاء ملف تلقائيا كل ثلاثين ثانية وتنفيذه إلى الأبد.
أولاً، عليك التأكد من أن نظام التشغيل هو Unix أو Linux، مثل FreeBSD أو Redhat أو Fedora أو SUSE. ثم يجب علينا التأكد من أن محرك البرنامج النصي الخاص بنا موجود في /usr/local/php/bin/php. يمكن كتابة المسار المحدد وفقًا لمسارك الفعلي. إذا لم يكن هناك محرك نصي، فيرجى تثبيته بنفسك.
على سبيل المثال، إذا كان الدليل الحالي هو /home/heiyeluren/، فإننا نستخدم vi أو محررات أخرى لكتابة ملف يسمى php_daemon1.php:
$ السادس php_daemon1.php
ثم قم بكتابة الكود التالي:
#!/usr/local/php/bin/php
<؟
set_time_limit(0);
بينما(1)
{
@fopen("test_".time().".txt"،"w");
نوم(30);
}
?>
ثم احفظ واخرج من vi، ثم امنح ملف php_daemon1.php الأذونات القابلة للتنفيذ:
$ chmod +x /home/heiyeluren/php_daemon1.php
ثم دع البرنامج النصي الخاص بنا ينفذ في الخلفية وقم بتنفيذ الأمر التالي:
$ nohup /home/heiyeluren/php_daemon1.php &
تذكر إضافة الرمز & في النهاية حتى يمكن تشغيله في الخلفية. بعد تنفيذ الأمر أعلاه، ستظهر المطالبة التالية:
[1] 82480
إلحاق الإخراج إلى nohup.out
بعد العودة إلى السيارة، ستظهر رسالة مطالبة. لذا فإن النصيحة المذكورة أعلاه تعني أنه سيتم وضع معلومات الإخراج لجميع عمليات تنفيذ الأوامر في ملف nohup.out، الذي تم ذكره أعلاه. ثم بعد تنفيذ الأمر أعلاه سنرى المزيد من الملفات التي تبدأ بـ test_ في الدليل الحالي كل ثلاثين ثانية مثل: test_1139901144.txt test_1139901154.txt وغيرها من الملفات مما يثبت أن برنامجنا يعمل في الخلفية.
إذن كيف ننهي تشغيل البرنامج؟ أفضل طريقة هي إعادة تشغيل نظام التشغيل هههه، هذا بالطبع غير مستحسن، يمكننا استخدام أمر القتل لقتل العملية، ومن الطبيعي أن نعرف رقم PID الخاص بالعملية ID يمكنك استخدام الأمر ps لرؤيته.
$ملاحظة
أمر الوقت PID TT STAT
82374 p3 س 0:00.14 -باش (باش)
82510 ص 3 ق 0:00.06 /usr/local/php/bin/php /home/heiyeluren/php_daemon1.php
82528 ص3 ر+ 0:00.00 ملاحظة
لقد رأينا أعلاه أن معرف عملية PHP الخاص بنا هو: 82510، لذلك نقوم بتنفيذ أمر الإيقاف:
$ قتل -9 82510
[1]+ قتل نوهوب /home/heiyeluren/php_daemon1.php
عندما ترى هذه المطالبة، ستعرف أن العملية قد تم إيقافها، وإذا قمت بملاحظة ذلك مرة أخرى، فستجد أنها قد انتهت:
$ملاحظة
أمر الوقت PID TT STAT
82374 p3 س 0:00.17 -باش (باش)
82535 ص3 ر+ 0:00.00 ملاحظة
إذا لم تتمكن من رؤية العملية مباشرة باستخدام الأمر ps، فاستخدم الأمرين ps & apos المدمجين لعرضها، وستتمكن بالتأكيد من رؤية العملية.
بناءً على العملية المذكورة أعلاه، يمكنك توسيع العملية لإنشاء برنامج cron الخاص بك، ثم لا تحتاج إلى cron، بالطبع، هذه طريقة واحدة فقط: البرنامج الخفي من جانب الخادم تتم محاكاته تقريبًا باستخدام جانب الخادم PHP، ثم يتم تشغيله في الخلفية لتحقيق تأثير البرنامج الخفي من جانب الخادم.
تابع في دليلنا الرئيسي: /home/heiyeluren وقم بتحرير الملف php_daemon2.php:
$ السادس php_daemon2.php
أدخل الكود التالي (الكود مأخوذ من دليل PHP، لقد قمت بتعديل التعليقات):
#!/usr/local/php/bin/php
<?php
/* إعدادات http://www.knowsky.com/php.asp لا تعرض أية أخطاء*/
error_reporting(0);
/* مهلة البرنامج النصي لا نهائية*/
set_time_limit(0);
/* بدء المسح الثابت */
ob_implicit_flush();
/* عنوان IP الخاص بهذا الجهاز والمنافذ التي يجب فتحها */
عنوان $ = '192.168.0.1';
منفذ $ = 10000؛
/* إنشاء مأخذ توصيل */
إذا (($sock =ocket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
صدى "فشل socket_create(): السبب: " .
}
/* ربط عنوان IP والمنفذ */
إذا (($ret = مقبس_ربط($sock, $address, $port)) < 0) {
صدى "socket_bind() فشل: السبب: " .
}
/* اتصال مقبس الشاشة */
إذا (($ret =ocket_listen($sock, 5)) < 0) {
صدى "socket_listen() فشل: السبب: " .
}
/*التكرار المستمر لمراقبة اتصالات المستخدم*/
يفعل {
إذا (($msgsock = مقبس_قبول($sock)) < 0) {
صدى "فشل socket_accept(): السبب: " .
استراحة؛
}
/* إرسال معلومات سريعة إلى المستخدمين المتصلين*/
$ msg = "========================================== r n " .
"مرحبًا بك في خادم اختبار PHP. rnrn".
"للإنهاء، اكتب 'quit'. rn" .
"لإيقاف تشغيل الخادم، اكتب 'إيقاف التشغيل'.rn" .
"للحصول على رسالة المساعدة، اكتب 'مساعدة'.rn" .
"===================================================rn" .
"php>";
المقبس_الكتابة($msgsock, $msg, strlen($msg));
يفعل {
إذا (خطأ === ($buf = مقبس_قراءة($msgsock, 2048, PHP_NORMAL_READ))) {
صدى "socket_read() فشل: السبب: " .
استراحة 2؛
}
إذا (!$buf = تقليم($buf)) {
يكمل؛
}
/*أغلق اتصال العميل عندما يُدخل العميل أمر الإنهاء*/
إذا ($buf == 'إنهاء') {
استراحة؛
}
/* عندما يقوم العميل بإدخال أمر إيقاف التشغيل، يتم إيقاف تشغيل كل من الخادم والعميل*/
إذا ($buf == 'إيقاف التشغيل') {
المقبس_إغلاق($msgsock);
استراحة 2؛
}
/* إخراج معلومات المساعدة عندما يقوم العميل بإدخال أمر المساعدة*/
إذا ($buf == 'مساعدة') {
$msg = "رسالة تعليمات خادم PHP rnrn".
"للإنهاء، اكتب 'quit'. rn" .
"لإيقاف تشغيل الخادم، اكتب 'إيقاف التشغيل'.rn" .
"للحصول على رسالة المساعدة، اكتب 'مساعدة'.rn" .
"php>";
المقبس_الكتابة($msgsock, $msg, strlen($msg));
يكمل؛
}
/*رسالة سريعة عند عدم وجود أمر إدخال العميل*/
$talkback = “PHP: أمر غير معروف '$buf'.rnphp> “;
المقبس_الكتابة($msgsock, $talkback, strlen($talkback));
صدى "$bufn";
} بينما (صحيح)؛
المقبس_إغلاق($msgsock);
} بينما (صحيح)؛
/* إغلاق اتصال المقبس */
المقبس_إغلاق($sock);
?>
احفظ الكود أعلاه واخرج.
يكمل الكود أعلاه تقريبًا وظيفة مشابهة لجانب خادم Telnet، أي أنه عندما يقوم جانب الخادم بتشغيل البرنامج، يمكن للعميل الاتصال بمنفذ 10000 للخادم للاتصال.
إضافة أذونات قابلة للتنفيذ إلى الملف:
$ chmod +x /home/heiyeluren/php_daemon2.php
تنفيذ الأمر على الخادم:
$ nohup /home/heiyeluren/php_daemon2.php &
يدخل في عملية الخلفية، ونصعد عبر telnet عميل Windows:
ج:>تلنت 192.168.0.1 10000
إذا طُلب منك:
الاتصال بـ 192.168.0.188...لا يمكن فتح الاتصال بالمضيف على المنفذ 10000: إذا فشل الاتصال، فهذا يعني أن الخادم غير مفتوح، أو أن البرنامج أعلاه لم يتم تنفيذه بشكل صحيح. يرجى التحقق مما إذا كان php يحتوي على –enable -وظيفة المقابس. إذا طُلب منك:
=================================================================================
مرحبًا بك في خادم اختبار PHP.
للإنهاء، اكتب "إنهاء".
لإيقاف تشغيل الخادم، اكتب "إيقاف التشغيل".
للحصول على رسالة المساعدة اكتب "مساعدة".
=================================================================================
PHP>
هذا يعني أننا نجحنا في الاتصال بالبرنامج الخفي من جانب الخادم المكتوب بلغة PHP، بعد المطالبة php>، يمكننا تنفيذ ثلاثة أوامر مثل help، وquite، وshutdown. إذا لم يكن إدخال الأمر هو هذه الثلاثة، فسوف يطلب:
بي إتش بي> قوات الدفاع الذاتي
PHP: أمر غير معروف "asdf".
قم بتنفيذ أمر المساعدة للحصول على مساعدة php> help
رسالة تعليمات خادم PHP
للإنهاء، اكتب "إنهاء".
لإيقاف تشغيل الخادم، اكتب "إيقاف التشغيل".
للحصول على رسالة المساعدة اكتب "مساعدة".
لن يتم تقديم جانب الخادم هذا ويمكن توسيعه بنفسك.
قتل العملية مشابه للمثال 1.
[ملخص] من خلال التعلم أعلاه، نعلم أنه يمكن أيضًا استخدام PHP كعملية خفية، إذا تم تصميمها جيدًا، فستكون الوظيفة أكثر قوة، ومع ذلك، نحن نتعلم فقط هنا ويمكنك البحث عنها وتحديثها بنفسك .
تشير هذه المقالة إلى دليل PHP الصيني، وستكون قراءة المزيد من الأدلة مفيدة جدًا لك.