PHP به خودی خود یک زبان تفسیری است؛ یعنی هر بار که یک صفحه درخواست میشود، موتور PHP باید کد را بخواند، تجزیه کند، کامپایل کند و اجرا کند. این چرخه برای یک سرویس با ترافیک پایین اهمیتی ندارد، اما وقتی صدها درخواست در ثانیه روی سرور بریزد، این مراحل تکراری تبدیل به یک گلوگاه جدی میشوند. OPcache دقیقاً برای حل همین مشکل ساخته شده.
OPcache چیست و چرا اصلاً وجود دارد؟
OPcache (مخفف Opcode Cache) یک سیستم کش داخلی در موتور PHP است که مرحله کامپایل را از چرخه اجرا حذف میکند. این ابزار از نسخه PHP 5.5 به صورت داخلی در بسته PHP گنجانده شده و نیازی به نصب جداگانه ندارد — فقط باید فعال شود.
برای فهمیدن اینکه OPcache چه کاری میکند، باید اول بدانید PHP چه مسیری را طی میکند:
- فایل PHP را از دیسک میخواند
- کد را Parse میکند (تجزیه نحوی)
- کد را به Opcode — دستورالعملهای سطح ماشین — تبدیل میکند
- Opcode را اجرا میکند
OPcache مراحل اول تا سوم را برای درخواستهای بعدی حذف میکند. Opcodeهای کامپایلشده را در حافظه RAM نگه میدارد و دفعه بعد که همان فایل درخواست شود، مستقیم از RAM خوانده و اجرا میشود. چون خواندن از RAM حدود صد برابر سریعتر از دیسک است، نتیجه بلافاصله احساس میشود.
چطور OPcache کار میکند؟
اولین باری که یک فایل PHP درخواست میشود، PHP مثل همیشه آن را میخواند، parse میکند و کامپایل میکند — ولی این بار، Opcode حاصل را در یک shared memory segment در RAM ذخیره میکند. از درخواست دوم به بعد، PHP مستقیماً این Opcode را از RAM میخواند و اجرا میکند.
چرا این مهم است؟ چون خواندن از RAM حدود صد برابر سریعتر از دیسک است. به علاوه، حذف مراحل parse و کامپایل CPU را آزاد میکند تا کارهای واقعیتری انجام دهد — مثل اجرای منطق برنامه یا پاسخ به درخواستهای بیشتر.
تفاوت OPcache با Redis یا Memcached
این یکی از رایجترین سوالهاست. هر سه کش هستند ولی لایههای کاملاً متفاوتی را هدف میگیرند:
- OPcache: کد PHP کامپایلشده را کش میکند — لایه اجرای برنامه
- Redis / Memcached: نتایج عملیاتها را کش میکنند — مثل خروجی query های دیتابیس یا دادههای محاسبهشده
هیچ تعارضی بین آنها نیست. یک سایت وردپرس پرترافیک میتواند هم OPcache داشته باشد (برای سرعت اجرای PHP) و هم Object Cache با Redis (برای کش query های دیتابیس). استفاده همزمان از هر دو بهترین نتیجه را میدهد.
چطور OPcache را فعال کنیم؟
خبر خوب این است که PHP 5.5 به بعد، OPcache نصبشده اما غیرفعال است. کافی است آن را روشن کنید.
روش ۱: از طریق php.ini
مسیر فایل php.ini را با دستور php --ini پیدا کنید. معمولاً چیزی شبیه /etc/php/8.2/fpm/php.ini است. این خطوط را اضافه یا ویرایش کنید:
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=2
opcache.save_comments=1
بعد از ذخیره، PHP-FPM یا وبسرور را ریاستارت کنید:
# PHP-FPM
systemctl restart php8.2-fpm
# Apache با mod_php
systemctl restart apache2
روش ۲: از طریق cPanel
اگر هاست اشتراکی با cPanel دارید، به Select PHP Version بروید، OPcache را از لیست اکستنشنها تیک بزنید و ذخیره کنید. همین.
روش ۳: روی VPS با Ubuntu/Debian
apt install php8.2-opcache
phpenmod opcache
systemctl restart php8.2-fpm
تنظیمات بهینه برای سایتهای مختلف
یک تنظیم برای همه کار نمیکند. بسته به حجم پروژه باید مقادیر را تنظیم کنید.
وردپرس با افزونههای متوسط
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.revalidate_freq=60
opcache.save_comments=1
opcache.fast_shutdown=1
وردپرس فایلهای PHP زیادی دارد — هسته، تم، و هر افزونه چند فایل اضافه میکند. max_accelerated_files=20000 برای یک نصب معمولی کافی است. اگر WooCommerce یا افزونههای سنگین دارید، این عدد را به ۴۰۰۰۰ برسانید.
Laravel / Symfony در محیط Production
opcache.enable=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=100000
opcache.validate_timestamps=0
opcache.max_wasted_percentage=5
نکته مهم: validate_timestamps=0 یعنی OPcache دیگر تغییرات فایل را بررسی نمیکند. این در production عالی است چون overhead بررسی حذف میشود، ولی باید بعد از هر deploy، کش را دستی پاک کنید:
php artisan opcache:clear
# یا مستقیم:
php -r "opcache_reset();"
محیط Development
در محیط توسعه، revalidate_freq=0 بگذارید تا تغییرات کد بلافاصله دیده شوند. یا کلاً OPcache را در development غیرفعال کنید تا با Xdebug تداخلی نداشته باشد.
مانیتورینگ: از OPcache چه بخواهید؟
OPcache آمار مفصلی دارد که نشان میدهد آیا درست پیکربندی شده یا نه. این اسکریپت ساده وضعیت را نشان میدهد:
<?php
$status = opcache_get_status();
$hitRate = round($status['opcache_statistics']['opcache_hit_rate'], 2);
$memUsed = round($status['memory_usage']['used_memory'] / 1024 / 1024);
$cachedFiles = $status['opcache_statistics']['num_cached_scripts'];
echo "Hit Rate: {$hitRate}%\n";
echo "Memory Used: {$memUsed}MB\n";
echo "Cached Files: {$cachedFiles}\n";
?>
Hit Rate زیر ۹۰٪ نشانه مشکل است. معمولاً دو علت دارد: یا memory_consumption کم است و فایلها از کش بیرون میروند، یا max_accelerated_files کمتر از تعداد فایلهای پروژه است. ابزار گرافیکی opcache-gui (روی GitHub موجود است) این آمار را به شکل بصری نشان میدهد.
عیبیابی مشکلات رایج
شایعترین مشکلی که گزارش میشود این است: «فایل PHP را تغییر دادم ولی تغییر نمایش داده نمیشود.» راهحلها:
- اگر
revalidate_freqبالاست، صبر کنید تا منقضی شود - با
opcache_reset()کش را دستی پاک کنید - در development از
revalidate_freq=0استفاده کنید
مشکل دیگر: خطای «out of memory». OPcache حافظه تمام کرده. مقدار memory_consumption را افزایش دهید و با آمار OPcache بررسی کنید چقدر واقعاً مصرف میشود. مشکل ناسازگاری با Xdebug هم معمول است — در development این دو را همزمان فعال نکنید.
OPcache Preloading در PHP 7.4+
از PHP 7.4 قابلیت جدیدی به OPcache اضافه شد: Preloading. با تنظیم opcache.preload، میتوانید مشخص کنید کدام فایلها هنگام شروع PHP-FPM از پیش بارگذاری شوند. این یعنی حتی اولین درخواست هم از کش استفاده میکند:
opcache.preload=/var/www/html/preload.php
opcache.preload_user=www-data
Laravel و Symfony از این قابلیت پشتیبانی میکنند. برای سایتهای پرترافیک این یک گام اضافه در بهینهسازی است که میتواند زمان پاسخدهی را چند میلیثانیه دیگر کاهش دهد.
تاثیر OPcache روی فریمورکها و CMSها
همه پروژههای PHP از OPcache سود میبرند، ولی درصد بهبود فرق میکند:
- وردپرس: بهبود قابل توجه. هسته وردپرس تنها بیش از هزار فایل PHP دارد
- Laravel / Symfony: بهبود خوب، خصوصاً در autoloading کلاسها که هر request آنها را بارگذاری میکند
- Magento: تاثیر بسیار زیاد — Magento codebase یکی از بزرگترینهاست و بدون OPcache واقعاً کند است
- Drupal / Joomla: بهبود متوسط تا خوب
روی یک سایت وردپرس متوسط، فعال کردن OPcache زمان اجرای PHP را ۴۰ تا ۷۰ درصد کاهش میدهد — بدون هیچ تغییری در کد.
سوالات متداول
آیا OPcache روی همه هاستها در دسترس است؟
اکثر هاستهای اشتراکی مدرن از OPcache پشتیبانی میکنند. در cPanel بخش Select PHP Version را چک کنید. اگر هاست اشتراکی شما OPcache ندارد، از پشتیبانی بخواهید فعالش کنند — این یک درخواست کاملاً معقول است. روی VPS و سرور اختصاصی کنترل کامل در اختیار خودتان است.
آیا OPcache برای سایتهای کاملاً داینامیک هم مفید است؟
بله. OPcache کد PHP را کش میکند، نه خروجی HTML را. حتی سایتهایی که هر درخواست خروجی کاملاً متفاوتی دارند — مثل فروشگاههای آنلاین — از OPcache بهره میبرند. کد هر بار اجرا میشود، ولی مرحله کامپایل حذف شده و اجرا سریعتر است.
چقدر RAM باید به OPcache اختصاص داد؟
برای وردپرس معمولی ۱۲۸ مگابایت کافی است. برای سایتهای بزرگ با افزونههای زیاد ۲۵۶ مگابایت توصیه میشود. با بررسی آمار OPcache میتوانید ببینید چقدر واقعاً مصرف میشود و بر اساس آن تنظیم کنید. Hit Rate بالای ۹۵٪ نشانه پیکربندی درست است.
آیا OPcache با PHP 8 هم کار میکند؟
بله، و در PHP 8 بهتر از قبل. PHP 8 یک JIT Compiler (Just-In-Time) دارد که روی بالای OPcache کار میکند. JIT برای workloadهای محاسباتی سنگین تاثیر بیشتری دارد. برای اکثر وباپلیکیشنها، OPcache بدون JIT کافی است، ولی فعال کردن JIT در PHP 8 ضرری ندارد.
OPcache در محیط چند سروره (Multi-Server)
یک نکتهای که اغلب نادیده گرفته میشود: اگر سایت شما روی چند سرور Load Balanced اجرا میشود، هر سرور کش OPcache مستقل خودش را دارد. این به خودی خود مشکل نیست، ولی یک الزام ایجاد میکند: وقتی کد deploy میکنید، باید روی تمام سرورها کش را پاک کنید، نه فقط یکی.
اگر این مرحله فراموش شود، ممکن است بخشی از ترافیک توسط سروری با کد قدیمی پاسخ داده شود. برای این مشکل، اسکریپتهای deployment باید به صورت خودکار opcache_reset() را روی تمام نودها اجرا کنند. ابزارهایی مثل Deployer یا Capistrano این قابلیت را دارند.
مقایسه عملکرد قبل و بعد از OPcache
یک آزمایش ساده با ابزار Apache Benchmark میتواند تاثیر OPcache را عددی نشان دهد. فرض کنید یک سایت وردپرس ساده روی یک VPS با ۲ هسته CPU داریم. نتیجه معمول بدون OPcache و با OPcache چنین است:
| معیار اندازهگیری | بدون OPcache | با OPcache |
|---|---|---|
| درخواست در ثانیه | ۱۸ | ۵۵ |
| میانگین زمان پاسخ | ۵۵۰ میلیثانیه | ۱۸۰ میلیثانیه |
| مصرف CPU | ۸۵٪ | ۴۵٪ |
این اعداد نمونهای هستند و بسته به سختافزار، افزونهها، و پیکربندی PHP متفاوت خواهند بود. اما جهت بهبود تقریباً همیشه قابل توجه است. سه برابر شدن throughput روی همان سختافزار، یعنی برای رسیدن به همان ظرفیت قبل از OPcache، میتوانستید با یکسوم هزینه زیرساخت کنار بیایید.
جمعبندی
OPcache یکی از معدود بهینهسازیهایی است که با صرف چند دقیقه وقت، بازده فوری دارد. رایگان است، داخل PHP است، و برای تمام پروژههای PHP مفید است. اگر هنوز فعال نکردهاید، الان بهترین وقت است.
تنها کار لازم: تنظیمات را با شرایط پروژه خودتان تطبیق دهید، Hit Rate را مانیتور کنید، و در صورت نیاز حافظه یا تعداد فایلهای قابل کش را افزایش دهید. این سه قدم کافی است تا سایت PHP شما با کمترین تغییر ممکن، سریعتر شود. فروشگاه آنلاین باشد یا وبلاگ، لاراول باشد یا وردپرس، هیچ سایت PHPای نباید بدون OPcache اجرا شود.