آموزش تنظیمات فایل php.ini

آموزش تنظیمات فایل php.ini

فایل php.ini قلب تپنده و مرکز کنترل اصلی تنظیمات PHP در سرور شماست. این فایل قدرتمند به شما اجازه می‌دهد تا تقریباً تمام جنبه‌های رفتار PHP را، از نحوه گزارش خطاها و محدودیت‌های حافظه گرفته تا مدیریت آپلود فایل و امنیت، شخصی‌سازی کنید. برای هر توسعه‌دهنده وب یا مدیر سروری، درک و توانایی بهینه‌سازی این تنظیمات یک مهارت ضروری محسوب می‌شود.

همان‌طور که کیفیت و پایداری زیرساخت فیزیکی مانند اتصالات شبکه برای ارتباطی بی‌نقص حیاتی است، پیکربندی صحیح php.ini نیز برای عملکرد روان، سریع و امن وب‌سایت شما نقشی کلیدی ایفا می‌کند. در این راهنما، ما شما را با مهم‌ترین دستورالعمل‌ها و بهترین شیوه‌ها برای تنظیم این فایل آشنا می‌کنیم تا بتوانید پتانسیل کامل وب‌سایت خود را آزاد کنید.

فایل php.ini چیست و چرا اهمیت دارد؟

تعریف و نقش کلیدی در پیکربندی PHP

فایل php.ini یک فایل پیکربندی (Configuration File) است که تمامی تنظیمات اصلی زبان برنامه‌نویسی PHP را در بر می‌گیرد. این فایل در واقع “قلب” تنظیمات PHP در سرور شماست و هر بار که PHP اجرا می‌شود، این فایل خوانده شده و تنظیمات آن اعمال می‌گردد. به عبارت ساده‌تر، php.ini مانند یک دفترچه راهنما برای PHP است که به آن می‌گوید چگونه رفتار کند. این فایل به شما امکان می‌دهد تا پارامترهای متعددی را که بر عملکرد، امنیت، و منابع سرور تأثیر می‌گذارند، کنترل کنید.

از جمله این پارامترها می‌توان به محدودیت حافظه (memory_limit)، حداکثر زمان اجرای یک اسکریپت (max_execution_time)، حداکثر حجم فایل قابل آپلود (upload_max_filesize)، و نحوه گزارش‌دهی خطاها اشاره کرد. بدون این فایل، PHP با تنظیمات پیش‌فرض خود اجرا می‌شود که ممکن است برای همه وب‌سایت‌ها مناسب نباشد. برای مثال، یک وب‌سایت فروشگاهی با تصاویر زیاد نیاز به حجم آپلود بالاتری دارد که باید از طریق php.ini تنظیم شود؛ بنابراین، درک و ویرایش صحیح این فایل برای هر مدیر سایت یا توسعه‌دهنده‌ای که از PHP استفاده می‌کند، امری حیاتی است.

تفاوت فایل‌های php.ini-development و php.ini-production

PHP برای راحتی توسعه‌دهندگان و مدیران سرور، دو نسخه پیش‌فرض از فایل پیکربندی را ارائه می‌دهد: php.ini-development و php.ini-production. این دو فایل حاوی تنظیمات بهینه‌شده برای دو محیط کاملاً متفاوت هستند: محیط توسعه (Development) و محیط تولید (Production). درک تفاوت بین این دو فایل برای حفظ امنیت و کارایی وب‌سایت بسیار مهم است.

  • فایل php.ini-development: برای زمانی طراحی شده است که توسعه‌دهنده در حال نوشتن و اشکال‌زدایی (Debugging) کد است. در این حالت، هدف اصلی شناسایی و رفع خطاها است؛ بنابراین، این فایل تنظیماتی را فعال می‌کند که به توسعه‌دهنده کمک می‌کند تا به‌راحتی مشکلات کد را ببیند. برای مثال، در این فایل، گزارش‌دهی تمام خطاها، هشدارها و اعلان‌ها (E_ALL) فعال است تا هیچ مشکلی از دید توسعه‌دهنده پنهان نماند. همچنین، نمایش خطاها در مرورگر (display_errors = On) نیز فعال است تا توسعه‌دهنده بتواند بلافاصله خطاها را در صفحه مشاهده کند.
  • فایل php.ini-production: برای محیط زنده و واقعی وب‌سایت طراحی شده است که در آن امنیت و عملکرد در اولویت قرار دارند. در این محیط، نمایش خطاها به کاربران نهایی نه‌تنها تجربه کاربری بدی ایجاد می‌کند، بلکه می‌تواند اطلاعات حساسی درباره ساختار کد و سرور را در اختیار مهاجمان قرار دهد. به همین دلیل، در فایل php.ini-production، نمایش خطاها غیرفعال می‌شود (display_errors = Off) و در عوض، خطاها در یک فایل لاگ ثبت می‌شوند (log_errors = On) تا مدیران سرور بتوانند آن‌ها را بررسی کنند. همچنین، تنظیمات گزارش‌دهی خطا در این فایل محدودتر است (E_ALL & ~E_DEPRECATED & ~E_STRICT) تا از گزارش خطاهایی که برای کاربران نهایی مهم نیستند و فقط منابع سرور را مصرف می‌کنند، جلوگیری شود.
ویژگی php.ini-development php.ini-production
هدف اشکال‌زدایی و توسعه امنیت و عملکرد در محیط زنده
display_errors On (نمایش خطاها در مرورگر) Off (عدم نمایش خطا به کاربر)
log_errors معمولاً Off On (ثبت خطاها در فایل لاگ)
error_reporting E_ALL (گزارش تمام خطاها) E_ALL & ~E_DEPRECATED & ~E_STRICT (گزارش خطاهای مهم)
expose_php معمولاً On Off (مخفی‌کردن نسخه PHP)

چگونه php.ini بر عملکرد، امنیت و کارایی سایت شما تأثیر می‌گذارد

فایل php.ini به طور مستقیم بر سه جنبه کلیدی هر وب‌سایت PHP-based تأثیر می‌گذارد: عملکرد (Performance)، امنیت (Security)، و کارایی (Efficiency). در زمینه عملکرد، تنظیماتی مانند memory_limit و max_execution_time تعیین می‌کنند که یک اسکریپت PHP چقدر منابع (حافظه و زمان CPU) می‌تواند مصرف کند. تنظیم بیش از حد پایین این مقادیر می‌تواند باعث بروز خطاهایی مانند “Allowed memory size exhausted” یا “Maximum execution time exceeded” شود، درحالی‌که تنظیم بیش از حد بالای آن‌ها می‌تواند منابع سرور را به طور غیرضروری اشغال کند و بر روی وب‌سایت‌های دیگر (در هاست‌های اشتراکی) یا سرویس‌های دیگر سرور تأثیر منفی بگذارد.

در حوزه امنیت، php.ini نقش یک سپر دفاعی را ایفا می‌کند. تنظیماتی مانند expose_php = Off از افشای نسخه PHP به کاربران جلوگیری می‌کند که می‌تواند اطلاعاتی برای حملات هدفمند فراهم کند. همچنین، با استفاده از disable_functions می‌توان توابع خطرناک PHP را که ممکن است برای اجرای کدهای مخرب استفاده شوند، غیرفعال کرد. در نهایت، در مورد کارایی، تنظیمات مربوط به آپلود فایل (upload_max_filesize و post_max_size) و مدیریت Session (session.save_path) به شما امکان می‌دهد تا تجربه کاربری بهتری ارائه دهید. برای مثال، افزایش حجم آپلود برای یک وب‌سایت عکاسی ضروری است، درحالی‌که تنظیم مسیر ذخیره‌سازی Session می‌تواند سرعت وب‌سایت را افزایش دهد.

یافتن و ویرایش فایل php.ini

پیداکردن و ویرایش فایل php.ini یکی از مهم‌ترین و درعین‌حال گیج‌کننده‌ترین مراحل برای مدیران وب‌سایت‌ها و توسعه‌دهندگان است. این فایل می‌تواند در مکان‌های مختلفی بسته به نوع سرور (اشتراکی، VPS، اختصاصی)، سیستم‌عامل (لینوکس، ویندوز)، کنترل پنل (cPanel، Plesk) و حتی نحوه نصب PHP (Apache module، PHP-FPM) قرار داشته باشد. در این بخش، ما به‌صورت گام‌به‌گام و با استفاده از روش‌های مختلف، نحوه شناسایی دقیق مسیر این فایل را آموزش خواهیم داد. همچنین، روش‌های مختلف ویرایش آن را از طریق ابزارهایی مانند File Manager، FTP/SFTP و یا در محیط‌های سرور محلی بررسی می‌کنیم. در پایان، به یک نکته بسیار حیاتی اشاره خواهیم کرد: برای اینکه تغییرات اعمال شده در php.ini اثر کند، باید وب سرور را مجدداً راه‌اندازی (Restart) کرد.

روش‌های مختلف یافتن مسیر فایل php.ini

استفاده از تابع phpinfo() برای شناسایی مسیر دقیق

ساده‌ترین و قابل اعتمادترین روش برای پیداکردن مسیر دقیق فایل php.ini که توسط وب سرور شما استفاده می‌شود، استفاده از تابع phpinfo() است. این تابع یک صفحة اطلاعات جامع درباره پیکربندی PHP در سرور شما ایجاد می‌کند. برای استفاده از این روش، کافی است یک فایل PHP جدید با نام دلخواه (مثلاً phpinfo.php) ایجاد کرده و کد زیر را در آن قرار دهید:

<?php
phpinfo() ;
?>

سپس، این فایل را در پوشة اصلی (root) وب‌سایت خود (معمولاً public_html) آپلود کنید. حالا، با مراجعه به آدرس yourdomain.com/phpinfo.php (به‌جای yourdomain.com دامنة خود را قرار دهید)، یک صفحة اطلاعاتی مشاهده خواهید کرد. در این صفحه، به دنبال دو بخش کلیدی بگردید:

  1. Configuration File (php.ini) Path: این بخش مسیر پوشه‌ای را نشان می‌دهد که PHP به دنبال فایل php.ini در آن می‌گردد.
  2. Loaded Configuration File: این بخش مهم‌ترین بخش است، زیرا مسیر دقیق و کامل فایل php.ini که در حال حاضر توسط وب سرور شما بارگذاری و استفاده می‌شود را نمایش می‌دهد.

اگر در بخش “Loaded Configuration File” عبارتی مانند (none) دیده شود، به این معناست که هیچ فایل php.ini خاصی بارگذاری نشده و PHP از تنظیمات پیش‌فرض خود استفاده می‌کند. در این حالت، می‌توانید یک فایل php.ini در مسیر مشخص شده در بخش “Configuration File (php.ini) Path” ایجاد کنید تا تنظیمات دلخواه خود را اعمال کنید. پس از یافتن مسیر فایل، می‌توانید با استفاده از File Manager در کنترل پنل‌هاست یا FTP به آن دسترسی پیدا کرده و تغییرات موردنظر را اعمال کنید. به یاد داشته باشید که پس از اتمام کار، برای امنیت بیشتر، فایل phpinfo.php را از سرور حذف کنید، زیرا اطلاعات نمایش‌داده‌شده توسط آن می‌تواند برای افراد سودجو مفید باشد.

استفاده از خط فرمان (SSH) با دستور php --ini

اگر به سرور خود از طریق SSH دسترسی دارید (که معمولاً در سرورهای VPS یا اختصاصی امکان‌پذیر است)، می‌توانید از دستور php --ini برای یافتن مسیر فایل php.ini استفاده کنید. این دستور اطلاعات مربوط به فایل‌های پیکربندی PHP را در محیط خط فرمان (CLI) نمایش می‌دهد. برای اجرای این دستور، کافی است در ترمینال SSH تایپ کنید:

php --ini

خروجی این دستور به شکل زیر خواهد بود:

