ظ…ظˆط³ظˆط¹ط© ط¯ط±ظˆط³ ظ„ظ„ط؛ط© ط§ظ„ظ€ظ€ظ€ php 2




اخواني
كيف الحال ان شاء الله تمام انا راح اكمل الموسوعة وهذي المتقدمة هي الموسوعة المتقدمة

فقبل ما تقراها لازم تقرى موسوعة المبتدئين وهي على الرابط التالى : -

موسوعة دروس للغة الـــ php

اما الحين راح احط موسوعة المتقدمه

::::دروس متقدمة::::

المهام المجدولة باستخدام Cron ... : -


مقدمة
صبيحة كل يوم اتلقى في بريدي على العمل رسالة اليكترونية تحمل لي اخبار اليوم المهمة من موقع الجزيرة. لم اشترك في اي خدمة او موقع بل ان هذه الرسالة اتت من موقعي الخاص... كيف؟ ملف بي اتش بي لا يتعدى الثلاثين سطرا يقوم من النوم في السادسة تماما و يقرأ الاخبار من موقع الجزيرة ثم يرسل العنوانين بالروابط الى بريدي الخاص ....
في هذا المقال سوف نرى كيف يمكنك ان تنفذ ملفات PHP في اوقات معينة دون ان تطلب من المتصفح باستخدام ميزة لأنظمة تشغيل المزودات تدعى Cron Jobs و التي سنترجمها الى "المهام المجدولة"

في هذا الدرس مفصل سنرى النقاط التالية:

- التنفيذ التلقائي للملفات على مزودات لينكس
- كيف تصنع مهمة مجدولة على لينكس؟
- موقعي لا يدعم المهام المجدولة... هل هنالك حل؟
- تطبيق: اخبار موقع الجزيرة على بريدك كل صباح ...


التنفيذ التلقائي للملفات على مزودات لينكس

سؤال : ماهي الطرق التي يمكن ان تتنفذ بها صفحة بي اتش بي على الانترنت ؟

- ان يطلبها المستخدم مباشرة عبر كتابة الرابط الى الصفحة في متصفح ما ...
- ان يطلب المستخدم صفحة بي اتش بي تحتوي على تضمين include لتلك الصفحة...
- ان يطلب المستخدم صفحة ما تقرأ تلك الصفحة عبر البرمجة : فمثلا يمكنك قراءة صفحة بي اتش بي من خلال صفحة اخرى باستخدام fread كما هو دارج في جوالب الاخبار ..كما في (الكود code من الدليل):
Code ..


