Как создать пользовательские файлы php.ini для каждого виртуального хоста?
Я установил EasyPHP WAMP только для локальной разработки (я не размещаю никаких веб-сайтов).
Есть ли способ установить пользовательские настройки php для отдельных виртуальных хостов?
В настоящее время и в готовом виде файл php.ini
загружается из: C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\binaries\php\php_runningversion\php.ini
Было бы неплохо, если бы, скажем, я мог бы добавить пользовательский файл php.ini
в каталог виртуального хоста, чтобы переопределить настройки в исходном php.ini
Таким образом, я мог бы лучше эмулировать среду рабочего сервера на каждом сайте основа.
Я видел, как это работает с учетными записями онлайн-хостинга. Но я не могу понять, как заставить это работать на моей машине.
4 answers
Использование пользовательских файлов php.ini
довольно прямолинейно для установок PHP на основе CGI/FastCGI, но это невозможно при запуске PHP в качестве модуля Apache (mod_php), потому что весь сервер запускает один экземпляр интерпретатора PHP.
Мой совет:
-
Установите из самого PHP столько настроек, сколько сможете:
ini_set('memory_limit', '16M'); date_default_timezone_set('Europe/Madrid') ...
Другими словами, директивы, которые могут быть изменены во время выполнения.
-
Установите остальные параметры из каждого каталога Apache файлы настроек (он же
.htaccess
):php_flag short_open_tag off php_value post_max_size 50M php_value upload_max_filesize 50M
Т.е. настройки, которые необходимо определить до запуска скрипта
Пожалуйста, ознакомьтесь с Конфигурацией среды выполнения для получения более подробной информации.
Иногда вам действительно понадобятся различные настройки при разработке и производстве. Существует бесконечное множество способов решить эту проблему с помощью PHP-кода (от создания логической константы из переменной $_SERVER['HTTP_HOST']
до простого наличия файла config.php
с разными значениями), но с .htaccess
все сложнее. Я обычно использую <IfDefine>
директива:
<IfDefine DEV-BOX>
#
# Local server directives
#
SetEnv DEVELOPMENT "1"
php_flag display_startup_errors on
php_flag display_errors on
php_flag log_errors off
#php_value error_log ...
</IfDefine>
<IfDefine !DEV-BOX>
#
# Internet server directives
#
php_flag display_startup_errors off
php_flag display_errors off
php_flag log_errors on
php_value error_log "/home/foo/log/php-error.log"
</IfDefine>
... где DEV-BOX
- строка, которую я передаю в локальную командную строку Apache:
C:\Apache24\bin\httpd.exe -D DEV-BOX
Если вы запускаете Apache как службу, бит -D DEV-BOX
можно добавить в реестр Windows, например:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Apache2.4\Parameters\ConfigArgs
По теме: Узнайте, как PHP работает на сервере (CGI ИЛИ FastCGI ИЛИ mod_php)
Простой способ использовать пользовательский файл php.ini для vhost с использованием быстрой CGI - скопировать php.ini в папку на хосте, например "customini".
После этого в директиву vhost и добавьте эту простую строку:
FcgidInitialEnv PHPRC "/path_to_your_custom_ini_dir_for_this_vhost/"
ОБЯЗАТЕЛЬНО ИМЕЙТЕ /
к вашему пути нет \
, (это не будет работать с \
)
Перезапустите Apache.
Вот и все!
Полный пример (на Windows Server здесь):
<VirtualHost *:80>
DocumentRoot "C:/APACHE/htdocs/vhost/myvhost"
ServerName www.vhost.com
FcgidInitialEnv PHPRC "C:/APACHE/customini/myvhost/"
</VirtualHost>
Несколько комментаторов упомянули Бродягу, что является отличным решением.
Если вы не заинтересованы в использовании Vagrant, вы можете изучить использование FastCGI в качестве интерфейса для Apache и воспользоваться предложением SetEnv PHPRC...
, предложенным в этом блоге :
Apache и PHP: Несколько файлов конфигурации PHP.ini (Воскресенье, февраль 8, 2009)
Источник: http://hyponiq.blogspot.com/2009/02/apache-php-multiple-phpini.html
Второй обходной путь заключается в использовании переменной среды PHPRC, настраиваемой в Apache с помощью директивы SetEnv. Эта директива позволяет задать переменную среды, которая затем передается любому Сценарий CGI и/или Серверная сторона Включают (SSI), установленные в любом статическом (x) HTML страница (или другой тип документа). В этом случае вы бы сказали каждому Экземпляр PHP-CGI, где найти его конфигурацию настройки. Примером может быть (совпадающий с предыдущим):
# vhosts.conf NameVirtualHost *:81 <VirtualHost *:81> ServerAdmin [email protected] ServerName vhost.example.com DocumentRoot "C:/path/to/doc/root" ErrorLog "logs/vhost.example.com-errors.log" # Set the PHPRC environment variable SetEnv PHPRC "C:/path/to/doc/root/php.ini" <Directory "C:/path/to/doc/root"> # ... yadda, yadda, yadda ... # you get the point! </Directory> </VirtualHost>
Однако документация PHP изменяет конфигурацию среды выполнения предполагает, что вы можете использовать определенные значения, такие как
php_value
, чтобы попробовать loaalong с помощью, возможно, директивыSetEnv
.
Он предлагает другой вариант без использования FastCGI, вместо этого используя php_value
, php_flag
и т.д. параметры конфигурации.
Другие, похоже, добились некоторого успеха в выполнении сценариев через Однако FastCGI см.: Отдельный php.ini для разных виртуальных хостов
Другие предложения включают директиву PHPINI
, которая может быть уместна для ваших нужд, см.: Как ограничить приложения PHP их собственными каталогами и их собственным php.ini?
Разработка нескольких доменов на одной машине?
Встраивание настроек php.ini в httpd-vhost.conf
, которые обычно находятся в корневом каталоге вашего сервера в разделе conf/extra/
, является отличным способом решения этой распространенной проблемы. Если бы вы никогда не знали, что сможете это сделать, посмотрите PHP.net Руководство в разделе Как Изменить Параметры Конфигурации . Это решит досадную проблему include_path
без добавления кода конфигурации в ваш загрузочный код или чего-либо еще.
Конечно, чтобы эффективно использовать это как локальный хост, вам нужно будет сделать копии блока <VirualHost>
и настроить каждый соответствующим образом. Затем закомментируйте все блоки виртуального хоста , кроме того, который вы хотите использовать!
В качестве альтернативы можно запустить Apache с опцией -f
, чтобы указать демону сервера на другой httpd.conf
при запуске. Для каждого httpd.conf
потребуется "блок модуля if", такой как "блок. Обязательно не забывайте учитывать Apache ведение журнала!
httpd -f /usr/local/apache2/conf/domains/fooDomain.conf
httpd -f /usr/local/apache2/conf/domains/barDomain.conf
Блок Виртуального Хоста С инструкциями php.ini
.
<VirtualHost 127.0.0.1:80>
UseCanonicalName On
ServerName localhost:80
ServerAdmin you@localhost
CustomLog "/var/www/someDomain.com/data/logs/httpd_access_log" common
ErrorLog "/var/www/someDomain.com/data/logs/httpd_error_log"
LogLevel warn
DocumentRoot "/var/www/someDomain.com/public"
<Directory "/var/www/someDomain.com/public">
# disable directory listing
Options -Indexes +FollowSymLinks
AllowOverride FileInfo
Require all granted
</Directory>
<IfModule alias_module>
# Alias /webpath /full/filesystem/path
ScriptAlias /cgi-bin/ "/var/www/someDomain.com/scripts/cgi-bin/"
</IfModule>
<IfModule php5_module>
# Use php7_module in opening statement above if on PHP 7+
# Domain specific PHP configuration options.
# The Apache process user must own any of the following directories.
php_admin_value include_path "/var/www/someDomain.com/application/controllers:/var/www/someDomain.com/application/models:/var/www/someDomain.com/application/views"
# Errors and Logging
php_admin_flag display_startup_errors off
php_admin_flag display_errors off
php_admin_flag html_errors off
php_admin_flag log_errors on
php_admin_value error_log "/var/www/someDomain.com/data/logs/php_error_log"
# File Related
php_admin_flag file_uploads on
php_admin_value upload_tmp_dir "/var/www/someDomain.com/data/uploads"
php_admin_value upload_max_filesize 10M
php_admin_value max_file_uploads 5
# Sessions
php_value session.save_handler "files"
php_value session.save_path "/var/www/someDomain.com/data/sessions"
# Caching
php_value soap.wsdl_cache_dir "/var/www/someDomain.com/data/cache/sopa.wsdl"
</IfModule>
</VirtualHost>
Если бы вы могли использовать переменную %{ИМЯ_СЕРВЕРА} в сочетании с <IfModule phpx_module> blocks to form a compound conditional, you could have just one
httpd.conf` или включить дополнительный/php.conf со всеми настройками PHP.ini для конкретного домена (также в блоках). Однако, пока "локальный хост" является целевым доменом, он не будет делать то, что вы хотите. Таким образом, мой ответ в блоке виртуального хоста выше.