خطای «Fatal error: Class not found» را میبینید و نمیدانید کدام افزونه PHP روی هاست فعال است
اسکریپت شما خطای Class 'IntlDateFormatter' not found یا Call to undefined function mysqli_connect() میدهد. وردپرس صفحه سفید نشان میدهد و لاگ خطا به PHP Fatal error: Uncaught Error: Call to undefined function اشاره میکند. پیش از تماس با پشتیبانی، باید بدانید دقیقاً چه افزونههایی روی هاست شما فعال است و کدامها غایب. این مقاله روش دقیق بررسی را نشان میدهد.
فایل phpinfo()؛ سریعترین راه برای دیدن فهرست افزونههای فعال
یک فایل متنی با نام info.php بسازید و این سه خط را داخل آن بگذارید:
<?php
phpinfo();
?>
فایل را در public_html آپلود کنید و در مرورگر آدرس https://yourdomain.com/info.php را باز کنید. صفحهای بلند با جدولهای متعدد میبینید. بخش PHP Credits را نادیده بگیرید. دنبال بخش Configure Command بگردید؛ خروجی آن شبیه این است:
'./configure' '--with-mysqli' '--with-curl' '--enable-gd' '--with-openssl'
این خط نشان میدهد کدام افزونهها موقع کامپایل PHP فعال شدهاند. اما همه افزونهها از این طریق کامپایل نمیشوند؛ برخی مثل opcache و Zend OPcache بهصورت جداگانه در بخش Loaded Configuration File و Scan this dir for additional .ini files دیده میشوند.
بعد از بررسی، فایل را حذف کنید. اینجا اشتباه میکنند: فایل info.php را روی هاست میگذارند و فراموشش میکنند. این فایل تمام جزئیات پیکربندی PHP از جمله مسیر فایلهای تنظیمات و متغیرهای محیطی را نشان میدهد. هر کسی که آدرس را حدس بزند، نقشه کامل سرور شما را میبیند. بعد از کار، فایل را پاک کنید.
دستور خط فرمان برای بررسی سریعتر
اگر SSH دارید، این دستور فهرست تمام افزونههای بارگذاریشده را میدهد:
php -m
خروجی شامل نام افزونهها در هر خط است. برای بررسی وجود یک افزونه خاص:
php -m | grep -i intl
اگر خروجی خالی بود، افزونه نصب نیست. برای دیدن نسخه PHP و مسیر فایل تنظیمات:
php -v
php --ini
دستور php --ini مسیر Loaded Configuration File و پوشه Scan for additional .ini files را نشان میدهد. افزونههای فعال معمولاً فایل .so جداگانه در آن پوشه دارند.
بررسی وجود یک افزونه خاص بدون داشتن SSH
بیشتر هاستهای اشتراکی SSH ندارند. در این حالت، از فایل phpinfo() استفاده کنید و در صفحه نتیجه، کلیدهای Ctrl+F را بزنید و نام افزونه را جستجو کنید. اگر نام افزونه در بخش Configure Command یا بهعنوان یک بخش مستقل با تنظیمات اختصاصی ظاهر شد، فعال است.
روش دوم: یک فایل تست با این محتوا بسازید:
<?php
var_dump(extension_loaded('intl'));
var_dump(function_exists('mysqli_connect'));
?>
خروجی bool(true) یعنی افزونه یا تابع موجود است. bool(false) یعنی غایب است. این روش دقیقتر از جستجوی متنی در phpinfo() است، چون بعضی افزونهها مثل PDO بهصورت پیشفرض فعالاند اما در خروجی php -m با نام دیگری مثل pdo_mysql ظاهر میشوند.
تفاوت بین افزونه نصبشده و افزونه فعال
افزونهای میتواند روی سرور کامپایل شده باشد اما در فایل php.ini غیرفعال باشد. خط ;extension=intl.so با سمیکالن ابتدای خط یعنی غیرفعال است. در هاست اشتراکی معمولاً نمیتوانید php.ini را تغییر دهید، اما بعضی کنترلپنلها مثل cPanel اجازه انتخاب نسخه PHP و فعالسازی افزونهها را از بخش Select PHP Version میدهند. اگر این گزینه را دارید، تیک افزونه موردنظر را بزنید و ذخیره کنید.
اینجا اشتباه میکنند: فرض میکنند افزونهای که روی هاست قبلی بود، روی هاست جدید هم هست
رایجترین خطایی که دیدهام: کسی سایت را از هاست قدیمی به هاست جدید منتقل میکند و اسکریپت خطای Fatal error: Uncaught Error: Call to undefined function mb_strlen() میدهد. روی هاست قبلی افزونه mbstring فعال بود، روی هاست جدید نیست. انتقال فایلها و دیتابیس هیچ ارتباطی با افزونههای PHP ندارد. هر هاست پیکربندی مستقل خودش را دارد.
نشانه این مشکل: سایت روی هاست قبلی سالم کار میکرد، بعد از انتقال به هاست جدید صفحه سفید یا خطای 500 میدهد. لاگ خطا معمولاً به تابع یا کلاس خاصی اشاره میکند که تعریفنشده است. راهحل: ابتدا با روشهای بالا بررسی کنید کدام افزونه غایب است، بعد به پشتیبانی هاست جدید درخواست دهید.
مسیر درخواست افزونهای که روی هاست نیست
افزونههای رایج مثل mysqli، curl، gd، mbstring، xml و zip روی اکثر هاستهای لینوکس فعالاند. افزونههای کمتر رایج مثل intl، imagick، redis یا sodium ممکن است نباشند.
قبل از درخواست، این موارد را بررسی کنید:
- آیا افزونه واقعاً برای اجرای اسکریپت شما ضروری است؟ بعضی کتابخانهها مثل
DomDocumentجایگزین دارند. - آیا نسخه PHP شما با افزونه سازگار است؟ افزونهای که برای PHP 7.4 کامپایل شده روی PHP 8.2 کار نمیکند.
- آیا افزونه در لیست افزونههای پشتیبانیشده هاست شما هست؟
درخواست را از طریق تیکت پشتیبانی ارسال کنید. نام دقیق افزونه، نسخه PHP موردنیاز و دلیل نیاز را بنویسید. اگر اسکریپت شما مستندات رسمی دارد، لینک آن را هم بفرستید. پشتیبانی معمولاً ظرف چند ساعت پاسخ میدهد، اما نصب افزونههای سنگین مثل imagick ممکن است نیاز به ریستارت سرویس داشته باشد و زمانبر باشد.
اگر نیاز شما فوری است و هاست اشتراکی نمیتواند افزونه را نصب کند، دو گزینه دارید: ارتقا به سرور اختصاصی که کنترل کامل روی پیکربندی PHP دارید، یا تغییر اسکریپت به کتابخانهای که افزونه موجود را استفاده میکند. انتخاب اول هزینه دارد، انتخاب دوم زمان. من در شرایطی که افزونه حیاتی است و پروژه در حال رشد است، سرور اختصاصی را انتخاب میکنم؛ در شرایطی که فقط یک تابع خاص کم است، تغییر کد ارزانتر است.
بررسی افزونهها روی هاست لینوکس سرورنت
روی هاست لینوکس سرورنت، افزونههای پایه مثل mysqli، curl، gd، mbstring، xml، zip و opcache بهصورت پیشفرض فعال هستند. برای مشاهده فهرست دقیق، از روش phpinfo() که در بالا توضیح داده شد استفاده کنید. اگر افزونهای نیاز داشتید که در فهرست نبود، تیکت پشتیبانی بزنید و نام دقیق افزونه را بنویسید. افزونههای رایج معمولاً در همان روز نصب میشوند.
قبل از درخواست، مستندات پایگاه دانش سرورنت را چک کنید؛ شاید پاسخ سوال شما قبلاً داده شده باشد. اگر با خطای صفحه سفید مواجه شدید، راهنمای رفع صفحه سفید در وردپرس و PHP را بخوانید. برای بررسی اینکه مشکل از DNS است یا نه، از ابزار بررسی DNS و شبکه استفاده کنید.
جدول مقایسه: روشهای بررسی افزونه PHP
| روش | دسترسی لازم | دقت | زمان |
|---|---|---|---|
| phpinfo() | FTP یا فایلمنیجر | بالا | ۲ دقیقه |
| php -m | SSH | خیلی بالا | ۳۰ ثانیه |
| extension_loaded() | FTP یا فایلمنیجر | خیلی بالا | ۳ دقیقه |
| بخش Select PHP Version در cPanel | cPanel | متوسط | ۱ دقیقه |
روش php -m دقیقترین است چون مستقیماً از موتور PHP سوال میکند. روش phpinfo() اطلاعات بیشتری میدهد اما خواندنش سختتر است. روش extension_loaded() برای تست یک افزونه خاص دقیق است اما برای فهرست کامل مناسب نیست.
افزونههای پرکاربرد که معمولاً غایباند
بر اساس تجربه، این افزونهها بیشترین درخواست نصب را دارند:
intl— برای بینالمللیسازی و فرمت تاریخ/عدد. وردپرس و ووکامرس به آن نیاز دارند.imagick— پردازش تصویر با کیفیت بالاتر از GD. برای سایتهای عکسمحور ضروری است.redis— کش اشیاء و نشستها. وردپرس با Redis Object Cache سریعتر میشود.sodium— رمزنگاری مدرن. بعضی کتابخانههای امنیتی به آن نیاز دارند.bcmath— محاسبات با دقت دلخواه. برای درگاههای پرداخت و محاسبات مالی لازم است.
اگر اسکریپت شما از این افزونهها استفاده میکند و خطا میدهد، اول بررسی کنید که آیا افزونه واقعاً غایب است یا فقط نسخه PHP مشکل دارد. خطای Fatal error: Uncaught Error: Call to undefined function یعنی تابع اصلاً وجود ندارد. خطای Deprecated: Function یعنی تابع هست اما نسخه PHP خیلی جدید است و باید کد را بهروزرسانی کنید.
پرسشهای پرتکرار
چطور بفهمم کدام افزونههای PHP روی هاست من فعال است؟
فایل info.php با محتوای <?php phpinfo(); ?> بسازید و در مرورگر باز کنید. اگر SSH دارید، دستور php -m فهرست کامل افزونههای فعال را نشان میدهد.
افزونهای که نیاز دارم روی هاست نیست؛ چطور درخواست بدهم؟
تیکت پشتیبانی بزنید و نام دقیق افزونه، نسخه PHP و دلیل نیاز را بنویسید. افزونههای رایج معمولاً سریع نصب میشوند؛ افزونههای سنگین ممکن است زمان بیشتری ببرند.
چرا سایت بعد از انتقال به هاست جدید خطای undefined function میدهد؟
افزونههای PHP روی هاست جدید ممکن است با هاست قبلی متفاوت باشد. فایلهای سایت و دیتابیس منتقل میشوند اما پیکربندی PHP منتقل نمیشود. با روشهای بالا بررسی کنید کدام افزونه غایب است و درخواست نصب دهید.
آیا میتوانم خودم افزونه PHP روی هاست اشتراکی نصب کنم؟
در هاست اشتراکی معمولاً نه، چون نیاز به دسترسی ریشه و تغییر فایلهای تنظیمات سرور دارد. اگر کنترلپنل شما گزینه Select PHP Version دارد، میتوانید بعضی افزونهها را خودتان فعال کنید. در غیر این صورت باید به پشتیبانی درخواست دهید یا به سرور اختصاصی مهاجرت کنید.