البرمجة

التعامل مع CLI في PHP

التعامل مع واجهة سطر الأوامر (CLI) في PHP: فهم شامل وآليات متقدمة

تُعتبر واجهة سطر الأوامر (Command Line Interface – CLI) واحدة من أبرز الأدوات التي يمكن استخدامها في بيئة تطوير PHP، خصوصًا عند العمل في الخوادم، أو تنفيذ مهام آلية، أو تشغيل سكريبتات مجدولة (cron jobs)، أو حتى تطوير أدوات داخلية تعتمد على الأوامر. وعلى الرغم من أن PHP يُعرف غالبًا بكونه لغة موجهة لتطوير الويب، إلا أنه يمتلك دعمًا قويًا ومتكاملًا للتشغيل من خلال سطر الأوامر، مما يفتح آفاقًا كبيرة للمطورين لبناء تطبيقات متقدمة خارج نطاق الويب التقليدي.

أولاً: مفهوم PHP CLI

PHP CLI هو الواجهة التي تسمح بتشغيل ملفات PHP مباشرة من خلال الطرفية (Terminal) أو موجه الأوامر (Command Prompt)، بدون الحاجة إلى متصفح أو خادم ويب (مثل Apache أو Nginx). يتم تنفيذ الملفات كبرامج مستقلة ويمكن تمرير الوسائط والأوامر إليها، تمامًا كما يتم مع السكريبتات في لغات مثل Bash أو Python.

عند تثبيت PHP في النظام، يتم تضمين تطبيق php الذي يُستخدم لتنفيذ أوامر من سطر الأوامر. يمكن التحقق من ذلك عبر الأمر:

nginx
php -v

الذي يعرض نسخة PHP المثبتة بالإضافة إلى معلومات عن البيئة التنفيذية.

ثانياً: مميزات استخدام CLI في PHP

  • أداء عالٍ: لا يتم تحميل خادم HTTP، مما يُسرّع من تنفيذ السكريبتات.

  • تشغيل تلقائي: يمكن استخدامه في المهام المجدولة (cron jobs).

  • بناء أدوات مساعدة: مثل أدوات إدارة قواعد البيانات، أو سكريبتات معالجة البيانات.

  • الوصول المباشر للنظام: تنفيذ أوامر Shell والتفاعل مع النظام مباشرة.

ثالثاً: هيكلية السكريبتات في CLI

السكريبتات المعدّة للتشغيل من خلال CLI تكون مشابهة لتلك المستخدمة في صفحات الويب، لكنها غالبًا ما تبدأ بالتأكد من أن البيئة التنفيذية هي CLI وليس خادم ويب، وذلك عبر الكود:

php
if (php_sapi_name() !== 'cli') { exit("This script can only be run from the command line."); }

ويتم تمرير الوسائط إلى السكريبت عبر المتغيرات $argv و$argc:

  • $argv: مصفوفة تحتوي على اسم السكريبت وكل المعاملات المرسلة إليه.

  • $argc: عدد عناصر $argv.

مثال:

bash
php script.php hello world

الكود داخل script.php:

php
print_r($argv);

الناتج:

csharp
Array ( [0] => script.php [1] => hello [2] => world )

رابعاً: التعامل مع الوسائط والأوامر

يمكن بناء سكريبتات أكثر تعقيدًا باستخدام تحليل المعاملات لتشغيل أوامر معينة. مثلًا:

php
$options = getopt("u:p:"); $username = $options['u'] ?? 'default_user'; $password = $options['p'] ?? 'default_pass'; echo "Username: $username\n"; echo "Password: $password\n";

وهذا السكريبت يمكن تشغيله على النحو التالي:

bash
php script.php -u=admin -p=secret

وهنا يستخدم getopt() لتحليل الخيارات المختصرة أو الطويلة، مما يسهل تنفيذ برامج تتصرف مثل أدوات CLI الاحترافية.

خامساً: قراءة من سطر الأوامر (المدخلات التفاعلية)

في بعض الأحيان، يتطلب السكريبت التفاعل مع المستخدم، مثل طلب كلمة مرور أو إدخال قيم معينة. يمكن استخدام الدالة fgets() لقراءة البيانات من STDIN:

php
echo "Enter your name: "; $name = trim(fgets(STDIN)); echo "Hello, $name!\n";

وهذا يتيح بناء أدوات تفاعلية يمكنها أن تسأل المستخدم وتنفذ بناءً على الردود.

سادساً: استخدام الألوان والرموز

لتحسين تجربة الاستخدام وتوفير إشعارات بصرية، يمكن طباعة النصوص بألوان مختلفة باستخدام رموز ANSI:

php
echo "\033[32mSuccess: Operation completed.\033[0m\n"; echo "\033[31mError: Something went wrong.\033[0m\n";

ويمكن كذلك التحكم في النصوص مثل جعلها عريضة، أو مائلة، أو معكوسة.

سابعاً: تنفيذ أوامر النظام

واحدة من أهم ميزات PHP CLI هي القدرة على تنفيذ أوامر النظام مباشرة:

php
$output = shell_exec('ls -la'); echo $output;

كما يمكن استخدام exec() أو passthru() حسب الحاجة. ويجب الحذر من تنفيذ أوامر بناءً على مدخلات غير موثوقة لتجنب ثغرات الأوامر (Command Injection).