Configuration File (php.ini) Path: /etc/php/8.1/cli
Loaded Configuration File:         /etc/php/8.1/cli/php.ini
Scan for additional .ini files in: /etc/php/8.1/cli/conf.d
Additional .ini files parsed:      /etc/php/8.1/cli/conf.d/10-opcache.ini,
/etc/php/8.1/cli/conf.d/10-pdo.ini,
...

در این خروجی، مقدار “Loaded Configuration File” مسیر دقیق فایل php.ini مورداستفاده در محیط خط فرمان را نشان می‌دهد. این مسیر ممکن است با فایل php.ini مورداستفاده توسط وب سرور (مثلاً Apache یا Nginx) متفاوت باشد. برای مثال، در سیستم‌های مبتنی بر Debian/Ubuntu، معمولاً چندین نسخه از فایل php.ini وجود دارد که برای ماژول‌های مختلف PHP استفاده می‌شوند. برای مثال:

  • /etc/php/8.1/cli/php.ini: برای محیط خط فرمان (CLI).
  • /etc/php/8.1/apache2/php.ini: برای ماژول PHP در Apache.
  • /etc/php/8.1/fpm/php.ini: برای PHP-FPM (FastCGI Process Manager) که معمولاً با Nginx استفاده می‌شود.

برای اطمینان از اینکه فایل صحیح را ویرایش می‌کنید، بهتر است ابتدا با استفاده از تابع phpinfo() در یک اسکریپت وب، مسیر فایل مورداستفاده توسط وب سرور را پیدا کنید. اگر دسترسی SSH ندارید، روش phpinfo() تنها روش قابل‌اعتماد برای شما خواهد بود.

بررسی مسیرهای رایج در هاست‌های اشتراکی (cPanel, Plesk)

در هاست‌های اشتراکی که از کنترل پنل‌هایی مانند cPanel یا Plesk استفاده می‌کنند، فایل php.ini معمولاً در مکان‌های خاصی قرار دارد. دانستن این مسیرهای رایج می‌تواند در پیداکردن سریع‌تر فایل کمک کند.

در cPanel، ساختار دایرکتوری حساب کاربری معمولاً به این صورت است که تمام فایل‌های وب‌سایت در پوشة public_html قرار می‌گیرند. فایل php.ini ممکن است در یکی از این دو مکان باشد:

  1. در پوشة اصلی (Root Directory) حساب کاربری: این پوشه معمولاً در مسیر /home/username قرار دارد که username نام کاربری cPanel شماست. در این حالت، فایل php.ini در کنار پوشه‌هایی مانند public_html, mail, logs و غیره قرار دارد.
  2. در داخل پوشة public_html: برخی از هاست‌ها اجازه می‌دهند که یک فایل php.ini در داخل پوشة public_html قرار دهید تا تنظیمات فقط برای آن وب‌سایت اعمال شود.

در Plesk، ساختار دایرکتوری برای هر دامنه به‌صورت جداگانه تعریف می‌شود. مسیر رایج برای فایل‌های یک وب‌سایت در Plesk به شرح زیر است:

  • در لینوکس: /var/www/vhosts/<domain_name>
  • در ویندوز: C:\inetpub\vhosts\<domain_name>

در این مسیرها، <domain_name> نام دامنة شماست. فایل php.ini معمولاً در این پوشة اصلی دامنه قرار دارد. همچنین، برخی از ارائه‌دهندگان هاستینگ ممکن است مسیر خاصی را برای فایل php.ini در نظر بگیرند. برای مثال، در برخی هاست‌ها، این فایل در مسیر ~/php-bin/php.ini قرار دارد. اگر نمی‌توانید فایل را پیدا کنید، بهترین کار این است که از پشتیبانی هاستینگ خود بپرسید یا از روش phpinfo() استفاده کنید.

PHP.ini

PHP.ini

نحوه ویرایش فایل php.ini

ویرایش از طریق File Manager در کنترل پنل هاست

بیشتر کنترل پنل‌های هاستینگ مانند cPanel، Plesk و DirectAdmin دارای یک ابزار مدیریت فایل داخلی به نام File Manager هستند. این ابزار به شما امکان می‌دهد بدون نیاز به نرم‌افزارهای جانبی، مستقیماً از طریق مرورگر وب به فایل‌های سرور خود دسترسی پیدا کرده و آن‌ها را ویرایش کنید. برای ویرایش فایل php.ini با استفاده از File Manager، مراحل زیر را دنبال کنید:

  1. ورود به کنترل پنل: ابتدا وارد کنترل پنل هاستینگ خود (مثلاً cPanel) شوید.
  2. باز کردن File Manager: به دنبال آیکون “File Manager” بگردید و روی آن کلیک کنید.
  3. پیمایش به مسیر فایل: با استفاده از ساختار درختی در سمت چپ یا پنجره‌ی اصلی، به مسیر فایل php.ini که قبلاً با روش‌های گفته شده پیدا کرده‌اید، بروید. این مسیر ممکن است پوشة اصلی حساب کاربری (/home/username) یا پوشة public_html باشد.
  4. یافتن و انتخاب فایل: فایل php.ini را پیدا کرده و روی آن راست‌کلیک کنید.
  5. انتخاب گزینه‌ی ویرایش: از منوی باز شده، گزینه‌ی “Edit” یا “Code Edit” را انتخاب کنید. “Code Edit” معمولاً گزینه‌ی بهتری است زیرا شماره خطوط را نمایش می‌دهد و برای ویرایش فایل‌های متنی مناسب‌تر است.
  6. اعمال تغییرات: فایل در یک ویرایشگر متنی باز خواهد شد. تغییرات موردنظر خود را اعمال کنید. برای مثال، برای افزایش حافظه مجاز PHP، خط memory_limit را پیدا کرده و مقدار آن را تغییر دهید.
  7. ذخیره‌سازی: پس از اعمال تغییرات، دکمه‌ی “Save Changes” یا “ذخیره” را کلیک کنید.

استفاده از File Manager ساده‌ترین روش برای کاربران مبتدی است، زیرا نیازی به نصب نرم‌افزار اضافی یا دانستن جزئیات اتصال FTP نیست.

ویرایش از طریق FTP/SFTP

اگر ترجیح می‌دهید از نرم‌افزارهای مدیریت فایل روی سیستم خود استفاده کنید یا دسترسی به File Manager ندارید، می‌توانید از پروتکل FTP (File Transfer Protocol) یا SFTP (Secure File Transfer Protocol) برای ویرایش فایل php.ini استفاده کنید. SFTP به دلیل رمزنگاری ارتباط، امن‌تر از FTP است. برای این کار، به یک کلاینت FTP/SFTP مانند FileZilla، WinSCP یا Cyberduck نیاز دارید.

مراحل کار به شرح زیر است:

  1. دریافت اطلاعات اتصال: از کنترل پنل هاستینگ خود یا از پشتیبانی، اطلاعات اتصال FTP/SFTP را دریافت کنید. این اطلاعات معمولاً شامل آدرس سرور (Host)، نام کاربری (Username)، رمز عبور (Password) و پورت (Port) است.
  2. اتصال به سرور: نرم‌افزار FTP/SFTP خود را بازکرده و اطلاعات اتصال را وارد کنید. سپس به سرور متصل شوید.
  3. پیمایش به مسیر فایل: در پنجره‌ی ریموت (سمت راست در FileZilla)، به مسیر فایل php.ini بروید. این مسیر همان مسیری است که با روش‌های قبلی پیدا کرده‌اید، مثلاً /home/username یا /public_html .
  4. دانلود فایل: فایل php.ini را از سرور به سیستم خود دانلود کنید. برای این کار، کافی است فایل را از پنجره‌ی ریموت به پنجره‌ی لوکال (سمت چپ) بکشید یا روی آن راست‌کلیک کرده و گزینه‌ی “Download” را انتخاب کنید.
  5. ویرایش فایل: فایل دانلود شده را با یک ویرایشگر متنی ساده مانند Notepad (ویندوز)، TextEdit (macOS) یا VS Code بازکرده و تغییرات موردنظر را اعمال کنید.
  6. آپلود فایل: پس از ذخیره‌سازی تغییرات، فایل ویرایش شده را از سیستم خود به سرور آپلود کنید. برای این کار، فایل را از پنجره‌ی لوکال به پنجره‌ی ریموت بکشید یا روی آن راست‌کلیک کرده و گزینه‌ی “Upload” را انتخاب کنید. اگر از شما خواسته شد که فایل موجود را جایگزین کنید، گزینه‌ی “Yes” را انتخاب کنید.

این روش برای کاربرانی که با نرم‌افزارهای FTP آشنا هستند یا نیاز به ویرایش چندین فایل به‌صورت هم‌زمان دارند، مناسب‌تر است.

ویرایش در سرورهای محلی (XAMPP, WAMP)

اگر وب‌سایت خود را روی یک سرور محلی مانند XAMPP یا WAMP توسعه می‌دهید، پیداکردن و ویرایش فایل php.ini بسیار ساده‌تر است. در این محیط‌ها، تمام فایل‌های موردنیاز در یک پوشة واحد نصب می‌شوند.

  • در XAMPP: فایل php.ini معمولاً در مسیر C:\xampp\php\php.ini (در ویندوز) یا /Applications/XAMPP/xamppfiles/etc/php.ini (در macOS) قرار دارد.
  • در WAMP: فایل php.ini معمولاً در مسیر C:\wamp64\bin\php\php[version]\php.ini قرار دارد که [version] نسخهٔ PHP نصب شده است.

برای ویرایش فایل، کافی است به این مسیر بروید، فایل php.ini را با یک ویرایشگر متنی بازکرده و تغییرات موردنظر را اعمال کنید. پس از ذخیره‌سازی، باید Apache را از طریق کنترل پنل XAMPP یا WAMP ری استارت کنید تا تغییرات اعمال شوند. در این محیط‌ها، معمولاً دو نسخه از فایل پیکربندی وجود دارد: php.ini-development و php.ini-production. برای توسعه، باید فایل php.ini-development را به php.ini تغییر نام دهید، زیرا تنظیمات آن برای محیط توسعه مناسب‌تر است (مثلاً نمایش خطاها فعال است).

اعمال تغییرات: ضرورت ری استارت وب سرور

یکی از رایج‌ترین اشتباهاتی که کاربران هنگام ویرایش فایل php.ini مرتکب می‌شوند، این است که فراموش می‌کنند پس از اعمال تغییرات، وب سرور خود را ری استارت کنند. فایل php.ini فقط یک‌بار هنگام راه‌اندازی وب سرور خوانده می‌شود؛ بنابراین، هر تغییری که در این فایل ایجاد می‌کنید، تا زمانی که وب سرور دوباره راه‌اندازی نشود، اعمال نخواهد شد.

نحوهٔ ری استارت وب سرور بسته به نوع سرور و کنترل پنل شما متفاوت است:

  • در سرورهای محلی (XAMPP/WAMP): از کنترل پنل نرم‌افزار، دکمهٔ “Stop” و سپس “Start” را برای Apache بزنید.
  • در سرورهای با کنترل پنل (cPanel, Plesk): معمولاً گزینه‌ای برای “Restart Services” یا “Services Management” وجود دارد که می‌توانید از آن برای ری استارت Apache یا PHP-FPM استفاده کنید.
  • در سرورهای VPS/اختصاصی با دسترسی SSH: می‌توانید از دستورات خط فرمان استفاده کنید. برای مثال، برای ری استارت Apache در سیستم‌های مبتنی بر systemd (مانند CentOS 7/8، Ubuntu 16.04+):
    sudo systemctl restart httpd  # برای CentOS/RHEL
    sudo systemctl restart apache2 # برای Debian/Ubuntu
    

    برای ری استارت PHP-FPM:

    sudo systemctl restart php-fpm  # یا php8.1-fpm، بسته به نسخه PHP
    