<?php
$handle = fopen(&quot;http://www.example.com/MyPage.php&quot;, &quot;rb&quot;
$contents = &quot;&quot;;
do {
$data = fread($handle, 8192);
if (strlen($data) == 0) {
break;
}
$contents .= $data;
} while (true);
fclose($handle);
?>









الملاحظ ان كل هذه الطرق تبدا في مرحلة ما من طلب المستخدم عبر متصفحه للصفحة مباشرة او لصفحة اخرى مرتبطة بها ...

لو حذفنا المستخدم من المعادلة فان هنالك طرفا واحد يمكنه الوصول الى الصفحة ! و فوق ذلك لده القدرة على متابعة الزمن .... انه نظام التشغيل المنصب على المزود ... فهو الوحيد القادر على الوصول الى تلك الصفحة ...
هنالك خاصية في نظام التشغيل ويندوز تتيح لك تشغيل البرامج تلقائيا و بصفة متكررة دون الحاجة الى ان تشغل انت ذلك البرنامج ... فلو اردت عمل فحص للفيروسات او الغاء تجزئة القرص الصلب كل ليلة او ليلة كل جمعة حيث لا تكون في مكتب العمل و لا تضطر الى ايقاف عملك فان ما عليك هو اضافة هذه المهمة الى برنامج &quot;المهام المجدولة&quot; ....
اين توجد خاصية المهام المجدولة على الويندوز ؟
اذهب الى &quot;ابدأ&quot; ثم &quot;تشغيل&quot; و اكتب tasks ... ستظهر لك نافذة البرنامج المسؤول عن جدولة و تنفيذ المهام في ويندوز ... بامكانك اضافة مهمة مثل تشغيل برنامج معين او عمل فحص فيروسات و تحديد متى تريد ان يتم و كيف يتكرر عمل ذلك ... جرب اضافة مهمة و تعرف على خصائص البرنامج...

نظام التشغيل لينكس ,الذي يعد الخيار الافضل و الأكثر شهرة بين المواقع التي تعتمد على بي اتش بي, يحتوي على ميزة تدعى cron jobs او المهام المجدولة كما عربناها... و التي تعمل تماما مثل المهام المجدولة على الويندوز فهذه الميزة تتيح للمستخدم ان يطلب من النظام تنفيذ امر command معين في وقت معين بصفة دورية .... يعمل البرنامج cron باستمرار على نظام التشغيل و ينفذ المهام متى ما حان وقتها ...

ملاحظة : اعتمادا على سياسات مقدم المساحة لموقعك فقد لا يكون لك الصلاحية بارسال المهام الى cron لتنفيذها .. قد تكون الميزة معطلة بشكل دائم و غير متوفرة مطلقا في عرض الاستضافة HOTING او يلزمك مخاطبة الدعم الفني و طلب اعداد تلك المهمة منهم ... لكن بعض المواقع تسمح لك باعداد المهام المجدولة من لوحة التحكم مثل Cpanel ... الطريق الوحيدة لتتأكد هي ان تخاطب الدعم الفني

كيف سيمكننا ان ننفذ الكود code باستخدام المهام المجدولة على لينكس ؟
الجواب يعتمد على كيفية اعداد بي اتش بي على المزود ... ! انظر الى الشكل التالي :



تركب بي اتش بي على مزود الويب اباشي على شكلين :
الاول : بي اتش بي برنامج قائم بذاته
الثاني: بي اتش بي مدمجة في اباشي

الاول: ان تركب بي اتش بي مستقلة عن مزود الويب كبرنامج قائم بذاته لا يعتمد على غيره... و تضبط اعدادات مزود الويب &quot;اباشي مثلا&quot; بحيث يرسل كل الصفحات التي تنتهي بالامتداد php او phtml الى هذا البرنامج لكي ينفذها و يرجع النتيجة الى المستخدم ...
في هذه الحالة الامر سهل فكل ما علينا هو ان نطلب من مدير المهام المجدولة ان ينفذ الملف التنفيذي ,عادة php.exe, و يرسل له الصفحة ... تماما كما لو كنت كتبت الامر على المحث command prombt (في نافذة الدوس على الويندوز مثلا) كالتالي :
Code ..


php c:\files\index.php





طبعا مسار الملف سيكون مختلفا على اللينكس... لكن هذا يكفي ليقرب المعلومة ...

الثاني : ان تركب بي اتش بي مدمجة في اباشي .. اي ان يكون كود code بي اتش بي قد اضيف الى كود code اباشي قبل عمل الملف التنفيذي لاباشي ... وبهذا تعمل بي اتش بي على المزود بمجرد تشغيل اباشي و تكون دوال بي اتش بي مجرد دوال في اباشي فمثلا الدالة mysql_connect عندما يراها مترجم بي اتش بي في الكود code يقوم بمناداة الدالة php_mysql_connect ...
و هنا مشكلة لان بي اتش بي الان لا يمكن الوصول لها الا عن طريق مزود الويب و مزود الويب لا يستمع الى الاوامر الا عن طريق منفذ معين على الجهاز و لا يمكننا ارسال الاوامر الى اباشي الا عن طريق ذلك المنفذ... اي ان الصفحة يجب ان تطلب من خلال بروتوكول HTTP .. بمعنى اخر : يجب ان تطلب الصفحة من خلال متصفح للانترنت ... فما العمل ؟

اذهب الى ابدأ ثم اختر تشغيل و اكتب الامر التالي :
Code ..


explorer http://www.islamway.net





ستجد ان متصفح الانترنت قد فتح نافذة جديدة و ذهب الى موقع اذاعة طريق الاسلام ... اذا لو وضعت هذا الامر &quot;explorer

http://www.islamway.net/index.php&quot; كمهمة متكررة في مدير المهام المجدولة فانك ستنفذ الصفحة index.php بشكل مستمر ... !

لتنفيذ نفس الفكرة على لينكس بامكانك استخدام متصفحات اخرى مثل lynx بالشكل التالي :
Code ..


lynx http://www.islamway.net/index.php






اما لو كانت النسخة التي لديو اذا كانت بي اتش بي مركبة على شكل النسخة المدمجة في اباشي فانه يتوجب علينا استخدام احدى المتصفحات التي تأتي مع لينكس لكي ننفذ الصفحة بها...اما اذا كانت على شكل مستقل فانه يسعنا ان نرسل ملف البي اتش بي الى المترجم لتنفيذها او نستخدم طريقة المتصفح السابقة... لا تنس هذا !

كيف تعرف اي نسخة لديك؟
اطبع معلومات بي اتش بي باستخدام phpinfo ... في السطر الثالث تقريبا قيمة الخاصية Server API تحدد ذلك : اذا كانت apache فنسختك مدمجة اما اذا كانت CGI فنسختك مستقلة عن مزود الويب ...

دعنا نرى في القسم التالي كيف يمكننا ان نجعل لينكس ينفذ هذه الاوامر بشكل مستمر ...


كيف تصنع مهمة مجدولة على لينكس؟

كما اسلفنا فانه يوجد على نظام التشغيل لينكس برنامج يدير المهام المجدولة يدعى cron .. يصحو cron كل دقيقة لينفذ المهام الموجودة في ملفات تعليماته و التي تسمى crontabs ... تحتوي هذه الملفات على الاوامر التي يجب على مدير تنفيذها و على كيف سيتكرر تنفيذ هذه الاوامر... بشكل عام اكبر مدة يمكن ان تفصل بين تنفيذين للكود code هي سنة ... دعنا نرى كيف نتخاطب مع مدير المهام المجدولة على لينكس :
Code ..


Minutes Hours Days Months WeekDay command





لاحظ ان الفاصل بين مكونات الامر هو فراغ ... المكونات هي كالتالي :
Minutes : الدقائق و هي من 00 الى 59
Hours : الساعات من 0 الى 23 حيث 23 هي الحادية عشرة من الليل
Days : الايام من 1 الى 31
Months : الاشهر من 1 الى 12
WeekDay : اليوم من الاسبوع وهي من 0 الى 6 حيث اليوم رقم 0 يرمز الى الاحد
command : ما تود من نظام التشغيل تنفيذه ... لاحظ ان هذا امر نظام تشغيل و ليس جملة joomla بي اتش بي ...

اذا باستخدام اول خمس خانات نحدد لمدير المهام المجدولة الوقت الذي ينفذ فيه المهمة المعطاة في الخانة السادسة...

ماذا تعني هذه الخانات ؟ تعني في اي شهر من السنة و اي يوم من ذلك الشهر و اي ساعة من ذلك اليوم ثم اي دقيقة من تلك الساعة تود ان ينفذ الامر المعطى ....
قيمة هذه الخانات يمكن ان تكون :
- رقما واحدا يدل على قيمة واحدة
- علامة * لتدل على اي قيمة حسب التعاريف التي ذكرناها في الاعلى
- مجموعة من الارقام مفصولة بفاصلة مثل 1,2,5,6 لتعني اي رقم فيها اي : 6 او 5 او 2 او 1
- فترة من الارقام عبارة عن رقمين مفصولين بشرطة ... فلو كانت قيمة Days هي 9-11 فان هذا يعني اليوم التاسع و اليوم العاشر و اليوم الحادي عشر..

مثال :
التعليمة التالية :
Code ..


0 0 15 3 * myprogram





ستنفذ البرنامج myprogram في الخامس عشر من شهر مارس (الشهر الثالث من السنة) عند الساعة الثانية عشرة من الليل تماما و ذلك في اي يوم من الاسبوع وافق ذلك ..
الصفر الاول : يعني الدقيقة اللاولى في الساعة
الصفر الثاني: يعني الساعة الثانية عشرة
15 : تعني اليوم الخامس عشر من الشهر
3: تعني الشهر الثالث من السنة اي مارس
* : تعني اي يوم في الاسبوع

لو عدلناه الى التالي :
Code ..


0 0 * * 1 myprogram





فان البرنامج سينفذ كل يوم اثنين (تذكر ان صفر يعني يوم الاحد) من كل شهر في السنة عند الساعة الثانية عشرة تماما
ولو عدلناه الى التالي فسينفذ الكود code في تمام الساعة السابعة صباحا و الساعة السابعة مساء من كل يوم في شهر يناير و فبراير من كل سنة
Code ..


0 7,19 * 1,2 * myprogram





ولو عدلناه الى التالي فسينفذ البرنامج كل نصف ساعة كل ثلاثاء من كل شهر في السنة
Code ..


0,29 * * * 2 myprogram






لا تحتاج الى حفظ هذه الاشياء مع انها ليست صعبة ... فهنالك هذه الاداة التي تمكنك من صناعة هذه الجملة joomla بسهولة على هذه الصفحة:
http://www.mtsdev.com/opensource/phpcrontab.php
و بامكانك الحصول على مصدره من:
http://www.mtsdev.com/opensource/php...utorial.tar.gz

سأعرب هذه الاداة الجميلة ان شاء الله و اضعها لاحقا في قسم التعليقات على هذا الدرس مفصل ....

الان ... اذا وضعت اوامر البي اتش بي في ملف و ليكن MyCron.php و اردت ان تشغله كل يوم جمعة في تمام الساعة الحادية عشرة مساء من كل اسبوع فان الامر سيكون كالتالي :
اذا كانت نسخة بي اتش بي مدمجة فان علينا كما سبق ان نستخدم اي متصفحا على لينكس كالتالي ..
Code ..


0 23 * * 5 lynx http://www.example.com/path/to/your/MyCron.php





اذا كانت النسخة مستقلة فان بامكانك ايضا استعمال المترجم مباشرة كالتالي :
Code ..


0 23 * * 5 php /path/to/your/MyCron.php






هذا كل ما هنالك ... الان اذا كنت ستنفذ هذه المهمة على موقعك على الويب فتأكد من وجود الخدمة لديك ... اتصل بالدعم الفني و اسألهم عن كيفية وضع اوامر cron ... اما اذا كنت تريد اختبار هذه الحركة على جهازك اولا .. فضعها في مهمة مجدولة باستخدام مدير المهام المجدولة على ويندوز..
اذهب الى &quot;ابدأ&quot; ثم &quot;تشغيل&quot; و اكتب tasks ... ستظهر لك نافذة البرنامج المسؤول عن جدولة و تنفيذ المهام في ويندوز و اضف المهمة التالية
Code ..


explorer http://localhost/path/to/your/MyCron.php





سنرى في القسم التالي ماذا تعمل لو اكتشفت ان مزود مساحتك على الانترنت لا يدعم او عطل هذه الميزة ..



موقعي لا يدعم المهام المجدولة... هل هنالك حل؟

كما اسلفنا فان ميزة المهام المجدولة قد لا تكون مدعومة على موقعك او بنفس القدر من السوء قد يحدد مضيفك عددا قليلا من المهام التي يمكنك تنفيذها كواحدة او اثنتين و احيانا لا يمنحك الا مهمة في اليوم ... اي لا يمكنك تنفيذ اي مهمة كل ساعة او كل دقيقة ... و هذا يحد من مدى استفادتك من هذه الخدمة ... ماذا نعمل ؟

الفكرة هي ان تضع الاوامر التي تريد تنفيذها في ملف و تضمه باستخدام include في احد الملفات التي تنفذ بشكل مستمر على الموقع.. مثللا الصفحة الرئيسية او صفحة المقدمة header او الذيل footer ومن احدى الحركات الجيدة في ان تضع صورة في الموقع بطول بكسل في عرض بكسل ويكون قيمة الخاصية src هو http://www.example.com/image.php و بذا لن تحتاج الى تعديل الى ملف من ملفات موقعك ...

لنفرض اننا وضعنا الاوامر التي نريد تنفيذها في الملف cron.php وعملنا لها تضمين في احد الملفات التي يتكرر استخدامها
Code ..


<?
include('cron.php');
?>





الان سيتنفذ الكود code كل مرة يطلب فيها ذلك الملف .... هذا جيد ..لكنه ليس ما نريد ... لاننا قد نرغب في تنفيذ الكود code كل شهر مثلا !
لذلك قام احد المبرمجين بكتابة برنامج يدعى Pseudo-cron تجده على الرابط
http://www.bitfolge.de/?l=en&s=pseudocron

يستخدم هذا البرنامج نفس الاوامر التي يستخدمها مدير المهام المجدولة cron .... و يقوم بتضمين الملفات متى اتى الوقت لذلك .. بينما انت تقوم بربط

البرنامج باحد الملفات التي يكثر استخدامها على موقعك ...

في القسم التالي سنرى تطبيقا عمليا ...


تطبيق: اخبار موقع الجزيرة على بريدك كل صباح ...

كما رأيت معنا في الاقسام السابقة فـ cron او المهام المجدولة لا تتطلب اوامرا خاصة في بي اتش بي ... انما هي عمليات اعداد للملفات على المزود ..
سأعطيك الكود code الذي استخدمه لارسال اخر اخبار الجزيرة الى بريدي كل يوم ...عدلت في احد جوالب الاخبار ليقوم بارسال النتيجة الى بريدي بدلا من

طباعته الى المستخدم ...هذا هو:
Code ..


<?
// News Grapper
$url = &quot;http://www.aljazeera.net/news/arabic/&quot;;
$string = implode(&quot;\n&quot;, file($url));
$string2 = explode(&quot;<!--start second News-->&quot;, $string);
$string3 = explode(&quot;<!--end second News-->&quot;, $string2[1]);
$news = str_replace('href=&quot;../../news/arabic/',&quot;href=\&quot;$url&quot;,$string3[0]);
$news = str_replace('>- ',&quot;>&quot;,$news);

preg_match_all(&quot;/href[[:space:]]*=[[:space:]]*&quot;.&quot;[\&quot;']{0,1}([^\&quot;'> ]+)/i&quot;,
$news,$arr,PREG_SET_ORDER);
preg_match_all(&quot;|>([^<]*)</a|i&quot;,$news,$arr_text,PREG_SET_ORDER);



