في PHP، تقوم الدالة exec() بتنفيذ أمر وإرجاع الإخراج من stdout للأمر. ومع ذلك، إذا كتب الأمر إلى stderr، فلن يتم التقاط هذا الإخراج بواسطة exec().
لالتقاط كل من stdout وstderr من أمر، يمكنك استخدام الدالة proc_open(). يوفر proc_open() مستوى أكبر من التحكم في عملية تنفيذ الأمر، بما في ذلك القدرة على توجيه تدفقات الأمر stdin وstdout وstderr.
مثال:
لنفكر في نص الصدفة التالي، test.sh، الذي يكتب لكل من stderr وstdout:
#!/bin/bash echo 'this is on stdout'; echo 'this is on stdout too'; echo 'this is on stderr' >&2; echo 'this is on stderr too' >&2;
لتنفيذ هذا البرنامج النصي في PHP والتقاط كل من stdout وstderr، يمكنك استخدام الكود التالي:
$descriptorspec = [ 0 => ['pipe', 'r'], // stdin 1 => ['pipe', 'w'], // stdout 2 => ['pipe', 'w'], // stderr ]; $process = proc_open('./test.sh', $descriptorspec, $pipes, dirname(__FILE__), null); $stdout = stream_get_contents($pipes[1]); fclose($pipes[1]); $stderr = stream_get_contents($pipes[2]); fclose($pipes[2]); echo "stdout : \n"; var_dump($stdout); echo "stderr :\n"; var_dump($stderr);
الإخراج:
عند تنفيذ نص PHP أعلاه، ستحصل على الإخراج التالي:
stdout : string(40) "this is on stdout this is on stdout too" stderr : string(40) "this is on stderr this is on stderr too"
يُظهر الإخراج تدفقات stdout و stderr من البرنامج النصي test.sh.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3