پس از ری استارت وب سرور، تغییرات شما در فایل php.ini اعمال خواهد شد. برای اطمینان، می‌توانید دوباره صفحة phpinfo.php را بررسی کنید تا ببینید مقدار دستورالعمل (directive) موردنظر شما تغییر کرده است یا خیر.

ساختار و نحوه نوشتن دستورات در php.ini

ساختار کلی فایل: بخش‌ها (Sections) و دستورالعمل‌ها (Directives)

فایل php.ini دارای یک ساختار ساده و منطقی است که خواندن و درک آن را آسان می‌کند. این فایل متنی به دو جزء اصلی تقسیم می‌شود: بخش‌ها (Sections) و دستورالعمل‌ها (Directives). بخش‌ها برای گروه‌بندی تنظیمات مرتبط با هم استفاده می‌شوند تا فایل سازمان‌یافته‌تر باشد. نام هر بخش در براکت‌های مربعی ([ ]) قرار می‌گیرد. برای مثال، [Date] بخشی است که تمام تنظیمات مربوط به تاریخ و زمان مانند date.timezone در آن قرار دارد. بخش‌های دیگر رایج شامل [PHP] برای تنظیمات کلی PHP، [Session] برای مدیریت جلسات کاربر، و [opcache] برای تنظیمات کش OPcache هستند. این ساختاربخشی به شما کمک می‌کند تا سریعاً تنظیمات موردنظر خود را پیدا کنید.

در داخل هر بخش یا در ابتدای فایل (در بخش پیش‌فرض)، دستورالعمل‌ها (Directives) قرار دارند. هر دستورالعمل یک کلید و یک مقدار دارد که با علامت مساوی (=) از هم جدا می‌شوند. ساختار کلی آن به‌صورت directive = value است. برای مثال، memory_limit = 128M یک دستورالعمل است که کلید آن memory_limit و مقدار آن 128M است.

هر دستورالعمل یک خط جداگانه را اشغال می‌کند. PHP هنگام پردازش فایل، تمام خطوط خالی و کامنت‌ها را نادیده می‌گیرد و فقط دستورالعمل‌ها را می‌خواند. ترتیب نوشتن دستورالعمل‌ها در داخل یک بخش معمولاً مهم نیست، اما اگر یک دستورالعمل را چند بار تکرار کنید، مقدار آخرین مورد در نظر گرفته می‌شود. این ساختار ساده و منظم باعث می‌شود که حتی افراد مبتدی نیز بتوانند بدون مشکل زیادی فایل را ویرایش کنند.

قواعد نگارش صحیح دستورات

فرمت directive = value

در فایل php.ini، هر دستورالعمل (directive) باید در یک فرمت خاص نوشته شود تا توسط PHP درست تفسیر شود. این فرمت ساده و استاندارد به‌صورت directive = value است. در این ساختار، directive نام تنظیماتی است که می‌خواهید تغییر دهید (مثلاً memory_limit) و value مقدار جدیدی است که می‌خواهید برای آن تنظیم کنید (مثلاً 256M). بین نام دستورالعمل، علامت مساوی (=) و مقدار می‌تواند فاصله (space) وجود داشته یا نداشته باشد، اما برای خوانایی بیشتر، معمولاً از فاصله استفاده می‌شود. برای مثال، هر دو خط زیر معتبر هستند:

memory_limit=256M
memory_limit = 256M

بسیار مهم است که نام دستورالعمل (directive) را به‌درستی تایپ کنید، زیرا هرگونه اشتباه تایپی باعث می‌شود که PHP این خط را نادیده بگیرد یا خطای سینتکس ایجاد کند. همچنین، مقدار (value) باید با نوع داده‌ای که دستورالعمل انتظار دارد، مطابقت داشته باشد. برای مثال، برای مقادیری که اندازه حافظه را مشخص می‌کنند (مانند memory_limit یا upload_max_filesize)، باید از واحدهای معتبر مانند K (کیلوبایت)، M (مگابایت) یا G (گیگابایت) استفاده کنید.

استفاده از ; برای کامنت‌گذاری

برای افزودن توضیحات یا کامنت در فایل php.ini، باید از علامت سمی‌کالن (;) در ابتدای خط استفاده کنید. هر چیزی که بعد از ; در یک خط بیاید، به‌عنوان کامنت در نظر گرفته شده و توسط PHP نادیده گرفته می‌شود. این ویژگی برای یادداشت‌برداری درباره دلیل تغییر یک تنظیم یا غیرفعال‌کردن موقت یک دستورالعمل بسیار مفید است. برای مثال:

; این مقدار برای سایت فروشگاهی افزایش‌یافته است
memory_limit = 512M

; upload_max_filesize = 2M ; این مقدار به طور موقت غیرفعال شده است