$HTML = &quot;LATEST JAZIRAH NEWS @ YOUR BOX !<br>&quot;;
for ($i=0;$i<count($arr);$i++)
{
if ($arr_text[$i][1]!=&quot;&quot
{
$HTML .= &quot;- <a href='&quot;.$arr[$i][1].&quot;'>&quot;.$arr_text[$i][1].'</a><br> \n';;
}
}


/* recipients */
$to = &quot;[email protected]&quot; ;
/* subject */
$subject = &quot;Jazeera News Update...&quot;;

/* message */
$message = &quot;
<html>
<head>
<title>Jazeera News Update...</title>
</head>
<body>
$HTML
</body>
</html>
&quot;;

/* To send HTML mail, you can set the Content-type header. */
$headers = &quot;MIME-Version: 1.0\r\n&quot;;
$headers .= &quot;Content-type: text/html; charset=windows-1256 \r\n&quot;;

/* additional headers */

$headers .= &quot;Automated News <[email protected]>\r\n&quot;;

echo $message;
/* and now mail it */
mail($to, $subject, $message, $headers);
?>





كل ما عليك هو حفظ هذا الكود code في ملف و اعداد موقعك لينفذه حسب المدة و التكرار الذي تريده بأي من الطرق التي رأيناها في هذا الدرس مفصل ...










©المشاركات المنشورة تعبر عن وجهة نظر صاحبها فقط، ولا تُعبّر بأي شكل من الأشكال عن وجهة نظر إدارة المنتدى©