سایت بالا نمیآید. صفحه سفید است، یا خطای 500 Internal Server Error میدهد، یا وردپرس پیام «حداکثر حجم حافظه مصرفی تمام شد» را نشان میدهد. اگر تازه یک اسکریپت نصب کردهاید یا نسخه PHP را از پنل عوض کردهاید، احتمال زیادی وجود دارد که مسئله دقیقاً تنظیمات PHP باشد، نه کد شما. این متن برای همین لحظه نوشته شده: چه چیزی را کجا عوض کنید، چرا بعضی تغییرات اعمال نمیشوند، و کدام عدد را واقعاً باید بالا ببرید.
اول بفهمید کدام نسخه PHP در حال اجراست
قبل از هر تغییری، خروجی واقعی را ببینید. یک فایل به نام info.php در ریشه دامنه بسازید با این محتوا:
<?php phpinfo(); ?>
سپس آدرس آن را در مرورگر باز کنید. دنبال دو چیز بگردید: خط Loaded Configuration File که مسیر واقعی php.ini را نشان میدهد، و خط PHP Version. اگر مسیر Loaded Configuration File خالی یا (none) بود، یعنی هیچ فایل php.ini سفارشیای بارگذاری نشده و هر تغییری که در فایلهای دیگر بدهید بیاثر است. این یکی از رایجترین دلایل سردرگمی است.
روش سریعتر از خط فرمان، اگر SSH دارید:
php -v
php -i | grep -E "memory_limit|max_execution_time|upload_max_filesize"
توجه کنید که نسخه CLI با نسخهای که وبسرور برای دامنه اجرا میکند میتواند متفاوت باشد. عددی که در phpinfo() میبینید مرجع است، نه خروجی ترمینال.
تغییر نسخه PHP برای یک دامنه، نه برای کل سرور
در هاست اشتراکی، نسخه PHP معمولاً از پنل مدیریت دامنه انتخاب میشود. در cPanel مسیر MultiPHP Manager است؛ در DirectAdmin بخش PHP Version Selector. نسخه را از منوی کشویی انتخاب میکنید و ذخیره میزنید. تغییر بلافاصله اعمال میشود، ولی نه همیشه بدون هزینه.
نکتهای که خیلیها را غافلگیر میکند: ارتقا از PHP 7.4 به 8.1 یا 8.2 میتواند افزونههای قدیمی را از کار بیندازد. اگر بعد از تغییر نسخه سایت سفید شد، اول لاگ خطا را ببینید، نه اینکه فوراً برگردید به نسخه قبل. در cPanel لاگ معمولاً در ~/logs یا از بخش Errors قابل مشاهده است. دنبال خطی مثل PHP Fatal error: Uncaught Error: Call to undefined function بگردید؛ این یعنی یک افزونه با نسخه جدید سازگار نیست.
کدام نسخه را انتخاب کنم
اگر سایت وردپرسی دارید و افزونههایتان بهروزند، PHP 8.1 یا 8.2 را انتخاب کنید. تفاوت سرعت محسوس است و پشتیبانی امنیتی نسخههای قدیمیتر تمام شده. اگر افزونهای دارید که سالها بهروز نشده و مجبورید نگهش دارید، روی 7.4 بمانید تا زمانی که جایگزین پیدا کنید. این یک معامله واقعی است: امنیت و سرعت در برابر سازگاری. من در عمل 8.1 را انتخاب میکنم و اگر افزونهای شکست، آن افزونه را عوض میکنم، نه نسخه PHP را.
افزونههای PHP را فقط وقتی فعال کنید که لازم است
افزونهها از پنل فعال میشوند. در cPanel بخش Select PHP Version و سپس تب Extensions. چکباکسها را علامت میزنید و ذخیره میکنید. لیست معمولاً شامل mysqli، curl، gd، mbstring، zip، intl، opcache و دهها مورد دیگر است.
اینجا اشتباه میکنند: کاربر همه افزونهها را فعال میکند تا «مشکل حل شود». نتیجهاش مصرف بیشتر حافظه در هر درخواست است و گاهی تعارض بین افزونهها. اگر وردپرس دارید، حداقلهای لازم اینهاست: mysqli، curl، gd یا imagick، mbstring، zip، json، xml. بقیه را فقط وقتی فعال کنید که یک افزونه مشخص در پیام خطا نامش را برده باشد.
نشانه فعال بودن اشتباه افزونهها این است: سایت کار میکند ولی TTFB بالا رفته و مصرف حافظه هر پروسه PHP بیشتر از قبل شده. اگر با این وضعیت روبهرو شدید، بخش مرجع کامل محدودیتهای منابع هاست توضیح میدهد هر عدد چه چیزی را میشمارد.
memory_limit و max_execution_time را درست تنظیم کنید
دو عددی که بیشترین تماس پشتیبانی را میسازند همینها هستند. مقدار پیشفرض memory_limit معمولاً 128M یا 256M است و max_execution_time روی 30 ثانیه. برای وردپرس با چند افزونه سنگین، 256M کم است و 512M منطقیتر. برای max_execution_time، مقدار 300 برای عملیات وارد کردن محتوا یا پشتیبانگیری معقول است.
سه جا میتوانید این مقادیر را عوض کنید و ترتیب اولویت مهم است:
- فایل
php.iniسفارشی در ریشه دامنه یا مسیر مشخصشده توسط هاست. قویترین گزینه است و روی همه درخواستهای آن دامنه اثر میگذارد. - فایل
.htaccessبا خطوطی مثلphp_value memory_limit 512M. فقط وقتی کار میکند که PHP بهصورت ماژول Apache اجرا شود، نه CGI یا PHP-FPM. - فایل
wp-config.phpباdefine('WP_MEMORY_LIMIT', '512M');. فقط داخل وردپرس اثر دارد و اگر هاست سقف سختگیرانهای گذاشته باشد، بیاثر میماند.
اگر بعد از تغییر در .htaccess خطای 500 Internal Server Error گرفتید، یعنی سرور اجازه این دایرکتیو را نمیدهد. آن خط را حذف کنید و از php.ini استفاده کنید. این خطا آنی و واضح است، ولی اگر .htaccess را اشتباه ویرایش کنید و سایت از دسترس خارج شود، برگرداندنش سختتر میشود. همیشه قبل از ویرایش یک کپی بگیرید.
محدودیتهایی که از پنل بالاتر نمیروند
در هاست اشتراکی، سقف memory_limit و max_execution_time توسط ارائهدهنده تعیین میشود. اگر عددی بالاتر از سقف بگذارید، پنل آن را نادیده میگیرد یا به سقف برمیگرداند. این را در phpinfo() بعد از تغییر چک کنید؛ اگر عدد عوض نشده، یعنی سقف اعمال شده. در آن حالت دو راه دارید: بهینهسازی کد و افزونهها، یا رفتن به سمت سرور اختصاصی که کنترل کامل روی php.ini میدهد.
تنظیمات PHP را از خط فرمان و اسکریپت چک کنید
وقتی سایت بالا نمیآید و نمیتوانید phpinfo() را ببینید، از SSH استفاده کنید. اگر دسترسی SSH ندارید، از طریق ابزارهای رایگان وبمستر میتوانید وضعیت دامنه و رکوردهای DNS را بررسی کنید تا مطمئن شوید مشکل از PHP است و نه از مسیر رسیدن به سرور.
برای دیدن خطاهای واقعی بهجای صفحه سفید، این دو خط را موقتاً در ابتدای فایل اجرایی اضافه کنید:
ini_set('display_errors', 1);
error_reporting(E_ALL);
و بعد از پیدا کردن خطا، حتماً display_errors را خاموش کنید. اگر روشن بماند، مسیر فایلها و جزئیات دیتابیس برای همه قابل دیدن میشود. این یکی از خطاهایی است که در بازرسیها زیاد میبینم و پیامد امنیتی دارد.
برای خطاهای وردپرس، مسیر رفع صفحه سفید در وردپرس و PHP گامبهگام همین کار را با جزئیات بیشتری توضیح میدهد. اگر مشکل بعد از تغییر دامنه پیش آمده، راهنمای انتقال سایت به دامنه جدید نکاتی دارد که به تنظیمات PHP مربوط میشود.
یک نکته درباره مصرف منابع
بالا بردن memory_limit مشکل را پنهان میکند، نه حل. اگر یک اسکریپت با 128M حافظه تمام میکند، احتمالاً حلقهای بیپایان دارد یا روی دیتای بزرگ بدون صفحهبندی کار میکند. بالا بردن سقف فقط به آن اجازه میدهد بیشتر مصرف کند و روی هاست اشتراکی، سهم بقیه را هم میخورد. اگر مصرف حافظه سایتتان مدام بالا میرود، قبل از افزایش عدد، بخش Entry Process و تفاوتش با بازدید را بخوانید تا بفهمید چه چیزی واقعاً مصرف میشود.
برای سایتهای پربازدید یا اپلیکیشنهایی که به تنظیمات دقیق PHP نیاز دارند، هاست لینوکس سرورنت امکان انتخاب نسخه و تنظیم پارامترها را از پنل میدهد؛ ولی اگر به کنترل کامل روی php.ini و کامپایل افزونههای سفارشی نیاز دارید، سرور اختصاصی انتخاب درستتری است.
پرسشهای پرتکرار
چرا بعد از تغییر memory_limit در wp-config.php هیچ تغییری نمیبینم؟
چون هاست یک سقف سختگیرانه در سطح سرور گذاشته و مقدار شما بالاتر از آن است. عدد واقعی را در خروجی phpinfo() چک کنید؛ اگر همان مقدار قبلی است، تغییر اعمال نشده. در این حالت باید از php.ini سفارشی استفاده کنید یا با پشتیبانی درباره سقف مجاز صحبت کنید.
تفاوت php_value در htaccess با php.ini چیست؟
php.ini در سطح دامنه یا سرور بارگذاری میشود و روی همه درخواستها اثر دارد. php_value در .htaccess فقط وقتی کار میکند که PHP بهصورت ماژول Apache اجرا شود. اگر سرور PHP-FPM باشد، این خطوط نادیده گرفته میشوند یا خطای 500 میدهند. برای اطمینان، اول php.ini را امتحان کنید.
کدام نسخه PHP برای وردپرس مناسب است؟
برای نسخههای جدید وردپرس، PHP 8.1 یا 8.2 بهترین انتخاب است. نسخه 7.4 دیگر پشتیبانی امنیتی نمیگیرد و ماندن روی آن ریسک دارد. اگر افزونهای با نسخه جدید سازگار نیست، جایگزینش کنید؛ نگه داشتن نسخه قدیمی PHP بهخاطر یک افزونه، معامله بدی است.
چطور بفهمم مشکل از تنظیمات PHP است یا از کد سایت؟
یک فایل ساده با <?php echo "ok"; ?> در ریشه دامنه بسازید و باز کنید. اگر این فایل باز شد ولی سایت نه، مشکل از کد یا افزونههای سایت است. اگر همین فایل هم خطا داد، مشکل از تنظیمات PHP یا سرور است. این تست ساده در بیشتر مواقع جهت درست را نشان میدهد.
قدم بعدی: همین حالا phpinfo() را باز کنید و سه عدد memory_limit، max_execution_time و upload_max_filesize را یادداشت کنید. اگر با آنچه انتظار دارید نمیخواند، از همانجا شروع کنید.