السلام عليكم ورحمة الله و بركاته
هل تظن أن لغة php هي لغة خاصة ببرمجة تطبيقات الويب و لا يمكنها الخروج من نافذة المتصفح كما بقية scripting languages كلغة python و perl ؟!
إذا كنت تعتقد ذلك فإسمح لي أن أقول لك إنك لم تتطلع على كافة إمكانيات اللغة :) , لربما هذا الكلام صحيحا منذ سنوات طوال لكن ليس الآن فبعد إطلاق إصدار php5 أصبحت php لغة برمجة بحق فأصبحت تدعم البرمجة غرضية التوجه (وإن لم يكن جميع خصائصها) و اصبحت سريعة للغاية , فما المانع من إستخدامها لادارة الأنظمة ؟
تسمح php من استدعاء مفسرها عن طريق الطرفية كما في باقي لغات scripting languages منذ الإصدار 4.3 و يمكنها الكتابة و القراءة من منافذ الدخل STDIN و الخرج STDOUT و الخطأ STDERR كما يمكنها أن تقبل الوسائط المُمررة إليها عند استدعاء الملف .
ما يلزمك قبل البدء :
طبعاً يلزم معرفة أساسيات php وكيفية استخدام المتغيرات و القراءة و الكتابة على الملفات و في حال القيام بالعمليات المعقدة يلزمك تعلم التعابير النظامية (يمكنك الإطلاع على كتاب "المدخل الى لغة php" الذي يُغطي اساسيات هذه المواضيع .
وبالطبع أي توزيعة linux و مفسر php ويمكنك الحصول عليه من المستودعات ويكون باسم php5-cli (طبعاً إن لم يكن لديك خادم ويب يحوي مفسر php) ولتنصيبه على التوزيعات المبنية على debian يمكنك استخدام هذا الأمر في الطرفية :
# apt-get install php5-cli
البنية الأساسية لملفات php التي يتم استدعاءها من الطرفية :
كما في سكربتات باقي اللغات يتم استخدام ما يُمسى shebang أو الرمز "#!" الذي يدل على مسار مفسر php (عادة ما يكون على المسار /usr/bin/php لكن لا ضير من استدعاء التعليمة which php) ومن ثم يتم كتابة سكربت php كالمعتاد :
#!/usr/bin/php<?php//php script contents?>
القراءة و الكتابة من (وعلى) الطرفية :
يوجد طريقتين للكتابة على الطرفية : الطريقة الأولى و الأسهل هي استخدام دوال الخرج العادية print أو print_r أو sprintf أو بالطبع الكلمة المحجوزة echo , أما الطريقة الثانية هي الكتابة على مجرى الخرج STDOUT عن طريق إحدى دوال الكتابة على الملفات fwrite أو fputs . المثال التالي يستعرض الطريقتين :
#!/usr/bin/php <?php echo "This is my first php-cli script :)\n"; fwrite(STDOUT, "This string is writen by fwrite function\n"); ?>
أما للقراءة من الطرفية يتم استخدام إحدى دوال القراءة من الملفات fread أو fgets :
#!/usr/bin/php <?php echo "please enter your name : "; $name = fgets(STDIN); echo "Welcome mr.$name"; ?>
الحصول على المتغيرات التي تُمرر الى البرنامج :
أغلب برامج سطر الأوامر يمكن تمرير مُختلف الوسائط إليها بعد اسم الملف , في php يمكن ذلك بكل سهولة عن طريق استخدام $_SERVER['argc'] التي تُحدد عدد الوسائط التي تم تمريرها الى السكربت بالطبع إن لم يتم تمرير أي وسيط ستكون لها القيمة 1 لأن اسم السكربت عادة يكون أول وسيط كما في باقي اللغات ; و المصفوفة $_SERVER['argv'] الذي يُمثل كل عنصر من عناصرها وسيطا من الوسائط (كما إتفقنا أول عنصر يكون دوماً اسم السكربت) :
#!/usr/bin/php
<?php
echo "listing program argrements : \n";
echo "----------------------------\n";
for($i = 1; $i < $_SERVER['argc']; $i++) //you can use count($_SERVER['argv']) insted of $_SERVER['argc'] :)
{
echo "$i arg value is : {$_SERVER['argv'][$i]}\n";
}
?>
بعد تعلم الأساسيات لنبدء الآن بتعلم كيفية دمج ما تعلمناه بعمليات بسيطة لها علاقة بإدارة الأنطمة
البحث عن قيمة في ملفات و استبدالها تلقائياً :
على الرغم من أن أي مستخدم متوسط ~ محترف في استخدام سطر الأوامر يمكنه عمل ذلك بسهولة لكن يمكن تبسيط الأمور أكثر و كتابة سكربت php للقيام بتلك المهمة :
#!/usr/bin/php
<?php
echo "listing program argrements : \n";
echo "----------------------------\n";
for($i = 1; $i < count($_SERVER['argv']); $i++)
{
if(is_file($_SERVER['argv'][$i]))
{
$file = file_get_contents($_SERVER['argv'][$i]);
$new_contents = str_replace('word1', 'word2', $file);
file_put_contents($_SERVER['argv'][$i], $new_contents);
echo "replaced all 'word1' in file {$_SERVER['argv'][$i]} with 'word2'\n";
}
}
?>
طبعاً يتم استبدال جميع تكرارات الكلمة "word1" في ملف وليكن file.txt بالكلمة "word2" ويتم استدعاء السكربت على الشكل التالي :
$ ./srcipt.php file.txt
زيادة مرونة السكربتات : استدعاء أوامر النظام داخل سكربت php :
توفر php عدداً لا باس به من دوال التعامل مع الملفات التي يتشبه الى حدٍ ما أوامر نظام التشغيل نفسه (في الواقع هي مشتقة منه) , لكن في بعض الأحيان قد لا تجد الأمر المناسب إلا باستخدام تعليمات النظام نفسها على سبيل المثال إخذ نسخة إحتياطية من مجلد أو أكثر و جمعهم بأرشيف tar . لتنفيذ تعليمات على مستوى النظام يمكن استخدام احدى الدالتين exec أو system أو باسخدام رمز "`" الشهير :
#!/usr/bin/php<?phpecho `ls -la /`;?>
المثال السابق يُظهر المجلدات و الملفات في المجلد الرئيسي أو root dir .
#!/usr/bin/php
<?php
$name = 'archive.tar';
$files = '';
for($i = 1; $i < $_SERVER['argc']; $i++)
{
is_file($_SERVER['argv'][$i]) == true ? $files .= $_SERVER['argv'][$i]. ' ' : null;
}
echo "creating tar archive to the following files :\n";
echo "---------------------------------------------\n";
echo `tar zcvf $name $files`;
?>هذا المثال بسيط للغاية (وغير مُفيد :P لكنني لا أُريد تعقيد الأمور في الأمثلة) يقوم بإنشاء أرشيف من إمتداد tar.gz من قائمة الملفات التي تُمرر إليه .
القوة الحقيقة التي يمكن استخدام سكربتات php فيها هي عند اجراء تعديلات على قواعد البيانات (سواءٍ mysql أو غيرها) وعند التحكم بباقي الأجهزة بالشبكة عن طريق ssh
عن مقالي في مجتمع لينكس العربي
