
يوجد في لغة php عدة دوال للتعامل مع نظام التشغيل مثل :
exec: لتشغيل برنامج خارجي .
system: تنفذ اوامر على النظام وتعرض الخرج.
passthru: تستخدم كبديل ل system حيث تنفذ امر لتشغيل برنامج خارجي وتعرض المخرجات .
shell_exec: تنفذ امر من خلال صدفة النظام shell وتعيد المخرجات على شكل نص.
توفر هذه الدوال وغيرها طريقة لمطوري php للتعامل مع البرامج والاوامر الخارجية عبر نظام التشغيل. لكن التعامل مع هذه الدوال يحتاج لبعض الخبرة وكذا لبعض الجهد والتنسيق للمدخلات والمخرجات وأخذ الجانب الأمني في الحسبان .
عادة ما يتم الغاء تفعيل هذه الدوال في معظم السيرفرات، وذلك لمنع استخدامها بطريقة خاطئة تضر بالنظام وبدرجة أساسية لكي لا تستغل من قبل المخترقين. وعند التعامل مع هذه الدوال سيتوجب عليك التعامل مع المخاطر الامنية بنفسك وكذا توقع الاختلافات بين انظمة التشغيل التي سيعمل عليها مشروعك.
Symfony Process Component
تستخدم لتنفيذ العمليات عن طريق النظام بشكل آمن وسهل عن طريق عمل تغليف لدوال مثل proc_open لتعطينا قدرة على معالجة العمليات من خلال اداة واحدة.
و تسمح بالتعامل مع النظام خارج المشروع بطريقة أسهل، وتحكم عالي في المدخلات والمخرجات، وتقوم بتصفية وسيطات الاوامر (arguments) لمنع المشكلات الأمنية.
توفر العديد من الميزات مثل :
- التعامل مع المخرجات في الوقت الفعاي real-time Process Output .
- معالجة الاستثنائات Exception handling .
- تشغيل العمليات بشكل غير متزامن Running Processes Asynchronously.
- تحديد متغيرات البيئة للعمليات Setting Environment Variables for Processes.
- التعامل مع تدفق المدخلات القياسية للعملية Streaming to the Standard Input of a Process.
- تنفيذ الأوامر المعدة مسبقا في موجه الأوامر Using a Prepared Command Line.
- استخدام دالة الانتظار wait() function.
- التحكم في وقت الاقصى لتنفيذ العملية Process Timeout.
- التعامل مع اشارات العملية Process Signals.
تنزيل الاداة من خلال ال composer
composer require symfony/process
الاستخدام :
يتم الاستخدام من خلال استدعاء الصنف Process اذ يمكن أن تستقبل دالة البناء فيه 5 معاملات (arguments) جميعها اختيارية، عدى الأول. حيث تمثل هذه المتغيرات ما يلي :
1- المعامل الاول : $command يجب ان يكون نوعه مصفوفة اذ يحوي الأمر المراد تنفيذه بالاضافة الى معاملات هذا الامر.
2- المعامل الثاني : cwd اختياري يمكن ان يكون null او قيمة نصية تمثل مسار مجلد العمل الذي سيتم تنفيذ الامر داخله. افتراضياً سيتم التنفيذ في مسار العملية الحالي.
3- معامل $env : اختياري و يمثل متغيرات البيئة ، قيمته الافتراضية null ويقبل مصفوفة تحوي متغيرات البيئة .
4- معامل $input : اختياري من نوع mixed ويمثل المدخلات يمكن ان يكون stream resource او scalar او \Traversable, او null .
في حال عدم تفعيل دالة proc_open سيحدث استثناء من نوع LogicException.
مثال للاستخدام :
use Symfony\Component\Process\Process; $process = new Process(['git', 'status']); $process->run(); echo $process->getOutput();
تستخدم الدالة run لتنفيذ العملية ، ودالة getOutput لإعادة المخرجات الناتجة عن التنفيذ.
وفي المثال سيتم اعادة حالة الملفات في مستودع git في المسار الحالي. اذ يفترض ان المشروع يعتمد على git والا سيظهر لنا ما يفيد غير ذلك.
بمكن التحقق هل تم تنفيذ الامر بنجاح من خلال دالة isSuccessful .
يمكن استخدام دالة getErrorOutput() لإعادة الخطأ في حال وجد .
يوجد ايضا دوال بديلة مثل getIncrementalOutput() و getIncrementalErrorOutput() واللذان يعيدان المخرجات الجديدة منذ اخر استدعاء .
يمكن ايضا استخدام دوارة foreach في التعامل مع ناتج تنفيذ العملية. افتراضيا سيتم انتظار المخرجات الجديدة قبل الانتقال الى الخطوة التالية في الحلقة .
مثال:
$process = new Process(['ls', '-lsa']); $process->start(); foreach ($process as $type => $data) { if ($process::OUT === $type) { echo "\nRead from stdout: ".$data; } else { // $process::ERR === $type echo "\nRead from stderr: ".$data; } }
يعرض المثال الملفات في المسار .
دالة mustRun() تستخدم كبديل لدالة run وتختلف عنها فقط في أنه سيحدث استثناء من نوع ProcessFailedException في حال فشل تنفيذ العملية .
للمزيد يمكن العودة على التوثيق الرسمي عبر الرابط https://symfony.com/doc/current/components/process.html