أساسيات لينكس

كيف تتحقق من إصدار PHP وإضافاته على الخادم: سطر الأوامر مقابل PHP-FPM ووحدة Apache

قد يعمل أمر php وخدمة PHP-FPM ووحدة Apache بإصدارات وإضافات مختلفة على الخادم نفسه. إليك طريقة فحص كل منها على ديبيان وأوبونتو.

تاريخ النشر
مدة القراءة
7 دقائق
الكاتب
SKYLINE Engineering

إذا سألت ثلاثة أشخاص عن إصدار PHP على خادم واحد فقد تحصل على ثلاث إجابات مختلفة، وكلها صحيحة. ففي ديبيان وأوبونتو يُعد PHP الذي تستدعيه من سطر الأوامر عبر SSH، وخدمة PHP-FPM التي تعمل خلف Nginx أو Apache، ووحدة Apache الخاصة بـ PHP، برامج منفصلة، لكل منها ملف php.ini خاص وقائمة إضافات مفعّلة خاصة. يشرح هذا الدليل كيف تفحص كل واحد منها، وكيف تتأكد مما يستخدمه موقعك فعلًا، وكيف تقرأ إصدار الحزمة لتعرف هل إصلاحات الأمان مثبتة أم لا.

ثلاث طرق لتشغيل PHP على الخادم نفسه

تسمي PHP هذه الواجهات SAPI. وفي حزم ديبيان تُبنى كل واجهة لتقرأ مجلد إعدادات خاصًا بها تحت /etc/php/<version>/:

الواجهةمن يستخدمهاملف الإعدادات (مثال PHP 8.4)الحزمة
CLIجلسات SSH ومهام cron وComposer وArtisan وWP-CLI/etc/php/8.4/cli/php.iniphp8.4-cli
FPMNginx، أو Apache عبر proxy_fcgi/etc/php/8.4/fpm/php.ini مع ملفات المجمّعات في /etc/php/8.4/fpm/pool.d/php8.4-fpm
وحدة ApacheApache مع mod_php/etc/php/8.4/apache2/php.inilibapache2-mod-php8.4

تُفعَّل الإضافات لكل واجهة على حدة عبر مجلد conf.d المجاور لملف php.ini، ولهذا قد تجد إضافة متاحة في سطر الأوامر وغائبة عن الموقع. كما تمنح ديبيان سطر الأوامر ملف php.ini خاصًا فيه memory_limit = -1 أي بلا حد للذاكرة، بينما تحتفظ واجهات الويب بالقيمة الافتراضية 128M، فقد ينجح سكربت عبر SSH ثم تنفد ذاكرته عند تشغيله من المتصفح.

فحص PHP في سطر الأوامر

php -v                  # version of the "php" command
php --ini               # which php.ini and conf.d files were loaded
php -m                  # loaded extensions
php --ri opcache        # settings of one extension
readlink -f "$(command -v php)"
update-alternatives --display php

في أنظمة عائلة ديبيان يُدار المسار /usr/bin/php بواسطة update-alternatives. وعند تثبيت أكثر من إصدار يشير الأمر إلى الإصدار ذي الأولوية الأعلى ما لم يثبّته أحد يدويًا، لذلك قد يُظهر php -v الإصدار 8.5 بينما يعمل الموقع على 8.4. وابتداءً من PHP 8.5 يعرض الأمر php --ini=diff الإعدادات المختلفة عن القيم الافتراضية المدمجة.

فحص PHP-FPM

لكل إصدار من FPM ملف تنفيذي ووحدة systemd خاصة به، مثل php-fpm8.4 مع php8.4-fpm.service، وphp-fpm8.3 مع php8.3-fpm.service:

ls /usr/sbin/php-fpm*
systemctl list-units 'php*-fpm.service'
php-fpm8.4 -v
php-fpm8.4 -m
sudo php-fpm8.4 -t      # test the FPM configuration
ls -l /run/php/

يقرأ الأمر php-fpm8.4 -m ملف php.ini ومجلد conf.d الخاصين بـ FPM، فنتيجته تعكس ما تحصل عليه طلبات الويب. أما الخيار -t فيفحص /etc/php/8.4/fpm/php-fpm.conf وملفات المجمّعات دون إعادة تشغيل أي شيء. وتُظهر المقابس في /run/php/ المجمّعات التي تستمع حاليًا، والمجمّع الافتراضي في ديبيان يستمع على /run/php/php8.4-fpm.sock.

بعد ذلك تأكد من المقبس الذي يتصل به خادم الويب فعلًا:

grep -R "fastcgi_pass" /etc/nginx/sites-enabled/
grep -R "SetHandler" /etc/apache2/sites-enabled/ /etc/apache2/conf-enabled/
ls /etc/apache2/mods-enabled/ | grep -i php

تحتفظ ديبيان أيضًا بمقبس عام هو /run/php/php-fpm.sock تديره update-alternatives، ويتبع إصدار FPM الأعلى أولوية من بين الإصدارات العاملة. لذا فالموقع المضبوط على هذا المسار العام قد ينتقل إلى إصدار PHP آخر من تلقاء نفسه عند تثبيت إصدار جديد. ويُظهر الأمر الأخير هل وحدة Apache الخاصة بـ PHP مفعّلة أصلًا.

تأكد مما يشغّله الموقع فعلًا

الفحص الوحيد الذي لا يخدعه ملف إعدادات أُسيء فهمه هو أن تسأل PHP من داخل طلب ويب حقيقي. أنشئ ملفًا صغيرًا باسم يصعب تخمينه، وافتحه مرة واحدة، ثم احذفه:

