如何为每个虚拟主机创建自定义php.ini文件?


How do I create custom php.ini files for each virtual host?

我已经安装了EasyPHP WAMP仅用于本地开发(我不托管任何网站)。

是否有办法为单独的虚拟主机设置自定义php设置?

目前,php.ini文件是从:C:'Program Files (x86)'EasyPHP-DevServer-14.1VC11'binaries'php'php_runningversion'php.ini中加载的。如果我可以将自定义php.ini文件放入虚拟主机目录中以覆盖原始php.ini中的设置,那就太好了。这样,我可以更好地在每个站点的基础上模拟生产服务器的环境。

我见过在线托管帐户的这种工作。但我不知道如何在我的机器上运行。

对于基于CGI/FastCGI的PHP安装来说,使用自定义php.ini文件非常简单,但当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)

在一台机器上开发多个域?

httpd-vhost.conf中嵌入php.ini设置,通常在服务器根目录下的conf/extra/中找到,是解决这个常见问题的好方法。如果你从来不知道你可以这样做,请参阅PHP.net手册中的"如何更改配置设置"。这将解决讨厌的include_path问题,而无需在引导代码或其他任何东西中添加配置代码。

当然,为了有效地使用localhost,您需要创建<VirualHost>块的副本并相应地配置每个副本。然后,注释掉所有虚拟主机块,除了您想要使用的 !

或者,可以使用-f选项启动Apache,以便在启动时将服务器守护进程指向不同的httpd.conf。每个httpd.conf都需要一个"if模块块,"如和<IfModule phpx_module>块。一定要记得考虑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 php7_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 one httpd.conf '结合使用,或者包含一个额外的/php.conf,其中包含所有特定于域的PHP.ini设置(也以块为单位)。但是,只要"localhost";是域的目标,它不会做你想要的。于是,我的答案在虚拟主机块上面。

使用快速CGI为vhost使用自定义php.ini文件的简单方法是将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是一个很好的解决方案。

如果你对使用Vagrant不感兴趣,你可以研究使用FastCGI作为Apache的接口,并使用这个博客上提出的SetEnv PHPRC...建议:

Apache,PHP:多个PHP.ini配置文件(星期日,2009年2月8日)

来源: 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来尝试可能是SetEnv指令。

他建议不使用FastCGI,而是利用php_value, php_flag等配置选项。

其他人似乎已经通过FastCGI执行脚本取得了一些成功,参见:

其他建议包括PHPINI指令,这可能与您的需求相关,参见:如何将PHP应用程序限制在自己的目录和自己的PHP .ini中?