الساده أعضاء سوالف سوفت
السلام عليكم ورحمة الله وبركاته
تحية طيبه
سندرس اليوم شيئا طالما تساءل البعض عنه
وهو استخدام تقنية cron وتشغيل ملفات php من تلقاء نفسها بدون الحاجة الى الاستدعاء
تستخدم تقنية cron لانشاء مهام مجدوله للسيرفر وهو يعنى انك ستكون لديك قدرة بعمل تشغيل لسكربتك كل ساعه او كل دقيقه أو كل أسبوع ... الخ , بصورة تلقائية بدون الحاجه الى تنفيذها يدويا.
أنت كمبرمج استخدام لتقنية cron سيكون فى عملية maintenance والتى تختص بالاصلاح والبحث عن الاخطاء وتدور حول كفاءة السكربت وجودتة.
يتخلص محور حديثنا على ما يلى :- ما هى cron
- طريقة استخدام cron فى CPanel
- بنية أمر cron
- cron تفصيلا فى php
- أمثلة على استخدام cron
- مصادر cron
ما هى cron
هى الأداه الأكثر فعاليه فى تشغيل السكربتات اوتوماتيكيا بدون تدخل المستخدم عن طريق مهام مجدوله ومحدده بتاريخ التنفيذ ومعدل التكرار بصفه دورية أى تنفيذ الكود كل ساعه أو كل يوم ... الخ
يذكر أن المهمه الأساسيه للcron هى تنفيذ أوامر لينكس على السيرفرات بصفه دورية فمثلا تنفيذ أمر لتفريغ مجلد temp تلقائيا كل أسبوع حتى لا يتسبب فى تضخم فى حجم استهلاك القرص
وعادة الاستخدام الشائع لل cron فى php هو فى اجراء العمليات الخاصه بالصيانه الخاصه بالسكربت وقواعد البيانات فيمكنك برمجة صفحة يتم تنفيذها كل أسبوع تقوم بتصحيح الأخطاء فى ملفات الأعضاء ... الخ
تسمى تلك التقنيه ب cron فى سيرفرات لينكس أما بوندوز فتسمى ب scheduler
طريقة استخدام cron فى CPanel :
اذا كنت معتادا على التعامل مع الشل فببساطه يمكنك كتابة الأمر التالى لاظهار كافة تسجيلات cron التى يتم تنفيذها دوريا على السيرفر :
الأمر كالتالى :
يظهر لك مجموعه من الأسطر منها مثلا كما يظهر لدى
كود PHP:
29 1 * * * /scripts/upcp
0 1 * * * /scripts/cpbackup
35 * * * * /usr/bin/test -x /usr/local/cpanel/bin/tail-check && /usr/local/cpan$
*/15 * * * * /usr/local/cpanel/whostmgr/bin/dnsqueue > /dev/null 2>&1
*/5 * * * * /usr/local/cpanel/bin/dcpumon >/dev/null 2>&1
2,58 * * * * /usr/local/bandmin/bandmin
كل سطر من الاسطر السابقه يمثل أمر من أوامر cron ويتم تنفيذه فى وقت معين بطريقة دورية .
وسيتم دراسة كل شئ تفصيلا .
واذا نظرنا الى طريقة اضافة أمر تنفيذ cron عن طريق CPanel الخاصه بموقعك فيتم عن طريق الأيقونة التاليه :

اذا دخلنا الى cron بال CPanel سنجد أنها مقسمة الى طريقتين يمكنك من خلالهم اضافة أمر cron وهم :
ملحوظه : سأفترض أن العمل على CPanel 11- The Standard GUI
- Advanced (Unix Style) Option

الطريقة الاولى : The Standard GUI
تظهر كما بالسى بنل :

[/CENTER]
وهنا يتم تحديد بالخيار الاول البريد الالكترونى الذى تريد ان يتم ارسال ناتج تنفيذ أمر cron اليه .
وبالخيار الثانى يتم كتابة الأمر الذى سيتم تنفيذه أو مسار الملف الذى سيتم تنفيذه .
ثم بعد ذلك الوقت الذى سيتم التنفيذ به الأمر ويتم تحديد به :- Minute(s) الدقائق
- Hours(s)الساعات
- Days(s)الأيام
- Month(s)الشهور
- Weekday(s)أيام الاسبوع
بعد الانتهاء من تحديد الوقت قم بحفظ الأمر ليظهر لك صفحة تأكيد حفظ الأمر .
الطريقة الثانية : Advanced (Unix Style) Option

