إذا سألت ثلاثة أشخاص عن إصدار 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.ini | php8.4-cli |
| FPM | Nginx، أو Apache عبر proxy_fcgi | /etc/php/8.4/fpm/php.ini مع ملفات المجمّعات في /etc/php/8.4/fpm/pool.d/ | php8.4-fpm |
| وحدة Apache | Apache مع mod_php | /etc/php/8.4/apache2/php.ini | libapache2-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'وراجع كل نتيجة قبل حذفها.
ما الذي ينبغي فعله
- سجّل لكل موقع إصدار PHP والواجهة المستخدمة من فحص داخل طلب ويب، ثم احذف ملف الفحص.
- قارن ناتج
php -mبناتجphp-fpm8.x -mحتى تحمّل مهام cron وطلبات الويب الإضافات نفسها. - اربط كل موقع بمقبس FPM يحمل رقم الإصدار بدل المقبس العام.
- راجع ناتج
apt policyلحزم PHP مقابل إشعارات توزيعتك مرة في الشهر على الأقل. - خطط مبكرًا لمواعيد انتهاء الدعم المنشورة على php.net: ينتهي دعم الأمان لـ PHP 8.2 في 31 ديسمبر 2026، وPHP 8.1 منتهي الدعم أصلًا.
المصادر
- php.net/manual/en/features.commandline.options.php
- php.net/manual/en/function.phpinfo.php
- php.net/manual/en/function.php-sapi-name.php
- php.net/manual/en/function.php-ini-loaded-file.php
- php.net/supported-versions.php
- php.net/eol.php
- manpages.debian.org/trixie/php8.4-cli/php8.4.1.en.html
- manpages.debian.org/trixie/php8.4-fpm/php-fpm8.4.8.en.html
- manpages.debian.org/trixie/dpkg/update-alternatives.1.en.html
- manpages.debian.org/trixie/apt/apt-cache.8.en.html
- manpages.debian.org/trixie/dpkg/dpkg-query.1.en.html
- sources.debian.org/src/php8.4/8.4.27-1~deb13u1/debian/rules
- sources.debian.org/src/php8.4/8.4.27-1~deb13u1/debian/rules.d/prepare-fpm-pools.mk
- sources.debian.org/src/php-defaults/96/php-fpm-socket-helper
- packages.debian.org/trixie/amd64/php8.4-fpm/filelist
- security-tracker.debian.org/tracker/DSA-6574-1
- security-tracker.debian.org/tracker/DLA-4848-1
- packages.ubuntu.com/noble/php8.3-fpm
- packages.ubuntu.com/jammy/php8.1-fpm
- ubuntu.com/security/notices
- getcomposer.org/doc/03-cli.md#check-platform-reqs
Comments
0 total · 0 threads