NAME="check-$(openssl rand -hex 8).php"
echo '<?php echo PHP_VERSION, " ", php_sapi_name(), " ", php_ini_loaded_file();' | sudo tee /var/www/example.com/public/$NAME
# open https://example.com/<that name> once, then:
sudo rm /var/www/example.com/public/$NAME

إذا كان الموقع يعمل عبر FPM فستظهر القيمة fpm-fcgi، وعبر وحدة Apache ستظهر apache2handler. وإذا احتجت الصورة الكاملة فالدالة phpinfo() تطبع كل إعداد وإضافة، لكن دليل PHP ينبّه إلى أنها تعرض أيضًا معلومات الخادم والبيئة وكل بيانات الطلب من متغيرات البيئة وGET وPOST وملفات تعريف الارتباط ومتغيرات الخادم. لذلك فملف phpinfo.php المنسي يكشف لمن يعثر عليه المسارات والإصدارات وقائمة الإضافات، وأحيانًا متغيرات بيئة تحوي أسرارًا. استخدم اسمًا عشوائيًا، واحذف الملف في الدقيقة نفسها، ولا تضفه أبدًا إلى مستودع الشيفرة.

فحص الحزمة المثبتة ومستوى الترقيع

dpkg -l 'php*' | grep '^ii'
apt policy php8.4-fpm
dpkg-query -W -f='${Package} ${Version}\n' 'php8.4*'

الرقم الذي يظهره php -v نصف القصة فقط، أما إصدار الحزمة فيخبرك بإصلاحات الأمان المثبتة. تأتي ديبيان 13 ‏(trixie) مع PHP 8.4، وقد تابعت تحديثاتها الأمنية الإصدارات الفرعية من المصدر: فالإشعار DSA-6574-1 في 21 أكتوبر 2026 جاء بالإصدار 8.4.27-1~deb13u1. وتأتي ديبيان 12 ‏(bookworm) مع PHP 8.2 الذي يتلقى إصلاحاته الآن من فريق الدعم الممتد LTS، وقد جاء الإشعار DLA-4848-1 في اليوم نفسه بالإصدار 8.2.35-1~deb12u1. أما أوبونتو فتعمل بطريقة مختلفة: أوبونتو 24.04 تأتي مع PHP 8.3، وأوبونتو 22.04 مع PHP 8.1، وتُنقل الإصلاحات إلى الإصدار نفسه فيبقى الرقم الأصلي القديم في اسم الحزمة (مثل 8.3.6-0ubuntu0.24.04.13). قارن حزم أوبونتو بـ إشعارات أمان أوبونتو لا بموقع php.net. وقد انتهى الدعم الرسمي لـ PHP 8.1 في 31 ديسمبر 2025، فأي إصلاحات له تعتمد الآن على التوزيعة وحدها. وإذا أضفت مستودعًا خارجيًا لإصدارات PHP إضافية فسيُظهر apt policy أيضًا مصدر كل حزمة مثبتة.

أخطاء شائعة

  • تعديل ملف php.ini الخطأ. التعديل في /etc/php/8.4/cli/php.ini لا يغيّر شيئًا في الموقع. عدّل ملف الواجهة المقصودة ثم أعد تشغيل خدمتها: sudo systemctl restart php8.4-fpm أو sudo systemctl restart apache2.
  • تثبيت إضافة دون إعادة تشغيل FPM. يرى سطر الأوامر حزمة جديدة مثل php8.4-intl فورًا، أما عمليات FPM العاملة فلا تراها حتى تُعاد الخدمة.
  • فحص Composer لإصدار PHP الخطأ. يعمل Composer عبر سطر الأوامر، فشغّل composer check-platform-reqs بالإصدار نفسه الذي يستخدمه الموقع، مثل php8.4 "$(command -v composer)" check-platform-reqs.
  • تشغيل إصدارين من FPM مع بقاء خادم الويب متصلًا بالإصدار القديم بعد الترقية.
  • ملفات phpinfo قديمة بقيت في مجلدات المواقع من عمليات استكشاف أعطال سابقة. ابحث عنها بالأمر sudo grep -rl "phpinfo" /var/www --include='*.php' وراجع كل نتيجة قبل حذفها.

ما الذي ينبغي فعله

  1. سجّل لكل موقع إصدار PHP والواجهة المستخدمة من فحص داخل طلب ويب، ثم احذف ملف الفحص.
  2. قارن ناتج php -m بناتج php-fpm8.x -m حتى تحمّل مهام cron وطلبات الويب الإضافات نفسها.
  3. اربط كل موقع بمقبس FPM يحمل رقم الإصدار بدل المقبس العام.
  4. راجع ناتج apt policy لحزم PHP مقابل إشعارات توزيعتك مرة في الشهر على الأقل.
  5. خطط مبكرًا لمواعيد انتهاء الدعم المنشورة على php.net: ينتهي دعم الأمان لـ PHP 8.2 في 31 ديسمبر 2026، وPHP 8.1 منتهي الدعم أصلًا.

المصادر

SKYLINE Engineering

@skyline

The engineering team at SKYLINE Industrial Solutions. We publish field-tested guides drawn from real KSA and GCC deployments.

صفحة الكاتب
SKYLINE engineering services

Need this implemented for you?

Reading is free — building it right takes a team. SKYLINE engineers ship Linux Basics for Aramco vendors, banks, hospitals and government agencies across Saudi Arabia. Talk to us before you start.

Aramco Approved Contractor ISO 9001 · ISO 27001 SAMA CSF aligned NCA ECC ready 247+ KSA clients

Comments

0 total · 0 threads
Be the first to leave a comment.