اذا نظرنا هنا سنجد ان شكل كتابة الأوامر هو مشابة بدرجه كبيره الى سلسلة الأوامر التى جلبناها من تنفيذ الأمر crontab -e على الشل
نلاحظ هنا أن بالخيار الأول يتم تحديد البريدالالكترونى الذى سيتم ارسال ناتج تنفيذ أمر cron اليه
أما بعد ذلك هو الوقت والأمر وسيتم التحدث بذلك لاحقا .
اذا كنت على خبرة بأوامر لينكس وصيغة كتابتها فقم بكتابتة وقم بحفظ الناتج وستظهر لك صفحة تأكيديه .
بنية أمر cron
بنية أمر cron هو شئ سهل للغاية
فاذا نظرنا الى أحد الاوامر مثلا
كود PHP:
29 1 * * * /scripts/upcp
وقمنا بتفصيلة بصورة مفصله سنجد أنه ينقسم الى ما يلى بصورة تسلسلية من الشمال الى اليمين :- الدقائق وتمثيلها يكون من 00 الى 59
- الساعات وتمثيلها يكون بصيغة 24 ساعه أى يكون من 00 الى 23
- الأيام وتمثيلها يكون من 1 الى 31
- الشهور وتمثيلها يكون من 1 الى 12
- يوم الاسبوع ويكون تمثيله بطريقتان :
- 3 حروف يمثلوا يوم الأسبوع المراد : sat , sun , mon , tue , wed , thu , fri وهم يمثلون ايام الاسبوع بالترتيب ابتداء من السبت انتهاء الى الجمعه
- ارقام يتم تمثيلهم برقم من صفر الى 6 حيث يمثل صفر يوم السبت وواحد يوم الأحد وهكذا الى يوم الجمعه
- الامر أو مسار الملف الذى يتم تنفيذه فى الوقت المحدد
يمثل وضع علامة النجمه * أن يتم تنفيذها دوريا أى كل يوم أو كل ساعه أو كل دقيقه ..., الخ وهو ما يسمى wildcard وهو مصطلح متعارف عليه لدى المهتمين بالشبكات والاتصالات .
اذن فالأمر السابق يعنى أن السكربت سيتم تنفيذه كل يوم و كل شهر الساعه الواحدة و29 دقيقه .
ولكن ماذا سنفعل اذا كنا نريد تنفيذ السكربت أو الأمر كل 5 دقائق
نستطيع كتابة ذلك بعدة طرق :- الاولى: وهو كتابة كافة الدقائق المراد تنفيذ عندها مفصولة بفاصلة كما يلى :
كود PHP:
0 ,5,10,15,20,25,30,35,40,45,50,55 * * * * /path/to/command
وهنا تم تحديد تنفيذ السكربت بالدقيقه رقم 0 و 5 و 10 و 15 ..., الخ - الثانية: يوجد ب cron صيغة يتم استخدامها باستخدام * والمثال التالى يوضح ذلك
كود PHP:
*/5 * * * * /path/to/command
كلا المثالين لا يختلف فى تنفيذه عن الأخر شئ
cron تفصيلا فى php
أمر cron يكون على الصورة التالية :
كود PHP:
[ Minute - Hour - Day - Month - Weekday ] - Command
وكما ذكرنا سابقا على أن ما بداخل الأقواس يمثل الوقت الذى سيتم التنفيذ به
وCommand يتم تقسيمه الى
كود PHP:
[PATH OF PHP] [ARGUMENTS] [PATH OF PHP SCRIPT]
اذن يصبح أمر cron كاملا هو كما يلى :
كود PHP:
[ Minute - Hour - Day - Month - Weekday ] [PATH OF PHP] [ARGUMENTS] [PATH OF PHP SCRIPT]
ونأتى لتفصيله كما يلى
أولا : وقت تنفيذ الأمر [ Minute - Hour - Day - Month - Weekday ] :
تم تفصيله سابقا ولكن قد يكون عملية استخدام علامة النجمه * تمثل بعض الغموض ولهذا سنتعرض له كما يلى :
كود PHP:
* * * * * => تنفيذ كل دقيقه
0 * * * * => تنفيذ كل ساعه
0 0 * * * => تنفيذ كل يوم
0 0 0 * * => تنفيذ كل شهر
0 0 0 0 * => تنفيذ كل اسبوع
ننتقل الى الجزء الثانى [PATH OF PHP] :
كود PHP:
PATH TO PHP : /usr/local/bin/php
هنا يتم استخدامه /usr/local/bin/php وهو يمثل مسار المترجم الخاص بترجمة سكربتات php على سيرفرات لينكس
الجزء الثالث [ARGUMENTS] :
عباره عن بعض الاوامر التى تؤثر فى تنفيذ السكربت ويمكن الاستغناء عن هذا الجزء وعدم كتابته
كود PHP:
-a Run interactively
-b <address:port>|<port> Bind Path for external FASTCGI Server mode
-C Do not chdir to the script's directory
-c <path>|<file> Look for php.ini file in this directory
-n No php.ini file will be used
-d foo[=bar] Define INI entry foo with value 'bar'
-e Generate extended information for debugger/profiler
-f <file> Parse <file>. Implies `-q'
-h This help
-i PHP information
-l Syntax check only (lint)
-m Show compiled in modules
-q Quiet-mode. Suppress HTTP Header output.
-s Display colour syntax highlighted source.
-v Version number
-w Display source with stripped comments and whitespace.
-z <file> Load Zend extension <file>.
الجزء الرابع [PATH OF PHP SCRIPT] :
وهو يمثل مسار الملف الذى سيتم تنفيذه وهنا يجب كتابة مسار الملف كاملا ابتداء من الروت
فمثلا اذا كان اسم المستخدم الخاص بموقعك هو mrajax
فيكون مسار الملف هو
كود PHP:
/home/mrajax/public_html/
فاذا كانت اسم الملف file.php وموجود داخل مجلد public_html فسيكون مسار الملف هو
كود PHP:
/home/mrajax/public_html/file.php
وعلى هذا يكون الامر مثلا الخاص بنا هو :
كود PHP:
0 * * * * /usr/local/bin/php -q /home/mrajax/public_html/cron/file.php
أمثلة على استخدام cron
كود PHP:
29 1 * * sat /usr/local/bin/php $HOME/script.php
هنا سيتم تنفيذ السكربت كل يوم سبت الساعه الواحده و29 دقيقه الأمر التالى /usr/local/bin/php $HOME/script.php
كود PHP:
0 2 * * * /usr/local/bin/mysqldump -db_user -db_password db_name > /home/www/backups/dbname-`date +\%s`.sql
أمر يستخدم لجلب نسخ احتياطيه من قواعد البيانات
مثال على جلب نسخ احتياطيه من الموقع وقواعد البيانات بصورة كاملة
نقوم بعمل ملف php به الكود التالى ونضعه فى home dir وليس www:
كود PHP:
<?php
// PHP script to allow periodic cPanel backups automatically, optionally to a remote FTP server.
// This script contains passwords. KEEP ACCESS TO THIS FILE SECURE! (place it in your home dir, not /www/)
//code by justin-cook
// ********* THE FOLLOWING ITEMS NEED TO BE CONFIGURED *********
// Info required for cPanel access
$cpuser = "username"; // Username used to login to CPanel
$cppass = "password"; // Password used to login to CPanel
$domain = "example.com"; // Domain name where CPanel is run
$skin = "x"; // Set to cPanel skin you use (script won't work if it doesn't match). Most people run the default x theme
// Info required for FTP host
$ftpuser = "ftpusername"; // Username for FTP account
$ftppass = "ftppassword"; // Password for FTP account
$ftphost = "ftp.example.com"; // Full hostname or IP address for FTP host
$ftpmode = "ftp"; // FTP mode ("ftp" for active, "passiveftp" for passive)
// Notification information
$notifyemail = "you@example.com"; // Email address to send results
// Secure or non-secure mode
$secure = 0; // Set to 1 for SSL (requires SSL support), otherwise will use standard HTTP
// Set to 1 to have web page result appear in your cron log
$debug = 0;
// *********** NO CONFIGURATION ITEMS BELOW THIS LINE *********
if ($secure) {
$url = "ssl://".$domain;
$port = 2083;
} else {
$url = $domain;
$port = 2082;
}
$socket = fsockopen($url,$port);
if (!$socket) { echo "Failed to open socket connection… Bailing out!\n"; exit; }
// Encode authentication string
$authstr = $cpuser.":".$cppass;
$pass = base64_encode($authstr);
$params = "dest=$ftpmode&email=$notifyemail&server=$ftphost&user=$ftpuser&pass=$ftppass&submit=Generate Backup";
// Make POST to cPanel
fputs($socket,"POST /frontend/".$skin."/backup/dofullbackup.html?".$params." HTTP/1.0\r\n");
fputs($socket,"Host: $domain\r\n");
fputs($socket,"Authorization: Basic $pass\r\n");
fputs($socket,"Connection: Close\r\n");
fputs($socket,"\r\n");
// Grab response even if we don't do anything with it.
while (!feof($socket)) {
$response = fgets($socket,4096);
if ($debug) echo $response;
}
fclose($socket);
?>
ونضع هذا الأمر ب crontab
كود PHP:
15 2 * * * /usr/local/bin/php /home/youraccount/fullbackup.php
وهنا سيتم تنفيذ السكربت كل يوم الساعه 2:15
او مثلا استخدام هذا الأمر ب crontab
كود PHP:
15 2 * * 1 /usr/local/bin/php /home/youraccount/fullbackup.php
وهنا سيتم التفيذ كل يوم أحد الساعه 2:15
مصادر cron :
cPanel - cPanel 11 Documentation : Advanced - Cron Jobs
Cron Jobs Tutorial
بنهاية شرحى لا أطلب منكم الا الدعاء لى والدعاء الصادق للمسلمين
وارجو ن أكون قد وفقت فى ايصال المعلومه اليكم
وأرجو حفظ حقوقى عند نقل الموضوع لمكان آخر
أدام الله أيامكم بالسعاده
تحياتى
Mr.Ajax