در نسخه‌های جدید PHP (از PHP 7.0 به بعد)، استفاده از علامت هشتگ (#) برای کامنت‌گذاری دیگر معتبر نیست و ممکن است باعث بروز مشکلات شود. برخی ویرایشگرها ممکن است هنوز # را به‌عنوان کامنت رنگی کنند، اما PHP آن را به‌عنوان بخشی از دستورالعمل در نظر می‌گیرد که می‌تواند منجر به خطای سینتکس یا نادیده‌گرفته‌شدن خط بعدی شود؛ بنابراین، همیشه از ; برای کامنت‌گذاری استفاده کنید .

مقادیر بولی (On/Off, True/False, 1/0)

برخی از دستورالعمل‌ها در php.ini تنظیماتی هستند که فقط دو حالت دارند: فعال (On) یا غیرفعال (Off). برای این‌گونه تنظیمات که به آن‌ها مقادیر بولی (Boolean) گفته می‌شود، می‌توانید از چندین فرمت معتبر استفاده کنید. این مقادیر عبارت‌اند از:

  • On یا Off (به‌صورت حروف بزرگ یا کوچک)
  • True یا False (به‌صورت حروف بزرگ یا کوچک)
  • 1 برای فعال و 0 برای غیرفعال

برای مثال، برای فعال‌سازی نمایش خطاها در محیط توسعه، می‌توانید از هر یک از موارد زیر استفاده کنید:

display_errors = On
display_errors = True
display_errors = 1

و برای غیرفعال‌سازی آن در محیط production:

display_errors = Off
display_errors = False
display_errors = 0

همه این فرمت‌ها معتبر هستند و به یک معنا تفسیر می‌شوند. انتخاب بین آن‌ها بیشتر به سلیقه شخصی و سیاست‌های کدنویسی تیم شما بستگی دارد. بااین‌حال، استفاده از On و Off رایج‌تر و توصیه‌شده‌تر است، زیرا خوانایی بیشتری دارد.

تفاوت مقادیر Master Value و Local Value در phpinfo()

هنگامی که صفحه phpinfo() را بررسی می‌کنید، ممکن است برای برخی از دستورالعمل‌ها دو ستون با عناوین “Master Value” و “Local Value” را مشاهده کنید. درک تفاوت بین این دو مقدار برای عیب‌یابی تنظیمات بسیار مهم است.

  • Master Value: این مقدار نشان‌دهندهٔ تنظیمات اصلی و پیش‌فرضی است که در فایل php.ini اصلی سرور تعریف شده است. این مقدار توسط مدیر سرور تنظیم می‌شود و معمولاً نمی‌توان آن را در محیط‌های هاستینگ اشتراکی تغییر داد.
  • Local Value: این مقدار نشان‌دهندهٔ تنظیمات فعلی و مؤثری است که در حال حاضر بر روی اسکریپت PHP شما اعمال شده‌اند. این مقدار می‌تواند از طریق چندین روش بازنویسی شود:
    • فایل php.ini اختصاصی در دایرکتوری وب‌سایت شما.
    • فایل .htaccess (درصورتی‌که PHP به‌عنوان ماژول Apache اجرا شود).
    • توابع PHP مانند ini_set() در کد اسکریپت شما.

اگر “Local Value” و “Master Value” برای یک دستورالعمل متفاوت باشند، به این معناست که تنظیمات پیش‌فرض سرور برای آن دستورالعمل بازنویسی شده است. برای مثال، اگر memory_limit در php.ini اصلی روی 128M تنظیم شده باشد (Master Value)، اما شما در فایل php.ini خود در public_html آن را به 256M تغییر داده باشید، مقدار “Local Value” در phpinfo() 256M خواهد بود. این تفاوت به شما کمک می‌کند تا مطمئن شوید که تنظیمات شما به‌درستی اعمال شده‌اند.

تنظیمات امنیتی حیاتی در php.ini

مخفی‌سازی اطلاعات سرور

تنظیم expose_php = Off

دستورالعمل expose_php کنترل می‌کند که PHP اطلاعات مربوط به خود را در هدرهای HTTP ارسالی به مرورگرها افشا کند یا نه. به طور پیش‌فرض، این تنظیم روی On است که باعث می‌شود PHP در هدر X-Powered-By نسخه خود را اعلام کند. برای مثال، ممکن است هدر X-Powered-By: PHP/8.1.0 را ببینید. این اطلاعات ممکن است برای برخی ابزارهای تحلیلی مفید باشد، اما از دیدگاه امنیتی، یک نقطه‌ضعف محسوب می‌شود.

هکرها می‌توانند با شناسایی نسخه دقیق PHP، آسیب‌پذیری‌های شناخته‌شده آن نسخه را شناسایی کرده و از آن‌ها برای نفوذ به سرور استفاده کنند؛ بنابراین، به‌ویژه در محیط‌های production (زنده)، بسیار توصیه می‌شود که این تنظیم را غیرفعال کنید. با تنظیم expose_php = Off، PHP دیگر نسخه خود را در هدرها ارسال نمی‌کند و اطلاعات سرور شما تاحدامکان مخفی می‌ماند. این یکی از ساده‌ترین و مؤثرترین اقدامات برای افزایش امنیت سرور است.

تنظیم display_errors = Off در محیط Production

دستورالعمل display_errors تعیین می‌کند که آیا پیام‌های خطای PHP باید در خروجی HTML به کاربر نمایش داده شوند یا خیر. درحالی‌که در محیط توسعه (development) فعال‌بودن این گزینه (On) برای اشکال‌زدایی بسیار مفید است، اما در محیط production (زنده) باید حتماً غیرفعال (Off) شود. دلیل این امر آن است که پیام‌های خطا می‌توانند اطلاعات حساس و مهمی درباره ساختار فایل‌ها و دایرکتوری‌های سرور، نام‌های پایگاه‌داده، جداول و حتی نام کاربری و رمز عبور در برخی موارد را افشا کنند.

این اطلاعات برای یک مهاجم بسیار ارزشمند است و می‌تواند مسیر حمله را برای او هموار کند؛ بنابراین، در یک وب‌سایت زنده، هیچ‌گاه نباید display_errors را روی On تنظیم کرد. در عوض، برای بررسی خطاها باید از ثبت آن‌ها در فایل‌های لاگ (log) استفاده کرد که با تنظیم log_errors = On انجام می‌شود. این کار باعث می‌شود که خطاها برای توسعه‌دهندگان قابل‌بررسی باشند، اما برای کاربران عادی و مهاجمان نمایش داده نشوند.

محدودسازی دسترسی و توابع خطرناک

غیرفعال‌سازی توابع پرریسک با disable_functions

دستورالعمل disable_functions یکی از قدرتمندترین ابزارهای امنیتی در php.ini است. این دستورالعمل به شما امکان می‌دهد تا یک لیست از توابع PHP را که به نظر شما خطرناک هستند، غیرفعال کنید. این توابع معمولاً توابعی هستند که امکان اجرای دستورات سیستم‌عامل، خواندن یا نوشتن فایل‌ها در مسیرهای حساس، یا دستکاری در ساختار سرور را می‌دهند. با غیرفعال‌سازی این توابع، حتی اگر یک مهاجم موفق به آپلود یک اسکریپت مخرب شود، نمی‌تواند از این توابع برای آسیب‌رساندن به سرور استفاده کند. برخی از توابع پرریسک که معمولاً توصیه می‌شود غیرفعال شوند عبارت‌اند از:

  • exec: برای اجرای دستورات سیستم‌عامل.
  • system: مشابه exec، اما خروجی را مستقیماً به مرورگر ارسال می‌کند.
  • passthru: برای اجرای دستورات و ارسال خروجی خام آن‌ها.
  • shell_exec: برای اجرای دستورات از طریق شِل (Shell).
  • proc_open: برای اجرای یک فرایند با کنترل بیشتر بر ورودی و خروجی.
  • popen: برای اجرای یک فرایند و بازگرداندن یک pointer به فایل.
  • eval: برای اجرای یک‌رشته به‌عنوان کد PHP (بسیار خطرناک).
  • assert: می‌تواند برای اجرای کد مخرب استفاده شود.
  • create_function: منسوخ شده و می‌تواند برای ایجاد توابع پویا و اجرای کد مخرب استفاده شود.

برای غیرفعال‌سازی این توابع، کافی است آن‌ها را با کاما (,) از هم جدا کرده و به‌عنوان مقدار disable_functions اختصاص دهید:

disable_functions = exec,passthru,shell_exec,system,proc_open,popen,eval,assert,create_function

توجه داشته باشید که غیرفعال‌سازی برخی از این توابع ممکن است عملکرد برخی اسکریپت‌ها یا افزونه‌ها را مختل کند؛ بنابراین، قبل از اعمال این تغییرات، باید از عدم استفاده وب‌سایت شما از این توابع اطمینان حاصل کنید.

محدود کردن دسترسی به فایل‌ها با open_basedir

دستورالعمل open_basedir یکی از قدرتمندترین ابزارهای امنیتی در php.ini است که امکان محدودکردن دسترسی فایل‌های PHP به یک دایرکتوری خاص و زیر دایرکتوری‌‌های آن را فراهم می‌کند. به طور پیش‌فرض، یک اسکریپت PHP می‌تواند به هر فایلی در سرور که کاربر وب سرور به آن دسترسی دارد، دسترسی پیدا کند. این می‌تواند خطرناک باشد، به‌خصوص در محیط‌های اشتراکی (Shared Hosting) یا اگر یک آسیب‌پذیری Directory Traversal در برنامه شما وجود داشته باشد. با استفاده از open_basedir، می‌توانید یک “قفس” (sandbox) ایجاد کنید که اسکریپت‌های PHP فقط بتوانند در داخل آن کار کنند.

برای استفاده از این ویژگی، باید مسیر دایرکتوری موردنظر را به‌عنوان مقدار open_basedir قرار دهید. برای مثال، اگر می‌خواهید اسکریپت‌های PHP فقط به فایل‌های داخل دایرکتوری public_html دسترسی داشته باشند، باید تنظیم را به‌صورت زیر انجام دهید:

open_basedir = "/home/username/public_html"

در این صورت، هر تلاشی برای دسترسی به فایلی خارج از این مسیر (مثلاً /etc/passwd یا فایل‌های پیکربندی در دایرکتوری بالاتر) با خطا مواجه خواهد شد. این دستورالعمل به‌ویژه در هاست‌های اشتراکی که چندین وب‌سایت مختلف روی یک سرور قرار دارند، بسیار مفید است، زیرا از دسترسی یک وب‌سایت به فایل‌های وب‌سایت دیگر جلوگیری می‌کند. توجه داشته باشید که برخی از توابع PHP مانند file_exists() یا is_readable() نیز تحت‌تأثیر این محدودیت قرار می‌گیرند؛ بنابراین، پس از فعال‌سازی open_basedir، باید برنامه خود را به‌دقت تست کنید تا مطمئن شوید که همه عملکردهای آن به‌درستی کار می‌کنند.

تنظیم allow_url_fopen و allow_url_include

دو دستورالعمل allow_url_fopen و allow_url_include کنترل می‌کنند که آیا اسکریپت‌های PHP می‌توانند فایل‌های راه دور (remote files) را از طریق URL (مانند http:// یا ftp://) باز کنند یا خیر. به طور پیش‌فرض، allow_url_fopen روی On است که به توابعی مانند file_get_contents() اجازه می‌دهد تا محتوای یک URL را بخوانند. اگرچه این ویژگی در برخی موارد مفید است (مثلاً برای دریافت فیدهای RSS)، اما می‌تواند یک نقطه ورود برای حملات باشد. اگر یک مهاجم بتواند URL‌ای را که توسط اسکریپت PHP خوانده می‌شود، کنترل کند، می‌تواند کد مخرب خود را از یک سرور دیگر بارگذاری کند. این نوع حمله به‌عنوان Remote File Inclusion (RFI) شناخته می‌شود.

دستورالعمل allow_url_include که به طور پیش‌فرض Off است، این رفتار را به توابع include و require گسترش می‌دهد. اگر این تنظیم فعال شود، یک مهاجم می‌تواند کد مخرب خود را به‌صورت مستقیم در وب‌سایت شما اجرا کند؛ بنابراین، به‌ویژه در محیط‌های production، توصیه می‌شود که هر دو این تنظیمات را غیرفعال کنید، مگر اینکه به طور خاص به آن‌ها نیاز داشته باشید:

allow_url_fopen = Off
allow_url_include = Off

غیرفعال‌سازی این تنظیمات می‌تواند از بسیاری از حملات RFI جلوگیری کند. اگر یک افزونه یا اسکریپت خاص به این ویژگی نیاز دارد، بهتر است به‌جای فعال‌سازی سراسری آن، راه‌حل‌های جایگزین امن‌تری پیدا کنید.

مدیریت آپلود فایل

غیرفعال‌سازی کامل آپلود با file_uploads = Off

دستورالعمل file_uploads یک کلید اصلی برای کنترل قابلیت آپلود فایل در PHP است. این تنظیم به طور مستقیم تعیین می‌کند که آیا کاربران می‌توانند فایل‌ها را از طریق فرم‌های HTML به سرور آپلود کنند یا خیر. به طور پیش‌فرض، این تنظیم روی On است. اگر وب‌سایت شما هیچ نیازی به قابلیت آپلود فایل توسط کاربران ندارد (مثلاً یک وب‌سایت ساده شرکتی یا یک وبلاگ شخصی بدون قابلیت ارسال نظر با تصویر)، بهترین کار برای افزایش امنیت، غیرفعال‌سازی کامل این ویژگی است. با تنظیم file_uploads = Off، تمام تلاش‌ها برای آپلود فایل از طریق PHP ناکام خواهند ماند.

این کار یک‌لایه امنیتی اضافی ایجاد می‌کند و حمله سطح را کاهش می‌دهد، زیرا حتی اگر یک مهاجم بتواند یک فرم مخرب ایجاد کند، نمی‌تواند از طریق آن فایلی را آپلود کند. این تنظیم باید بادقت بررسی شود، زیرا غیرفعال‌سازی آن می‌تواند عملکرد بسیاری از افزونه‌های وردپرس، سیستم‌های مدیریت محتوا و برنامه‌های کاربردی وب را مختل کند که به قابلیت آپلود فایل متکی هستند.

محدود کردن حجم و تعداد فایل‌های قابل آپلود

مدیریت آپلود فایل فقط به غیرفعال‌سازی یا فعال‌سازی آن محدود نمی‌شود. حتی اگر قابلیت آپلود فایل را فعال کرده‌اید، باید محدودیت‌هایی را برای جلوگیری از سوءاستفاده اعمال کنید. این محدودیت‌ها شامل حجم فایل، تعداد فایل‌های قابل آپلود در یک درخواست، و اندازه کل داده‌های POST است.

دستورالعمل توضیحات مثال
upload_max_filesize حداکثر اندازه یک فایل واحد که می‌تواند آپلود شود. upload_max_filesize = 64M
post_max_size حداکثر اندازه کل داده‌هایی که می‌توانند از طریق POST ارسال شوند (شامل فایل‌ها و فیلدهای متنی). باید بزرگ‌تر یا مساوی upload_max_filesize باشد. post_max_size = 64M
max_file_uploads حداکثر تعداد فایل‌هایی که می‌توانند در یک درخواست آپلود شوند. max_file_uploads = 20
max_execution_time حداکثر زمان اجرای یک اسکریپت. برای آپلود فایل‌های بزرگ باید افزایش یابد. max_execution_time = 300
max_input_time حداکثر زمان صرف‌شده برای پردازش داده‌های ورودی. برای آپلود فایل‌های بزرگ باید افزایش یابد. max_input_time = 300

با تنظیم این مقادیر به طور مناسب، می‌توانید از آپلود فایل‌های بسیار بزرگ یا تعداد زیادی فایل که می‌توانند منابع سرور را مصرف کنند، جلوگیری کنید. این کار نه‌تنها امنیت را افزایش می‌دهد، بلکه عملکرد کلی سرور را نیز بهبود می‌بخشد.

بهینه‌سازی عملکرد با دستورات کلیدی

مدیریت حافظه و زمان اجرا

افزایش حافظه مجاز با memory_limit

دستورالعمل memory_limit یکی از مهم‌ترین تنظیمات برای بهینه‌سازی عملکرد و جلوگیری از خطاهای رایج در PHP است. این تنظیم حداکثر مقدار حافظه (RAM) را که یک اسکریپت PHP مجاز است مصرف کند، مشخص می‌کند. به طور پیش‌فرض، این مقدار معمولاً 128M یا 256M است، اما بسته به نوع هاستینگ و پیکربندی سرور می‌تواند متفاوت باشد.

اگر یک اسکریپت PHP (مثلاً یک افزونه وردپرس، یک اسکریپت پردازش تصویر یا یک گزارش‌گیری پیچیده) نیاز به حافظه بیشتری داشته باشد، با بروز خطای “Fatal error: Allowed memory size of X bytes exhausted” مواجه خواهید شد. برای رفع این مشکل، باید مقدار memory_limit را افزایش دهید. برای مثال، برای یک وب‌سایت وردپرس با افزونه‌های متعدد، مقدار 256M یا حتی 512M توصیه می‌شود. برای تنظیم این مقدار، کافی است خط زیر را در php.ini پیدا کرده و آن را ویرایش کنید:

memory_limit = 512M

بااین‌حال، باید در افزایش این مقدار احتیاط کنید. تنظیم آن به‌صورت نامحدود (-1) یا یک مقدار بسیار بالا می‌تواند باعث شود که یک اسکریپت معیوب تمام حافظه سرور را مصرف کند و باعث کندی یا حتی کرش سرور شود؛ بنابراین، همیشه یک مقدار معقول و مورد نیاز را تنظیم کنید.

تنظیم حداکثر زمان اجرای اسکریپت با max_execution_time

دستورالعمل max_execution_time حداکثر زمان (به ثانیه) را که یک اسکریپت PHP مجاز است اجرا شود، تعیین می‌کند. به طور پیش‌فرض، این مقدار معمولاً 30 ثانیه است. این تنظیم به عنوان یک مکانیزم ایمنی عمل می‌کند تا از اجرای بی‌پایان اسکریپت‌های معیوب یا بسیار سنگین که می‌توانند منابع CPU سرور را به طور کامل اشغال کنند، جلوگیری شود.

اگر یک اسکریپت زمان بیشتری برای اجرا نیاز داشته باشد (مثلاً برای پردازش یک فایل بزرگ، ایجاد یک پشتیبان‌گیری از پایگاه داده یا تماس با یک API خارجی کند)، با خطای “Maximum execution time of X seconds exceeded” مواجه خواهید شد. در این صورت، باید مقدار max_execution_time را افزایش دهید. برای مثال، برای اسکریپت‌هایی که ممکن است چند دقیقه طول بکشند، می‌توانید آن را به 300 ثانیه (5 دقیقه) یا بیشتر تنظیم کنید :

max_execution_time = 300

بااین‌حال، همانند memory_limit، باید در افزایش این مقدار احتیاط کنید. تنظیم آن به 0 (صفر) به معنای زمان اجرای نامحدود است که می‌تواند بسیار خطرناک باشد. این کار می‌تواند باعث شود که یک اسکریپت معیوب برای همیشه اجرا شود و سرور را غیرقابل استفاده کند؛ بنابراین، همیشه یک حد معقول را تعیین کنید.

تنظیم max_input_time برای پردازش داده‌های ورودی

دستورالعمل max_input_time حداکثر زمان (به ثانیه) را که یک اسکریپت PHP مجاز است صرف پردازش داده‌های ورودی کند، تعیین می‌کند. این داده‌ها شامل داده‌های POST، GET و آپلود فایل‌ها می‌شوند. به طور پیش‌فرض، این مقدار معمولاً 60 ثانیه است. این تنظیم به‌ویژه در هنگام آپلود فایل‌های بزرگ اهمیت پیدا می‌کند. اگر زمان لازم برای آپلود یک فایل بزرگ از max_input_time بیشتر باشد، آپلود با شکست مواجه خواهد شد، حتی اگر max_execution_time کافی باشد؛ بنابراین، اگر قصد دارید فایل‌های بسیار بزرگی را آپلود کنید، باید این مقدار را نیز افزایش دهید. برای مثال:

max_input_time = 300

در این مثال، زمان پردازش داده‌های ورودی به 5 دقیقه افزایش یافته است. این تنظیم باید همراه با max_execution_time و تنظیمات آپلود فایل انجام شود تا یک تجربه آپلود روان و بدون خطا برای کاربران فراهم شود.

PHP.ini

PHP.ini

بهینه‌سازی آپلود فایل

افزایش حجم آپلود با upload_max_filesize

دستورالعمل upload_max_filesize حداکثر اندازه یک فایل را که می‌تواند از طریق فرم HTML آپلود شود، مشخص می‌کند. به طور پیش‌فرض، این مقدار معمولاً 2M (2 مگابایت) یا 8M (8 مگابایت) است. این محدودیت برای بسیاری از برنامه‌ها کافی است، اما برای وب‌سایت‌هایی که نیاز به آپلود فایل‌های بزرگ‌تر دارند (مانند وب‌سایت‌های عکاسی، فروشگاه‌های فایل دیجیتال یا پلتفرم‌های ویدیویی)، این مقدار باید افزایش یابد. اگر کاربران شما در هنگام آپلود فایل با پیام خطای “The uploaded file exceeds the upload_max_filesize directive in php.ini” مواجه می‌شوند، به این معناست که باید این تنظیم را تغییر دهید. برای مثال، برای اجازه آپلود فایل‌های تا 64 مگابایت، باید خط زیر را در php.ini تنظیم کنید :

upload_max_filesize = 64M

توجه داشته باشید که این تنظیم فقط بر حجم یک فایل واحد تأثیر می‌گذارد. همچنین، باید مطمئن شوید که تنظیمات دیگر مرتبط نیز به‌درستی پیکربندی شده‌اند، به‌ویژه post_max_size که باید بزرگ‌تر یا برابر با upload_max_filesize باشد.

تنظیم post_max_size برای داده‌های فرم

دستورالعمل post_max_size حداکثر اندازه کل داده‌هایی را که می‌توانند از طریق متد POST (که در اکثر فرم‌های HTML استفاده می‌شود) ارسال شوند، محدود می‌کند. این تنظیم شامل تمام فیلدهای فرم، علاوه بر فایل‌های آپلودی است. به طور پیش‌فرض، این مقدار معمولاً 8M (8 مگابایت) است. این مقدار باید همیشه بزرگ‌تر یا مساوی با upload_max_filesize تنظیم شود. اگر post_max_size کوچک‌تر از upload_max_filesize باشد، آپلود فایل‌های بزرگ‌تر از post_max_size با شکست مواجه خواهد شد، حتی اگر upload_max_filesize اجازه آن را بدهد. برای مثال، اگر upload_max_filesize را روی 64M تنظیم کرده‌اید، باید post_max_size را نیز به طور مناسب افزایش دهید:

upload_max_filesize = 64M
post_max_size = 64M

در برخی موارد، ممکن است لازم باشد post_max_size را حتی بزرگ‌تر از upload_max_filesize تنظیم کنید، به‌ویژه اگر فرم شما علاوه بر فایل آپلودی، فیلدهای متنی زیادی نیز داشته باشد. همچنین، افزایش این مقادیر باید همراه با افزایش max_execution_time باشد، زیرا آپلود و پردازش فایل‌های بزرگ زمان بیشتری می‌برد.

فعال‌سازی کشینگ با OPcache

فعال‌سازی OPcache با opcache.enable=1

OPcache یکی از مهم‌ترین افزونه‌های PHP برای بهینه‌سازی عملکرد است. این افزونه کدهای PHP را به‌صورت پیش‌کامپایل‌شده (bytecode) در حافظه نگه می‌دارد. در نتیجه، در درخواست‌های بعدی، نیازی به خواندن و پردازش مجدد فایل‌های PHP از روی دیسک نیست که باعث افزایش چشمگیر سرعت اجرای اسکریپت‌ها می‌شود. در اکثر نسخه‌های جدید PHP، OPcache به‌صورت پیش‌فرض نصب و فعال است. برای اطمینان از فعال‌بودن آن، باید دستورالعمل opcache.enable را در فایل php.ini بررسی کنید:

opcache.enable=1

اگر این خط وجود ندارد یا مقدار آن 0 است، باید آن را به 1 تغییر دهید و وب سرور را ری استارت کنید. فعال‌سازی OPcache یکی از ساده‌ترین و مؤثرترین راه‌ها برای بهبود عملکرد وب‌سایت‌های PHP است.

تنظیم حافظه OPcache با opcache.memory_consumption

دستورالعمل opcache.memory_consumption مقدار حافظه (به مگابایت) را که OPcache برای ذخیره‌سازی کدهای پیش‌کامپایل‌شده اختصاص می‌دهد، تعیین می‌کند. اگر حافظه کافی اختصاص داده نشود، OPcache مجبور خواهد بود کدهای قدیمی را حذف کند تا فضا برای کدهای جدید ایجاد شود که باعث کاهش کارایی می‌شود. مقدار پیش‌فرض معمولاً 64M یا 128M است، اما برای وب‌سایت‌های بزرگ با فایل‌های PHP زیاد، ممکن است نیاز به افزایش این مقدار باشد. برای مثال:

opcache.memory_consumption=256

در این مثال، حافظه اختصاص‌داده‌شده به OPcache به 256 مگابایت افزایش یافته است. برای یافتن مقدار بهینه، می‌توانید از ابزارهایی مانند opcache-gui یا بررسی خروجی تابع opcache_get_status() استفاده کنید تا ببینید چقدر از حافظه OPcache در حال استفاده است. اگر نرخ استفاده نزدیک به 100٪ باشد، باید مقدار opcache.memory_consumption را افزایش دهید.

مدیریت خطاها (Error Handling) و گزارش‌دهی

سطح گزارش خطاها با error_reporting

تنظیمات رایج برای توسعه (E_ALL)

در محیط توسعه (development)، هدف این است که تمامی خطاها، هشدارها و اطلاعیه‌ها را ببینید تا بتوانید اشکالات کد را به‌راحتی پیدا و برطرف کنید؛ بنابراین، توصیه می‌شود که سطح گزارش‌دهی را روی بالاترین حد ممکن تنظیم کنید. این کار با استفاده از ثابت E_ALL انجام می‌شود:

error_reporting = E_ALL
display_errors = On

با این تنظیم، PHP تمامی خطاها (E_ERROR)، هشدارها (E_WARNING)، اطلاعیه‌ها (E_NOTICE) و سایر پیام‌ها را نمایش می‌دهد. این امر به شما کمک می‌کند تا مشکلاتی مانند استفاده از متغیرهای تعریف‌نشده یا فراخوانی توابع با پارامترهای اشتباه را قبل از انتقال وب‌سایت به محیط زنده، شناسایی کنید.

تنظیمات رایج برای محیط Production (E_ALL & ~E_DEPRECATED & ~E_STRICT)

در محیط production (زنده)، نمایش تمامی خطاها به کاربران نهایی نه‌تنها تجربه کاربری بدی ایجاد می‌کند، بلکه می‌تواند اطلاعات حساس را نیز افشا کند؛ بنابراین، باید گزارش‌دهی خطاها را محدود کرده و آن‌ها را به‌جای نمایش، در فایل‌های لاگ ثبت کنید. یک تنظیم رایج برای محیط production این است که تمامی خطاها به‌جز هشدارهای مربوط به توابع منسوخ‌شده (E_DEPRECATED) و استانداردهای کدنویسی (E_STRICT) گزارش شوند. این کار با استفاده از عملگرهای بیتی & (AND) و ~ (NOT) انجام می‌شود:

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
log_errors = On

با این تنظیم، خطاهای جدی (E_ERROR) و هشدارها (E_WARNING) که ممکن است نشان‌دهنده مشکلات عملکردی باشند، ثبت می‌شوند، اما پیام‌هایی که بیشتر جنبه توصیه‌ای دارند، نادیده گرفته می‌شوند. این کار باعث می‌شود که فایل‌های لاگ شما تمیزتر و قابل‌مدیریت‌تر بمانند، درحالی‌که همچنان اطلاعات مهم برای عیب‌یابی را در اختیار دارید.

نمایش یا ثبت خطاها

تنظیم display_errors برای نمایش خطا در مرورگر

دستورالعمل display_errors کنترل می‌کند که آیا پیام‌های خطا باید مستقیماً در خروجی HTML که به مرورگر ارسال می‌شود، نمایش داده شوند یا خیر. همان‌طور که در بخش‌های قبلی نیز اشاره شد، این تنظیم باید باتوجه‌به محیطی که در آن کار می‌کنید، تغییر کند. در محیط توسعه، برای اشکال‌زدایی آسان، باید آن را روی On تنظیم کنید:

display_errors = On

این کار باعث می‌شود که خطاها مستقیماً در صفحه وب نمایش داده شوند و شما می‌توانید بلافاصله مشکل را ببینید. بااین‌حال، در محیط production، این تنظیم باید حتماً روی Off باشد:

display_errors = Off

فعال نگه‌داشتن display_errors در محیط زنده می‌تواند اطلاعات حساس درباره ساختار سرور، مسیر فایل‌ها و حتی کدهای منبع را در اختیار کاربران و مهاجمان قرار دهد. این اطلاعات می‌تواند برای شناسایی آسیب‌پذیری‌ها و برنامه‌ریزی برای حملات استفاده شود؛ بنابراین، غیرفعال‌سازی آن یکی از اصول اولیه امنیت PHP است.

فعال‌سازی ثبت خطا با log_errors = On

درحالی‌که در محیط production نباید خطاها را به کاربر نمایش دهید، اما همچنان نیاز دارید که آن‌ها را برای بررسی و عیب‌یابی ثبت کنید. این کار با استفاده از دستورالعمل log_errors انجام می‌شود. برای فعال‌سازی ثبت خطاها، باید این تنظیم را روی On قرار دهید:

log_errors = On

وقتی log_errors فعال باشد، تمامی خطاهایی که توسط error_reporting مشخص شده‌اند، در یک فایل لاگ ثبت خواهند شد. این فایل می‌تواند فایل لاگ پیش‌فرض سیستم (مانند /var/log/apache2/error.log در Apache در لینوکس) باشد یا یک فایل اختصاصی که توسط شما تعیین شده است. ترکیب log_errors = On با display_errors = Off در محیط production، بهترین روش برای مدیریت خطاها است: خطاها برای کاربران نمایش داده نمی‌شوند، اما برای مدیران سرور قابل‌بررسی هستند.

تعیین مسیر فایل لاگ با error_log

دستورالعمل error_log به شما امکان می‌دهد تا مسیر فایلی را که می‌خواهید خطاها در آن ثبت شوند، به طور خاص تعیین کنید. اگر این تنظیم خالی باشد (که به طور پیش‌فرض همین‌طور است)، PHP از فایل لاگ پیش‌فرض وب سرور استفاده می‌کند. با استفاده از error_log، می‌توانید یک فایل اختصاصی برای لاگ‌های PHP ایجاد کنید که باعث می‌شود بررسی خطاها آسان‌تر شود. برای مثال:

log_errors = On
error_log = /var/log/php_errors.log

در این مثال، تمامی خطاهای PHP در فایل /var/log/php_errors.log ثبت خواهند شد. قبل از تنظیم این مقدار، باید مطمئن شوید که کاربر وب سرور (مانند www-data در Apache در لینوکس) اجازه نوشتن در این فایل یا دایرکتوری مربوطه را دارد. در غیر این صورت، خطاها ثبت نخواهند شد. استفاده از یک فایل لاگ اختصاصی به شما کمک می‌کند تا خطاهای PHP را از سایر لاگ‌های سیستم جدا کنید و بررسی آن‌ها را ساده‌تر کنید.

رفع خطاهای رایج و عیب‌یابی

خطای “Allowed memory size exhausted”

یکی از رایج‌ترین خطاهایی که در PHP با آن مواجه می‌شوید، “Fatal error: Allowed memory size of X bytes exhausted” است. این خطا زمانی رخ می‌دهد که یک اسکریپت PHP سعی می‌کند مقدار حافظه‌ای بیشتر از حدی که توسط دستورالعمل memory_limit در php.ini تعیین شده است، مصرف کند. دلایل بروز این خطا می‌تواند متعدد باشد، از جمله‌پردازش یک تصویر بسیار بزرگ، خواندن یک فایل حجیم در حافظه، یا اجرای یک کوئری پایگاه‌داده که نتایج بسیار زیادی دارد. برای رفع این خطا، باید مقدار memory_limit را افزایش دهید. برای مثال، اگر خطا نشان می‌دهد که حافظه 128 مگابایتی تمام شده است، می‌توانید آن را به 256 مگابایت افزایش دهید:

memory_limit = 256M

برای وب‌سایت‌هایی که از افزونه‌های سنگین مانند WooCommerce استفاده می‌کنند، حتی ممکن است نیاز به 512M یا بیشتر داشته باشید. بااین‌حال، قبل از افزایش این مقدار، باید بررسی کنید که آیا کد شما بهینه است یا خیر. گاهی اوقات، این خطا ناشی از یک حلقه بینهایت یا یک تابع ناکارآمد است که حافظه را به طور غیرضروری مصرف می‌کند. در این موارد، بهتر است ابتدا کد را بهینه کنید تا به‌جای افزایش نامحدود حافظه، مشکل اصلی را برطرف کنید.

خطای “Maximum execution time exceeded”

خطای “Fatal error: Maximum execution time of X seconds exceeded” زمانی رخ می‌دهد که یک اسکریپت PHP زمان بیشتری برای اجرا نسبت به حدی که توسط max_execution_time تعیین شده است، طول می‌کشد. این خطا معمولاً در هنگام انجام عملیات زمان‌بر مانند آپلود فایل‌های بزرگ، پردازش داده‌های زیاد، یا برقراری ارتباط با سرویس‌های خارجی کند رخ می‌دهد. برای مثال، اگر max_execution_time روی 30 ثانیه تنظیم شده باشد و اسکریپت شما برای آپلود یک فایل 50 مگابایتی بیش از 30 ثانیه زمان ببرد، این خطا رخ خواهد داد. برای رفع این مشکل، باید مقدار max_execution_time را افزایش دهید. برای مثال، برای اجازه اجرای اسکریپت تا 5 دقیقه:

max_execution_time = 300

در کنار max_execution_time، ممکن است لازم باشد max_input_time را نیز افزایش دهید. این دستورالعمل حداکثر زمان صرف‌شده برای پردازش داده‌های ورودی (GET, POST, و آپلود فایل) را محدود می‌کند. اگر زمان آپلود فایل بسیار طولانی است، افزایش این مقدار نیز ضروری است:

max_input_time = 300

همانند memory_limit، افزایش بیش از حد این مقادیر می‌تواند خطرناک باشد. تنظیم max_execution_time به 0 (صفر) به معنای زمان اجرای نامحدود است که می‌تواند باعث اجرای بی‌پایان اسکریپت‌های معیوب شود؛ بنابراین، همیشه یک حد معقول را تعیین کنید.

خطای “The uploaded file exceeds the upload_max_filesize directive”

این خطا یکی از واضح‌ترین و رایج‌ترین خطاها در هنگام آپلود فایل است. پیام “The uploaded file exceeds the upload_max_filesize directive in php.ini” به طور مستقیم به شما می‌گوید که فایلی که کاربر سعی دارد آپلود کند، از حداکثر اندازه‌ای که توسط upload_max_filesize تعیین شده است، بزرگ‌تر است. برای مثال، اگر این تنظیم روی 2M (2 مگابایت) باشد و کاربر یک فایل 5 مگابایتی را آپلود کند، این خطا رخ خواهد داد. راه‌حل این مشکل ساده است: باید مقدار upload_max_filesize را افزایش دهید. برای مثال، برای اجازه آپلود فایل‌های تا 64 مگابایت:

upload_max_filesize = 64M

بااین‌حال، همان‌طور که در بخش‌های قبلی توضیح داده شد، این تنظیم به‌تنهایی کافی نیست. شما همچنین باید مطمئن شوید که post_max_size (که حجم کل داده‌های فرم را محدود می‌کند) بزرگ‌تر یا مساوی با upload_max_filesize است. همچنین، max_execution_time و max_input_time باید به‌اندازه کافی بزرگ باشند تا زمان لازم برای آپلود فایل‌های بزرگ را فراهم کنند؛ بنابراین، برای رفع این خطا، معمولاً نیاز به تنظیم چندین دستورالعمل به‌صورت هم‌زمان دارید.

چرا تغییرات من در php.ini اعمال نمی‌شود؟

یکی از رایج‌ترین مشکلاتی که کاربران هنگام ویرایش php.ini با آن مواجه می‌شوند، این است که پس از اعمال تغییرات و ذخیره فایل، تغییرات در عمل دیده نمی‌شود. این مشکل می‌تواند دلایل مختلفی داشته باشد که در ادامه بررسی می‌کنیم.

ویرایش فایل اشتباه (تفاوت php.ini سرور و محلی)

مهم‌ترین دلیل این مشکل، ویرایش فایل php.ini اشتباه است. در بسیاری از سرورها، ممکن است چندین فایل php.ini وجود داشته باشد. برای مثال، یک فایل برای CLI (Command Line Interface) و یک فایل جداگانه برای Apache یا Nginx. اگر شما فایل php.ini را از طریق SSH پیدا کرده‌اید، ممکن است مسیر آن برای CLI باشد (مثلاً /etc/php/7.4/cli/php.ini)، درحالی‌که وب سرور شما از فایل دیگری استفاده می‌کند (مثلاً /etc/php/7.4/apache2/php.ini). برای اطمینان از اینکه فایل درست را ویرایش می‌کنید، حتماً از تابع phpinfo() استفاده کنید. این تابع مسیر دقیق فایل php.ini که توسط وب سرور بارگذاری شده است را به شما نشان می‌دهد.

عدم ری استارت وب سرور پس از اعمال تغییرات

همان‌طور که بارها تأکید شده است، PHP تنظیمات خود را فقط یک‌بار در زمان راه‌اندازی بارگذاری می‌کند؛ بنابراین، پس از هر تغییر در php.ini، باید وب سرور (Apache یا Nginx) یا PHP-FPM را ری استارت کنید. فراموش‌کردن این مرحله یکی از رایج‌ترین دلایلی است که تغییرات اعمال نمی‌شوند. پس از ری استارت، برای اطمینان، دوباره صفحه phpinfo.php را بررسی کنید.

وجود خطای نگارشی (Syntax Error) در فایل

اگر در فایل php.ini خطای نگارشی (Syntax Error) وجود داشته باشد، PHP ممکن است نتواند فایل را به‌درستی بخواند و تنظیمات را اعمال کند. این خطاها می‌تواند شامل موارد زیر باشد:

  • فراموش‌کردن علامت مساوی (=) بین دستورالعمل و مقدار.
  • استفاده از نقل‌قول نادرست برای مقادیر رشته‌ای.
  • اشتباه تایپی در نام دستورالعمل.

در صورت بروز چنین خطاهایی، ممکن است در لاگ‌های وب سرور یا PHP پیام‌هایی مشاهده کنید که به خطای سینتکس در php.ini اشاره دارند. برای رفع این مشکل، باید فایل را بادقت بررسی کرده و خطاهای نگارشی را اصلاح کنید.

محدودیت‌های اعمال شده توسط هاستینگ

در هاست‌های اشتراکی، ممکن است ارائه‌دهنده هاستینگ محدودیت‌هایی را بر روی برخی از تنظیمات php.ini اعمال کرده باشد. این محدودیت‌ها می‌تواند به دلایل امنیتی یا مدیریت منابع سرور باشد. در این موارد، حتی اگر شما مقدار یک دستورالعمل را در فایل php.ini خود تغییر دهید، ممکن است این تغییر توسط سرور نادیده گرفته شود. برای مثال، ممکن است حداکثر مقدار memory_limit یا max_execution_time توسط هاستینگ محدود شده باشد. در این شرایط، بهترین کار تماس با پشتیبانی هاستینگ و پرسیدن درباره محدودیت‌های موجود است.

آموزش php-fpm

php-fpm چیست؟

درک اینکه php-fpm چیست، پایه‌ای‌ترین قدم در مسیر یادگیری معماری‌های مدرن وب است. php-fpm چیست؟ پاسخ ساده این است: PHP-FPM (FastCGI Process Manager) یک سرویس مستقل برای اجرای اسکریپت‌های PHP است که بر پایه پروتکل FastCGI ساخته شده و مدیریت هوشمند فرآیندهای PHP را بر عهده دارد. برخلاف روش‌های قدیمی مانند mod_php، PHP-FPM امکان اجرای موازی، مصرف بهینه منابع و جداسازی کامل از وب‌سرور را فراهم می‌کند. هر کسی که می‌پرسد php-fpm چیست، باید بداند که این فناوری امروزه استاندارد صنعت برای محیط‌های تولید است.

چرا پرسیدن «php-fpm چیست» مهم است؟

پرسیدن php-fpm چیست تنها یک کنجکاوی فنی نیست، بلکه نشانه‌ای از تمایل به درک عمیق‌تر سیستم‌های وب است. بدون پاسخ به این پرسش، آموزش php-fpm ناقص خواهد ماند. زیرا بدون دانستن اینکه php-fpm چیست، نمی‌توان تنظیمات آن را بهینه کرد یا خطاهای آن را رفع نمود. همین‌طور، وقتی توسعه‌دهندگان بفهمند php-fpm چیست، قادر خواهند بود تصمیمات بهتری در مورد معماری سرور، امنیت و مقیاس‌پذیری بگیرند.

مقدمه‌ای بر PHP-FPM و اهمیت آن

آموزش php-fpm یکی از پایه‌های اساسی در توسعه وب مدرن با زبان PHP محسوب می‌شود. با توجه به اینکه PHP-FPM به‌عنوان یک جایگزین کارآمد برای روش‌های قدیمی اجرای PHP عمل می‌کند، یادگیری آن به‌طور مستقیم بر کیفیت و عملکرد پروژه‌های وب تأثیر می‌گذارد. هدف اصلی آموزش php-fpm، آشنایی کاربران با نحوه نصب، پیکربندی دقیق و مدیریت هوشمند این سرویس است تا بتوانند از ظرفیت کامل آن در محیط‌های واقعی بهره ببرند. در این مسیر، پرسش php-fpm چیست همواره همراه یادگیرنده خواهد بود.

دلایل ضرورت آموزش php-fpm

در دنیای امروز که وب‌سایت‌ها با حجم بالایی از ترافیک و نیازهای پیچیده‌تری مواجه هستند، آموزش php-fpm تنها یک گزینه اختیاری نیست، بلکه یک نیاز فنی و عملیاتی است. PHP-FPM امکان پردازش همزمان چندین درخواست را فراهم می‌کند و مستقیماً بر سرعت پاسخ‌دهی، پایداری سیستم و مقیاس‌پذیری آن تأثیر می‌گذارد. به همین دلیل، آموزش php-fpm برای هر توسعه‌دهنده، مهندس DevOps یا مدیر سیستمی که با PHP سروکار دارد، از اهمیت بالایی برخوردار است. و همه این‌ها از پاسخ به سؤال اولیه php-fpm چیست آغاز می‌شود.

مفاهیم کلیدی در آموزش php-fpm

در طول آموزش php-fpm، کاربران با مفاهیمی مانند poolهای پردازشی، مدیریت فرآیندهای فرزند (child processes)، تنظیمات مصرف حافظه و محدودیت‌های اجرایی آشنا می‌شوند. این مفاهیم اجازه می‌دهند تا محیط اجرایی PHP کاملاً متناسب با نیازهای خاص هر پروژه شخصی‌سازی شود. علاوه بر این، آموزش php-fpm شامل نحوه ادغام این سرویس با وب‌سرورهای رایج مانند Nginx و Apache نیز می‌شود. جدول زیر برخی از تفاوت‌های کلیدی بین روش‌های اجرای PHP را نشان می‌دهد:

روش اجرا عملکرد تحت بار بالا مصرف منابع قابلیت پیکربندی سازگاری با Nginx
mod_php پایین بالا محدود خیر
CGI بسیار پایین بسیار بالا پایین بله (با overhead زیاد)
PHP-FPM بسیار بالا بهینه بسیار بالا بله (بهینه)

این جدول به‌وضوح نشان می‌دهد که چرا آموزش php-fpm به‌عنوان بهترین گزینه برای محیط‌های تولید در نظر گرفته می‌شود و چرا پاسخ به php-fpm چیست می‌تواند جهت‌گیری کلی یک پروژه را تغییر دهد.

عیب‌یابی و نگهداری در آموزش php-fpm

یکی از بخش‌های حیاتی آموزش php-fpm، یادگیری روش‌های عیب‌یابی و نگهداری سیستم است. بدون دانش کافی از ساختار داخلی PHP-FPM، شناسایی خطاها و گلوگاه‌های عملکردی می‌تواند بسیار زمان‌بر و دشوار باشد. در آموزش php-fpm، کاربران با سیستم لاگ‌نویسی پیشرفته این سرویس آشنا می‌شوند و یاد می‌گیرند چگونه از فایل‌های لاگ برای تشخیص مشکلات استفاده کنند. همچنین تنظیماتی مانند slowlog و request_terminate_timeout به‌عنوان ابزارهای کلیدی در این فرآیند معرفی می‌شوند. در این مرحله نیز، باز هم پرسش php-fpm چیست به عنوان یک چراغ راه عمل می‌کند.

امنیت و بهترین روش‌ها در آموزش php-fpm

آموزش php-fpm تنها به بهینه‌سازی عملکرد محدود نمی‌شود؛ بلکه جنبه‌های امنیتی آن نیز بسیار مهم هستند. در این بخش از آموزش php-fpm، روش‌هایی مانند جداسازی poolها برای برنامه‌های مختلف، محدود کردن دسترسی‌ها از طریق open_basedir و جلوگیری از حملات از نوع DoS مورد بررسی قرار می‌گیرند. جدول زیر برخی از تنظیمات امنیتی رایج در PHP-FPM را خلاصه می‌کند:

تنظیم امنیتی توضیح
user و group در pool اجرای فرآیندها با کاربر محدود برای کاهش خطر در صورت نفوذ
php_admin_value[open_basedir] محدود کردن دسترسی فایل‌سیستم به مسیرهای مشخص
security.limit_extensions جلوگیری از اجرای فایل‌های غیر-PHP حتی اگر از طریق وب‌سرور فراخوانی شوند
pm.max_children جلوگیری از مصرف بی‌رویه منابع و حملات مبتنی بر منابع

این تنظیمات در محیط‌های تولید نقش کلیدی در حفظ امنیت و ثبات سیستم ایفا می‌کنند و بخشی جدایی‌ناپذیر از آموزش php-fpm هستند. و همه این‌ها از درک عمیق اینکه php-fpm چیست نشأت می‌گیرد.

چرا آموزش php-fpm ضروری است؟

در نهایت، آموزش php-fpm یک سرمایه‌گذاری هوشمندانه برای هر فردی است که در حوزه توسعه وب، مدیریت سرور یا DevOps فعالیت می‌کند. این دانش نه‌تنها مهارت‌های فنی شما را ارتقا می‌دهد، بلکه امکان ارائه راه‌حل‌های مقیاس‌پذیر، امن و پایدار را فراهم می‌کند. به همین دلیل، آموزش php-fpm باید در اولویت برنامه‌های یادگیری هر توسعه‌دهنده PHP قرار گیرد. اگر قصد دارید در دنیای حرفه‌ای وب پیشرفت کنید، آموزش php-fpm را جدی بگیرید و آن را به‌عنوان یکی از ستون‌های اصلی دانش فنی خود در نظر بگیرید.

همچنین، با توجه به گسترش روزافزون استفاده از Nginx به‌عنوان وب‌سرور اصلی در سیستم‌های مدرن، آموزش php-fpm از اهمیت دوچندانی برخوردار است، چرا که Nginx به‌طور طبیعی با PHP-FPM کار می‌کند و این ترکیب، بهترین عملکرد را در برابر بارهای سنگین ارائه می‌دهد. بنابراین، آموزش php-fpm نه‌تنها یک مهارت تخصصی، بلکه یک الزام فنی در دنیای امروز محسوب می‌شود. و هر بار که به دنبال بهبود سیستم خود هستید، دوباره باید از خود بپرسید: php-fpm چیست؟ چون پاسخ آن، کلید درک عمیق‌تر از معماری سرور شماست.

تنظیمات پیشرفته و کاربردی دیگر

تنظیمات مربوط به Session

تغییر نام Session با session.name

به طور پیش‌فرض، نام کوکی‌ای که PHP برای ذخیره شناسه Session استفاده می‌کند، PHPSESSID است. این نام استاندارد می‌تواند برای مهاجمان اطلاعاتی درباره فناوری استفاده شده در سرور فراهم کند. برای افزایش امنیت، می‌توانید این نام را به چیزی کمتر قابل‌تشخیص تغییر دهید. برای مثال:

session.name = MYSESSID

با این تنظیم، نام کوکی Session به MYSESSID تغییر می‌کند. این یک اقدام امنیتی ساده است که بخشی از “امنیت از طریق پنهان‌کاری” (Security through Obscurity) محسوب می‌شود.

تنظیم مسیر ذخیره‌سازی Session با session.save_path

به طور پیش‌فرض، فایل‌های Session در یک دایرکتوری سیستمی خاص ذخیره می‌شوند. در برخی موارد، به‌ویژه در هاست‌های اشتراکی، ممکن است بخواهید مسیر ذخیره‌سازی Session را تغییر دهید. این کار می‌تواند به دلایل امنیتی (ایزوله کردن فایل‌های Session) یا عملکردی (ذخیره Session در حافظه با استفاده از memcached یا redis) انجام شود. برای تغییر مسیر ذخیره‌سازی، می‌توانید از دستورالعمل session.save_path استفاده کنید. برای مثال:

session.save_path = "/home/username/tmp/sessions"

در این مثال، فایل‌های Session در دایرکتوری /home/username/tmp/sessions ذخیره خواهند شد. مطمئن شوید که این دایرکتوری وجود دارد و کاربر وب سرور اجازه نوشتن در آن را دارد.

آموزش php.ini

آموزش php.ini

تنظیمات مربوط به تاریخ و زمان

تنظیم timezone در PHP برای ایران: راهنمای سریع و کاربردی

اگر شما یک توسعه‌دهنده PHP هستید و برنامه‌ای برای کاربران ایرانی می‌نویسید، اولین و مهم‌ترین قدم برای نمایش صحیح زمان، تنظیم timezone در PHP برای منطقه‌ی زمانی ایران است. بدون این تنظیم، توابعی مانند date() یا time() ممکن است زمان سرور (که اغلب در اروپا، آمریکا یا آسیای شرقی قرار دارد) را نمایش دهند — نه زمان محلی کاربران ایرانی شما. خوشبختانه، تنظیم timezone در PHP برای ایران بسیار ساده است و در این مقاله به‌صورت عملی و کاربردی، دقیقاً همان چیزی را که نیاز دارید توضیح می‌دهیم تا سریع‌ترین و مطمئن‌ترین راه را برای تنظیم timezone در PHP پیدا کنید.

منطقه‌ی زمانی ایران در PHP چیست؟

در PHP، منطقه‌ی زمانی ایران با نام استاندارد Asia/Tehran شناخته می‌شود. این نام بر اساس استاندارد جهانی IANA Time Zone Database است و تمام نسخه‌های مدرن PHP از آن پشتیبانی می‌کنند. بنابراین، برای تنظیم timezone در PHP به‌صورتی که زمان ایران نمایش داده شود، باید از همین مقدار استفاده کنید. هیچ‌گاه از مقادیر غیراستاندارد مانند “Iran” یا “Tehran” بدون پیشوند Asia/ استفاده نکنید، زیرا PHP آن‌ها را نمی‌شناسد و خطای Unknown or bad timezone را صادر می‌کند.

روش اول: تنظیم timezone در PHP با تابع date_default_timezone_set()

ساده‌ترین و پرکاربردترین روش برای تنظیم timezone در PHP، استفاده از تابع داخلی date_default_timezone_set() است. کافی است در ابتدای اسکریپت اصلی خود (معمولاً در فایل index.php یا فایل بوت‌استرپ پروژه) خط زیر را اضافه کنید:

date_default_timezone_set(‘Asia/Tehran’);
با این دستور، تمام توابع تاریخ و زمان PHP در آن اسکریپت — از جمله date(), time(), strtotime() و حتی کلاس‌های قدیمی‌تر — از منطقه‌ی زمانی ایران استفاده خواهند کرد. این روش به‌ویژه زمانی کاربردی است که شما کنترل کامل روی کد دارید و نمی‌خواهید به تنظیمات سرور وابسته باشید. همچنین، این روش برای هاست‌های اشتراکی که امکان دسترسی به فایل php.ini را ندارید، تنها راه عملی برای تنظیم timezone در PHP است.

روش دوم: تنظیم timezone در PHP از طریق فایل php.ini

اگر به فایل پیکربندی PHP سرور دسترسی دارید (مثلاً در سرور اختصاصی یا VPS)، می‌توانید تنظیم timezone در PHP را به‌صورت جهانی انجام دهید. برای این کار، فایل php.ini را پیدا کرده و خط زیر را در آن جستجو یا اضافه کنید:

date.timezone = “Asia/Tehran”
پس از ذخیره‌سازی فایل، حتماً سرویس وب‌سرور (مثلاً Apache یا Nginx) را ریستارت کنید تا تغییرات اعمال شوند. این روش باعث می‌شود تمام اسکریپت‌های PHP روی آن سرور به‌صورت پیش‌فرض از منطقه‌ی زمانی ایران استفاده کنند. با این حال، حتی در این حالت نیز توصیه می‌شود در کد خود نیز تنظیم timezone در PHP را با تابع date_default_timezone_set() تکرار کنید تا از مشکلات انتقال پروژه به سرورهای دیگر جلوگیری شود.

روش سوم: استفاده از کلاس DateTime برای انعطاف‌پذیری بیشتر

اگر از PHP 5.2 یا بالاتر استفاده می‌کنید (که امروزه تقریباً همه این‌طور هستند)، می‌توانید از کلاس DateTime برای مدیریت دقیق‌تر زمان استفاده کنید. این روش به‌ویژه زمانی مفید است که نیاز دارید همزمان با نمایش زمان ایران، زمان کاربران در دیگر کشورها را نیز پردازش کنید. برای مثال:

$timezone = new DateTimeZone(‘Asia/Tehran’);
$date = new DateTime(‘now’, $timezone);
echo $date->format(‘Y-m-d H:i:s’);
در این روش، شما مستقیماً برای هر شیء زمانی، منطقه‌ی زمانی ایران را تعیین می‌کنید و دیگر نیازی به تنظیم timezone در PHP به‌صورت جهانی نیست. با این حال، اگر فقط قصد نمایش زمان ایران را دارید و نیازی به پیچیدگی‌های اضافی ندارید، همچنان بهترین راه، استفاده از date_default_timezone_set(‘Asia/Tehran’) در ابتدای پروژه است.

نکات حیاتی در تنظیم timezone در PHP برای ایران

ایران از سیستم ساعت تابستانی (Daylight Saving Time) استفاده می‌کند، اما این سیستم در سال‌های اخیر به‌صورت نامنظم و گاه‌به‌گاه تغییر کرده است. خوشبختانه، PHP با استفاده از دیتابیس IANA، به‌روزرسانی‌های لازم را در نسخه‌های جدید خود اعمال می‌کند. بنابراین، همیشه سعی کنید از آخرین نسخه‌ی PHP استفاده کنید تا تنظیم timezone در PHP برای ایران به‌درستی کار کند.
اگر پس از تنظیم timezone در PHP همچنان زمان اشتباهی مشاهده می‌کنید، ابتدا مطمئن شوید که سرور سیستم‌عامل شما نیز زمان صحیح را نگه می‌دارد. گاهی اوقات اختلاف زمان ناشی از تنظیمات نادرست سیستم‌عامل است، نه PHP.
برای اطمینان از اینکه تنظیم timezone در PHP به‌درستی انجام شده، می‌توانید از تابع date_default_timezone_get() استفاده کنید:

echo date_default_timezone_get(); // باید “Asia/Tehran” را نمایش دهد

جمع‌بندی: سریع‌ترین راه برای تنظیم timezone در PHP برای ایران

اگر هدف شما فقط تنظیم timezone در PHP برای ایران است و می‌خواهید سریع‌ترین و مطمئن‌ترین راه را بروید، کافی است این خط را در ابتدای فایل اصلی پروژه‌تان قرار دهید:

date_default_timezone_set(‘Asia/Tehran’);
این یک خط ساده، تمام مشکلات مربوط به نمایش زمان اشتباه را برای کاربران ایرانی حل می‌کند. همچنین، این روش مستقل از تنظیمات سرور است و در هر هاستی کار می‌کند. بنابراین، تنظیم timezone در PHP برای ایران نه‌تنها پیچیده نیست، بلکه با یک خط کد قابل اجراست. با این حال، همیشه به‌یاد داشته باشید که تنظیم timezone در PHP بخشی جدایی‌ناپذیر از توسعه‌ی حرفه‌ای وب است و نادیده گرفتن آن می‌تواند عواقب ناخواسته‌ای در آینده داشته باشد.

تنظیمات Charset و Encoding

تنظیم default_charset برای جلوگیری از مشکلات نمایش کاراکترها

دستورالعمل default_charset کاراکتر است پیش‌فرض را برای خروجی HTML تعیین می‌کند. این تنظیم به مرورگر می‌گوید که چگونه کاراکترها را تفسیر و نمایش دهد. اگر این تنظیم انجام نشود، ممکن است با مشکلاتی مانند نمایش نادرست کاراکترهای فارسی یا سایر زبان‌های غیرانگلیسی مواجه شوید. برای جلوگیری از این مشکلات، بهتر است این تنظیم را روی UTF-8 قرار دهید که یک استاندارد جهانی برای رمزگذاری کاراکترهاست:

default_charset = "UTF-8"

با این تنظیم، PHP به طور خودکار هدر Content-Type: text/html; charset=UTF-8 را به خروجی اضافه می‌کند. این کار باعث می‌شود که تمام کاراکترها، از جمله کاراکترهای فارسی، به‌درستی در مرورگر نمایش داده شوند.

چک‌لیست نهایی پیش از انتقال وب‌سایت به محیط زنده (Production)

بررسی نهایی تنظیمات امنیتی

قبل از اینکه وب‌سایت را از محیط توسعه به محیط زنده منتقل کنید، باید یک سری تنظیمات امنیتی را به‌صورت دقیق بررسی کنید تا سایت در برابر حملات رایج مقاوم باشد. در ادامه، مهم‌ترین مواردی که باید در فایل php.ini بررسی شوند آورده شده‌اند:

تنظیم مقدار پیشنهادی توضیح
expose_php Off جلوگیری از افشای نسخه PHP در هدرها
display_errors Off عدم نمایش خطا به کاربران
log_errors On ثبت خطاها در فایل لاگ
allow_url_fopen Off جلوگیری از بارگذاری فایل‌های خارجی
allow_url_include Off جلوگیری از اجرای کد از طریق URL
disable_functions توابع خطرناک غیرفعال شوند مانند exec, system, eval
open_basedir محدود به دایرکتوری سایت جلوگیری از دسترسی به فایل‌های خارج از دایرکتوری سایت
file_uploads Off یا محدود شود در صورت عدم نیاز، غیرفعال شود
session.name نام دلخواه تغییر نام کوکی Session از PHPSESSID به نام دلخواه
session.cookie_httponly 1 جلوگیری از دسترسی JavaScript به کوکی Session
session.cookie_secure 1 ارسال کوکی فقط از طریق HTTPS
session.use_strict_mode 1 ردکردن Sessionهایی که توسط کاربر تعریف نشده‌اند

نکته: اگر از HTTPS استفاده می‌کنید، حتماً session.cookie_secure = 1 را فعال کنید تا کوکی Session فقط از طریق پروتکل امن ارسال شود.

بررسی نهایی تنظیمات عملکرد

پس از بررسی تنظیمات امنیتی، نوبت به بهینه‌سازی عملکرد می‌رسد. در ادامه، مهم‌ترین تنظیماتی که باید بررسی شوند آورده شده‌اند:

تنظیم مقدار پیشنهادی توضیح
memory_limit 256M یا 512M بسته به نوع سایت
max_execution_time 120 یا 300 بسته به نوع عملیات
max_input_time 120 یا 300 بسته به نوع عملیات
upload_max_filesize 64M یا بیشتر بسته به نیاز سایت
post_max_size بزرگ‌تر یا مساوی upload_max_filesize حتماً بررسی شود
opcache.enable 1 فعال‌سازی کش OPcache
opcache.memory_consumption 128 یا 256 بسته به حجم کدها
opcache.max_accelerated_files 10000 تعداد فایل‌های قابل کش
opcache.revalidate_freq 2 بررسی تغییرات فایل‌ها هر 2 ثانیه
opcache.validate_timestamps 1 در توسعه، 0 در production در production غیرفعال شود تا عملکرد بهتر شود

⚠️ هشدار: در محیط production، opcache.validate_timestamps = 0 را فعال کنید تا OPcache دیگر بررسی نکند که آیا فایل‌ها تغییر کرده‌اند یا نه. این کار باعث افزایش سرعت می‌شود، اما به این معناست که پس از هر تغییر در کد، باید کش OPcache را manually پاک کنید یا وب سرور را ری استارت کنید.

بررسی نهایی تنظیمات تاریخ، زمان و کاراکترها

در نهایت، باید تنظیمات مربوط به تاریخ، زمان و کاراکترها را بررسی کنید تا وب‌سایت به‌درستی کار کند:

تنظیم مقدار پیشنهادی توضیح
date.timezone Asia/Tehran یا منطقه زمانی موردنظر شما
default_charset UTF-8 جلوگیری از مشکلات نمایش کاراکترها
mbstring.func_overload 0 غیرفعال‌سازی اورلود توابع رشته‌ای

سوالات متداول

1. آیا می‌توانم چندین فایل php.ini داشته باشم؟

بله در برخی موارد می‌توانید چندین فایل php.ini داشته باشید. برای مثال، در سرورهایی که چندین نسخه PHP نصب شده‌اند (مثلاً PHP 7.4 و PHP 8.1)، هر نسخه می‌تواند فایل php.ini مخصوص خود را داشته باشد. همچنین، در برخی سرورها، می‌توانید یک فایل php.ini در دایرکتوری وب‌سایت خود قرار دهید تا تنظیمات خاصی را فقط برای آن سایت اعمال کنید. برای اطمینان، می‌توانید از تابع phpinfo() استفاده کنید تا ببینید کدام فایل php.ini در حال استفاده است.

2. تغییرات در php.ini چه زمانی اعمال می‌شود؟

تنظیمات php.ini فقط یک‌بار در زمان راه‌اندازی وب سرور بارگذاری می‌شوند؛ بنابراین، پس از هر تغییر در این فایل، باید وب سرور (Apache یا Nginx) یا PHP-FPM را ری استارت کنید. در غیر این صورت، تغییرات اعمال نخواهند شد.

3. اگر به فایل php.ini دسترسی ندارم، چه کار کنم؟

در برخی هاست‌های اشتراکی، ممکن است به فایل اصلی php.ini دسترسی نداشته باشید. در این حالت، می‌توانید از روش‌های زیر استفاده کنید:

  • فایل .htaccess: اگر PHP به‌عنوان ماژول Apache اجرا شود، می‌توانید برخی تنظیمات را در فایل .htaccess انجام دهید. برای مثال:
    php_value memory_limit 256M
    php_value upload_max_filesize 64M
    
  • فایل php.ini محلی: برخی هاست‌ها اجازه می‌دهند که یک فایل php.ini در دایرکتوری وب‌سایت قرار دهید.
  • تماس با پشتیبانی هاستینگ: اگر هیچ‌کدام از روش‌های بالا کار نکرد، می‌توانید با پشتیبانی هاستینگ تماس بگیرید و درخواست تغییر تنظیمات را بدهید.

4. آیا می‌توانم تنظیمات را در کد PHP تغییر دهم؟

بله می‌توانید از تابع ini_set() برای تغییر برخی تنظیمات در زمان اجرا استفاده کنید. برای مثال:

ini_set('memory_limit', '256M') ;
ini_set('max_execution_time', 300);

بااین‌حال، برخی تنظیمات (مانند disable_functions یا open_basedir) را نمی‌توان با ini_set() تغییر داد و باید در php.ini تنظیم شوند.

5. آیا افزایش memory_limit باعث کندی سرور می‌شود؟

افزایش memory_limit به‌تنهایی باعث کندی سرور نمی‌شود، اما اگر چندین اسکریپت به طور هم‌زمان اجرا شوند و هرکدام حافظه زیادی مصرف کنند، ممکن است منابع سرور تمام شود؛ بنابراین، همیشه یک مقدار معقول را تنظیم کنید و کد خود را بهینه کنید تا حافظه کمتری مصرف شود.

آموزش php.ini

آموزش php.ini


جمع بندی

با دنبال‌کردن این آموزش گام‌به‌گام، شما توانستید فایل php.ini را به‌صورت کامل تنظیم کنید تا هم امنیت وب‌سایت شما افزایش یابد و هم عملکرد آن بهینه شود. حالا می‌توانید با خیال راحت وب‌سایت خود را به محیط زنده منتقل کنید و از کارایی و امنیت آن لذت ببرید.

اگر سؤالی دارید یا مشکلی پیش آمد، در بخش نظرات بنویسید تا در اسرع وقت پاسخ دهم.

منابع مفید برای مطالعه بیشتر

برای امتیاز به این نوشته کلیک کنید!
[کل: 0 میانگین: 0]

دیدگاهتان را بنویسید