الدالة popen()‎ في PHP

من موسوعة حسوب
< PHP

(PHP 4, PHP 5, PHP 7)

تفتح الدالة popen()‎ عمليَّة وتشير إليها بمؤشِّر شبيه بمؤشِّر ملف.

الوصف

resource popen ( string $command , string $mode )

تفتح هذه الدالة أنبوبًا (pipe) يتصل مع العمليَّة المراد تنفيذها باستعمال الأمر command الفرعي المعطى.

المعاملات

command

الأمر المراد تنفيذه.

mode

يُحدِّد هذا المعامل نوع الوصول المطلوب إلى المجرى.

القيم المعادة

يُعاد مؤشِّر ملف مطابق تمامًا للمؤشِّر المعاد بوساطة الدالة fopen()‎ باستثناء أنَّه أحادي الاتجاه (unidirectional) (أي يمكن استعماله إمَّا للقراءة أو للكتابة فقط) ويجب إغلاقه باستعمال الدالة pclose()‎. يمكن استعمال هذا المؤشِّر مع الدالة fgets()‎ والدالة fgetss()‎ والدالة fwrite()‎.

عندما تكون قيمة المعامل mode هي r، فسيُمثِّل مؤشِّر الملف المعاد مجرى الخرج القياسي (STDOUT) للأمر. أمَّا إن كانت قيمة المعامل mode هي w، فسيُمثِّل مؤشِّر الملف المعاد مجرى الدخل القياسي (STDIN) للأمر.

إن حصل أيُّ خطأ، فستُعاد القيمة FALSE.

أمثلة

المثال 1: استعمال الدالة popen()‎

<?php

$handle = popen("/bin/ls", "r");

?>

إن لم يُعثر على الأمر المراد تنفيذه، فسيُعاد مورد صحيح. أراك مستغربًا من ذلك! هذا منطقي حقيقةً إذ يسمح لك ذلك بالوصول إلى رسالة الخطأ التي ستعيدها الصدفة آنذاك. المثال 2: استعمال الدالة popen()‎ مع حالة عدم العثور على الأمر المراد تنفيذه

<?php
error_reporting(E_ALL);

//(stderr) إضافة إعادة توجيه من أجل الوصول إلى مجرى الخطأ القياسي
$handle = popen('/path/to/executable 2>&1', 'r');
echo "'$handle'; " . gettype($handle) . "\n";
$read = fread($handle, 2096);
echo $read;
pclose($handle);
?>

ملاحظات

  • إن كنت تبحث عن دالة تدعم إعادة مؤشِّر ثنائي الإتجاه (bi-directional)، فاستعمل proc_open()‎.
  • إن كان الوضع الآمن مفعَّلًا، فلن تستطيع إلا تنفيذ الملفات الموجودة ضمن المجلَّد safe_mode_exec_dir. لا يُسمح، لأسباب عمليَّة، بوجود عناصر قابلة للتنفيذ في غير ذلك المسار.

تحذير: إن كان الوضع الآمن مفعلًا، فستُهرَّب بعض محارف السلسلة النصيَّة للأمر باستعمال الدالة escapeshellcmd()‎؛ بناءً على ذلك، يصبح الأمر echo y | echo x بالشكل echo y \| echo x.

انظر أيضًا

  • الدالة pclose()‎: تغلق مؤشِّرًا يشير إلى عمليَّة مفتوحة.
  • الدالة fopen()‎: تفتح ملفًا أو عنوان URL.
  • الدالة proc_open()‎: تنفِّذ أمرًا وتفتح مؤشِّر ملف ثنائي الاتجاه (من أجل الدخل والخرج).

مصادر