Mastering PHPConfig: Best Practices and Tips
What PHPConfig is
PHPConfig refers to configuration settings and files used to control PHP behavior (php.ini, .user.ini, per-directory settings, environment variables, and runtime ini_set calls). It governs error reporting, memory limits, extensions, upload sizes, session handling, and more.
Core best practices
-
Use environment-specific configs
- Development: enable full error reporting, display_errors=On, short-lived sessions, lower cache/opcache TTLs.
- Production: display_errors=Off, log_errors=On, set error_log, strict resource limits, enable opcache.
-
Keep sensitive values out of code
- Store secrets (DB credentials, API keys) in environment variables or a secrets manager; do not hardcode in php.ini or repo.
-
Manage php.ini centrally, override minimally
- Use a single canonical php.ini for the environment and apply minimal per-site overrides (.user.ini or Apache/Nginx/PHP-FPM pool configs) only when necessary.
-
Set secure defaults
- disable expose_php, enable session.cookie_httponly, set session.cookie_secure when using HTTPS, restrict session.use_strict_mode, set session.entropy_length appropriately.
-
Tune performance settings
- Configure opcache (enable, memory_size, max_accelerated_files, validate_timestamps for dev vs prod), adjust memory_limit and max_execution_time based on app needs, and set realpath_cache_size to reduce filesystem lookups.
-
Control resource limits and uploads
- Set post_max_size and upload_max_filesize to expected needs, and use max_input_time and max_input_vars to prevent abuse.
-
Enable and configure logging
- Set error_reporting to an appropriate level, log_errors=On, direct logs to a rotating system logger, and use separate logs for PHP-FPM workers if possible.
-
Secure extensions and modules
- Disable unused extensions, keep enabled extensions up to date, and review extension configs for insecure defaults.
-
Use PHP-FPM pool settings
- Configure pm.mode (static, dynamic, ondemand) and related values (pm.max_children, pm.start_servers) to match server capacity and workload patterns.
-
Automate configuration management
- Manage php.ini and related files with IaC/config management tools (Ansible, Puppet, Chef) and store environment-specific templates in version control (without secrets).
Troubleshooting tips
- Reproduce config values at runtime: use phpinfo() (development only) or run php -i / php -r ‘print_r(ini_get_all());’ for CLI.
- Confirm SAPI-specific configs: PHP-FPM, CLI, Apache module can use different ini files.
- When changes don’t apply, check for .user.ini, per-directory settings, or pool overrides; restart PHP-FPM or web server if needed.
Quick checklist to secure & optimize
- Disable: expose_php
- Enable: log_errors, session.cookie_httponly, opcache
- Set: display_errors=Off in prod, appropriate memory_limit, upload limits, opcache.memory_size
- Store secrets: environment variables or secret store
- Automate & document: version-controlled configs and deployment steps
If you want, I can generate a ready-to-use php.ini template for production or a comparison of dev vs prod settings.
Leave a Reply