ثامناً: إدارة الأخطاء والاستثناءات

عند العمل من خلال CLI، من المهم أن تكون رسائل الخطأ واضحة ومباشرة. يمكن استخدام try-catch مع التنسيق المناسب:

php
try { // code } catch (Exception $e) { fwrite(STDERR, "\033[31mError: " . $e->getMessage() . "\033[0m\n"); exit(1); }

كما يُنصح باستخدام رموز الخروج (exit codes) لتحديد حالة السكريبت:

  • 0: النجاح

  • 1: خطأ عام

  • 2: خطأ في المعاملات

تاسعاً: استخدام Composer في تطبيقات CLI

يمكن دمج Composer لإدارة الاعتماديات وتوسيع قدرات السكريبتات عبر مكتبات مخصصة، مثل:

  • symfony/console: مكتبة لبناء أدوات CLI احترافية.

  • league/climate: مكتبة لتهيئة إخراج الطرفية بالألوان والتنسيق.

مثال باستخدام symfony/console:

bash
composer require symfony/console

ثم بناء أمر بسيط:

php
use Symfony\Component\Console\Application; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class GreetCommand extends Command { protected static $defaultName = 'greet'; protected function execute(InputInterface $input, OutputInterface $output): int { $output->writeln('Hello from CLI!'); return Command::SUCCESS; } } $app = new Application(); $app->add(new GreetCommand()); $app->run();

عاشراً: تنظيم المشاريع الكبيرة باستخدام CLI

عند بناء مشروع PHP كبير يعتمد على CLI، يُنصح بتقسيم السكريبتات إلى أوامر مستقلة، وتنظيم البنية باستخدام هيكل مشابه لـ MVC، خاصة إذا كانت الأداة تقوم بعمليات متكررة مثل:

  • نسخ احتياطي لقواعد البيانات.

  • إرسال تقارير دورية بالبريد الإلكتروني.

  • تحليل سجلات الخادم.

  • تنفيذ مهام تكامل مستمر (CI/CD).

يمكن حينها تنظيم السكريبتات كأوامر داخل مجلد commands/، مع مجلد services/ للخدمات، وconfig/ للتهيئة، مما يسهل صيانة المشروع وتطويره لاحقًا.

الحادي عشر: دمج CLI مع Cron Jobs

من الاستخدامات الشائعة لـ CLI في PHP تشغيل السكريبتات تلقائيًا باستخدام cron:

bash
* * * * * /usr/bin/php /path/to/script.php >> /path/to/log.txt 2>&1

وهذا يتيح تنفيذ المهام تلقائيًا في الخلفية، مثل تنظيف الملفات المؤقتة أو تحديث البيانات من مصادر خارجية.

الثاني عشر: استخدام البيئة والسياقات الديناميكية

في بيئات التطوير المتعددة (تطوير، اختبار، إنتاج)، يمكن استخدام متغيرات البيئة لتحديد السياق:

bash
ENV=production php script.php

داخل السكريبت:

php
$env = getenv('ENV') ?: 'development'; echo "Running in $env environment.\n";

هذا يسمح بتعديل سلوك السكريبت بناءً على البيئة، مثل تغيير الاتصال بقاعدة البيانات أو مسارات الملفات.

الثالث عشر: الجدول التالي يوضح أهم أوامر PHP CLI واستخداماتها

الأمر الوظيفة
php -v عرض نسخة PHP الحالية
php -m عرض الإضافات (extensions) المحملة
php -r 'code;' تنفيذ كود PHP صغير مباشرة من الطرفية
php -l file.php فحص الصيغة اللغوية (Syntax) لملف PHP معين
php -a تشغيل الوضع التفاعلي (Interactive shell)
php script.php تنفيذ ملف PHP
php -d key=value script.php تنفيذ السكريبت مع إعدادات مخصصة لـ ini
php -S localhost:8000 تشغيل خادم PHP المدمج لتجربة الصفحات محليًا

الرابع عشر: الأمن والقيود في CLI

رغم القوة التي يمنحها CLI، إلا أن التعامل مع النظام مباشرة يعرض السكريبتات لمخاطر أمنية. يجب الانتباه إلى:

  • التحقق من جميع المدخلات.

  • عدم تمرير أوامر مباشرة دون تعقيم.

  • إدارة الصلاحيات في النظام وعدم منح صلاحيات تنفيذ عالية للسكريبتات.

  • مراقبة السجلات لتتبع أي تنفيذ غير مشروع.

الخامس عشر: الخلاصة التنفيذية

واجهة سطر الأوامر في PHP تمثل بيئة قوية جدًا لإنشاء أدوات إدارية، وخدمات معالجة آلية، وتحليلات بيانات، وتطبيقات تفاعلية قائمة على النصوص. بالاعتماد على معايير متقدمة، يمكن بناء أنظمة متكاملة باستخدام PHP خارج إطار التطبيقات الويب التقليدية. ومع دمج مكتبات مثل symfony/console أو climate, يصبح من الممكن بناء أدوات CLI تضاهي في قوتها وكفاءتها تلك المكتوبة بلغات مثل Python أو Bash، مما يعزز من مكانة PHP كلغة متعددة الأغراض.

المراجع: