Как создать пользовательские файлы 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 Таким образом, я мог бы лучше эмулировать среду рабочего сервера на каждом сайте основа.

Я видел, как это работает с учетными записями онлайн-хостинга. Но я не могу понять, как заставить это работать на моей машине.

Author: Prix, 2014-03-10

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)

 13
Author: Álvaro González, 2017-05-23 12:25:03

Простой способ использовать пользовательский файл 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>
 2
Author: Sontae, 2015-08-31 08:17:23

Несколько комментаторов упомянули Бродягу, что является отличным решением.

Если вы не заинтересованы в использовании 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?

 0
Author: Sean Quinn, 2017-05-23 11:45:58

Разработка нескольких доменов на одной машине?

Встраивание настроек 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 onehttpd.conf` или включить дополнительный/php.conf со всеми настройками PHP.ini для конкретного домена (также в блоках). Однако, пока "локальный хост" является целевым доменом, он не будет делать то, что вы хотите. Таким образом, мой ответ в блоке виртуального хоста выше.

 0
Author: Anthony Rutledge, 2018-07-19 21:10:59