Как создать пользовательский php.ini-файлы для каждого виртуального хоста?

Я установил EasyPHP WAMP только для локальной разработки (я не размещаю никаких веб-сайтов).

есть ли способ установить пользовательские настройки php для отдельных виртуальных хостов?

В настоящее время и из коробки,php.ini файл загружается из: C:Program Files (x86)EasyPHP-DevServer-14.1VC11binariesphpphp_runningversionphp.ini было бы неплохо, если бы, скажем, я мог бы заглянуть в custom php.ini файл в каталог виртуального хоста для переопределения параметров в исходном php.ini таким образом, я мог лучше эмулировать среду производственного сервера на на каждый участок.

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

4 ответов


С помощью настраиваемых php.ini файлы довольно прямолинейны для установок PHP на основе CGI/FastCGI, но это невозможно при запуске PHP в качестве модуля Apache (mod_php), потому что весь сервер запускает один экземпляр интерпретатора PHP.

мои советы:

  • установите из самого PHP столько настроек, сколько сможете:

    ini_set('memory_limit', '16M');
    date_default_timezone_set('Europe/Madrid')
    ...
    

    другими словами, директивы, которые могут быть изменены во время выполнения.

  • набор остальное из файлов настроек Apache для каждого каталога (aka .htaccess):

    php_flag short_open_tag off
    php_value post_max_size 50M
    php_value upload_max_filesize 50M
    

    т. е. настройки, которые должны быть определены до запуска скрипта

пожалуйста, посмотрите на Настройки Во Время Выполнения для получения дополнительной информации.

иногда вам действительно понадобится разные настройки в разработке и производстве. Есть бесконечные способы решить это с помощью PHP-кода (от создания булевой константы из the $_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 с помощью Fast 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>

несколько commentors есть упоминание залетный что является отличным решением.

если вы не заинтересованы в использовании 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 admin@example.com
  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 с, возможно,


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

встраивание php.настройки ini в httpd-vhost.conf, обычно находится в корне сервера в разделе conf/extra/, это отличный способ, чтобы решить эту общую проблему. Если бы ты никогда не знал, что сможешь это сделать, то увидел бы ... PHP.net инструкция под Как Изменить Настройки Конфигурации. Это решит надоедливый include_path проблема, без добавления кода конфигурации в код начальной загрузки или что-либо еще.

конечно, использовать это эффективно как localhost в, вам нужно будет сделать копии <VirualHost> заблокируйте и настройте каждый соответственно. Затем прокомментируйте все блоки виртуального хоста за исключением тот, который вы хотите использовать!

кроме того, можно запустить Apache с -f возможность указать демону сервера на другой httpd.conf при запуске. Каждый httpd.conf потребуется блок "if module", например " block. Обязательно не забудьте указать 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>

если вы можете использовать переменную %{SERVER_NAME} в сочетании с <IfModule phpx_module> blocks to form a compound conditional, you could have just onehttpd.conf`, или включить дополнительный / php.conf со всеми доменными PHP.настройки ini (также в блоках). Однако, пока" localhost " является целью домена, он не будет делать то, что вы хотите. Таким образом, мой ответ в блоке virtual host выше.