سؤال

أحاول تشغيل vncviewer على Raspberry Pi باستخدام PHP، حيث يكون RPi هو العميل ويقوم خادم VNC الخاص بي بتشغيل MS Windows.

في PHP أستخدم هذا البرنامج النصي لبدء برنامج vncviewer

$cmd="echo password | vncviewer -autopass " .$ip;
shell_exec($cmd);

إنه يعمل عندما أقوم فقط بتشغيل برنامج Shell النصي من RPi، ولكن عند تجربته من PHP أحصل على هذا الخطأ:

Error: Can't open display:

هل هناك أي حل بديل لهذا الخطأ؟

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم X11، فربما تحتاج إلى ضبط إعداداتك DISPLAY عامل.

يستخدم عملاء (البرامج) X11 الذين يحتاجون إلى فتح النوافذ على خادم X11 (العرض) هذا المتغير لتحديد المكان الذي يجب أن يجد فيه العميل الخادم.يتم استخدام نموذج العميل/الخادم هنا لأن الخادم يوفر إمكانيات عرض النافذة لـ عميل.

يتضمن X القدرة على عرض النوافذ على الخوادم البعيدة عبر الشبكة، على الرغم من أنك ستعرض الأشياء على الشاشة الرئيسية على الجهاز الذي يقوم بتشغيل البرنامج بنسبة 99.9% من الوقت، لذلك عادة، DISPLAY=localhost:0.0.

المصيد هو أنه إذا DISPLAY يكون لا لا يعرف البرنامج مكان فتح نوافذه، حتى لو كان هناك خادم X يعمل على نفس الجهاز.وعندما يتم تشغيل البرامج cron أو البرامج النصية لبدء تشغيل النظام أو في الواقع أي شيء لم يتم تشغيله بواسطة X نفسه (بما في ذلك برنامج PHP النصي الذي يتم تشغيله بواسطة خادم الويب الخاص بك)، عادةً لا تحتوي على DISPLAY تعيين على أي شيء.

لذا ..كما لاحظتم في التعليقات، الإعداد DISPLAY=:0 سيخبر vncviewer أين يرسل نوافذه.هذا هو اختصار ل DISPLAY=localhost:0.0.يُفترض أن يكون اسم المضيف، في حالة استبعاده، هو مضيف محلي.و ال .0 في النهاية يشير إلى رقم الشاشة، والذي يكون أيضًا صفرًا.تفحص ال وثائق X لمزيد من التفاصيل.

وكما لاحظت أيضًا في التعليقات، في البيئة التي يتم فيها تشغيل X (على سبيل المثال، DISPLAY تم ضبطه بالفعل)، قد تحتاج إلى التشغيل xhost + للسماح للبرامج التي لم يتم تشغيلها بواسطة X بفتح النوافذ.

لتعيين متغير بيئة في PHP، استخدم شيئًا مثل:

putenv("DISPLAY=:0");

قبل الكود الذي يقوم بتشغيل VNC.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top