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

14

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

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

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

我见过在在线托管帐户上实现这一点。但我无法弄清楚如何在我的计算机上使其工作。


老实说,我发现模拟生产环境最好的方法是使用 Vagrant。你可能不会在生产中使用 EasyPHP WAMP,对吧?或者 Windows 也一样。在这些情况下,最好使用与生产服务器相同的操作系统的虚拟机。为了管理这些虚拟机,Vagrant 让这非常容易。 - Brad
我必须同意@Brad的观点,使用虚拟机来模拟目标环境是最佳实践。但是,如果您真的想要自定义设置,请尝试使用.htaccess文件。在Windows系统中,它可能需要进行一些微调,因为通常需要进行一些奇怪的设置才能使其正常工作(并且不要忘记在您的(默认)虚拟主机配置中设置:AllowOverride All)。 - Raphioly-San
@ÁlvaroG.Vicario 我不确定该怎么说?我不认为它是fastCGI... - Joao
2
如何判断呢?phpinfo()是其中一种方式。我怀疑您正在以Apache模块的形式运行它,并且您可能不知道可以使用.htaccess文件 - Álvaro González
谢谢,我不知道那个!如果你想把它变成答案,我会标记为已接受。 - Joao
显示剩余2条评论
4个回答

15

对于基于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 作为服务运行,则可以在 Windows 注册表中添加 -D DEV-BOX 选项,例如:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Apache2.4\Parameters\ConfigArgs

相关: 查找PHP在服务器上是如何运行的(CGI、fastCGI或mod_php)


谢谢!非常有帮助的解释。 - Joao

5

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

将php.ini设置嵌入到httpd-vhost.conf中,通常可在服务器根目录下的conf/extra/找到,这是解决这个常见问题的好方法。如果你之前不知道可以这么做,请参考PHP.net手册下的如何更改配置设置。这将解决令人烦恼的include_path问题,而无需向启动代码或其他任何地方添加配置代码。

当然,要将其有效地用作localhost,您需要复制一个<VirualHost>块,并对每个进行配置。然后,注释掉除您想使用的虚拟主机块以外的所有虚拟主机块!

或者,您可以使用-f选项启动Apache,以便在启动时将服务器守护程序指向不同的httpd.conf。每个httpd.conf都需要一个“if module块”,例如<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} 变量和 块来形成复合条件,就可以只有一个 httpd.conf 文件,或者包含一个 extra/php.conf,其中包含所有特定于域名的 PHP.ini 设置(也是以块的形式)。但是,只要 "localhost" 是域名目标,它就无法实现你想要的效果。因此,在上面的虚拟主机块中,我给出了答案。

3

使用Fast CGI来为虚拟主机使用自定义php.ini文件的简单方法是将php.ini复制到主机中的一个文件夹中,例如“customini”。

之后,添加以下简单行到您的虚拟主机指令中:

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>

1

有几位评论者提到了Vagrant,这是一个非常好的解决方案。

如果您不想使用Vagrant,您可以尝试使用FastCGI作为Apache的接口,并使用在此博客中提出的SetEnv PHPRC...建议:

Apache & PHP: Multiple PHP.ini Configuration Files (Sunday, February 8, 2009)

Source: http://hyponiq.blogspot.com/2009/02/apache-php-multiple-phpini.html

The second work-around is to use the PHPRC environment variable configurable in Apache using the SetEnv directive. This directive allows you to set an environment variable that is then passed to any CGI script and/or Server Side Include (SSI) set in any static (x)HTML page (or other document type). In this instance, you'd be telling each PHP-CGI instance where to find its configuration settings. The example would be (coinciding with the previous one):

# 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>

However, the PHP documentation changing the runtime configuration suggests that you can use certain values like php_value to try loaalong with, possibly the SetEnv directive.

他建议另一种选项,不使用FastCGI,而是利用php_valuephp_flag等配置选项。
其他人似乎已经成功地通过FastCGI执行脚本,参见:为不同的虚拟主机分别设置php.ini文件
其他建议涉及PHPINI指令,这可能与您的需求相关,请参见:如何将PHP应用程序限制在它们自己的目录和自己的php.ini中?

1
“SetEnv PHPRC” 在 Ubuntu 上无效。它仍然只从“/etc”中加载。但是,使用“PHPINIDir <path-to-root>”可以解决问题(例如,“PHPINIDir“/some/directory/public_html””)。 - Hibou57
文档中的注释说,PHPRC还应包含php.ini所在的目录,而不是配置文件的完整路径:http://php.net/manual/en/configuration.php - Juha Palomäki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接