【问题标题】:How do I create custom php.ini files for each virtual host?如何为每个虚拟主机创建自定义 php.ini 文件?
【发布时间】:2014-04-14 02:44:30
【问题描述】:

我安装了 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。在这些情况下,最好使用与生产服务器具有相同操作系统的 VM。为了管理这些虚拟机,Vagrant 让这一切变得非常简单。
  • 我们在谈论 PHP 作为 Apache 模块吗?还是 PHP 作为 CGI 或 FastCGI?
  • 我必须同意@Brad 的观点,即使用虚拟机模拟您的目标环境是最佳实践。但是,如果您真的想要自定义设置,请尝试使用 .htaccess。它可能需要在 Windows 机器上进行一些调整,因为通常您需要进行一些奇怪的设置才能使其正常工作(并且不要忘记在您的(默认)vhost 配置中设置:AllowOverride All)。
  • @ÁlvaroG.Vicario 我不知道该怎么说?我不认为它是 fastCGI...
  • 如何分辨? phpinfo() 是一种方式。我怀疑您将它作为 Apache 模块运行,而您根本不知道可以使用 .htaccess files

标签: php apache easyphp


【解决方案1】:

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

httpd-vhost.conf 中嵌入php.ini 设置(通常位于conf/extra/ 下的服务器根目录中)是解决此常见问题的好方法。如果你从来不知道你可以做到这一点,请参阅How To Change Configuration Settings 下的 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} 变量与 &lt;IfModule phpx_module&gt; blocks to form a compound conditional, you could have just one httpd.conf 结合使用,或者包含一个额外的/php.conf 以及所有特定于域的 PHP.ini 设置(也在块中)。但是,只要“localhost”是域目标,它就不会做你想做的事。因此,我在上面的虚拟主机块中的答案。

【讨论】:

    【解决方案2】:

    使用 Fast 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>
    

    【讨论】:

      【解决方案3】:

      对于基于 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
        

        即脚本开始运行前需要定义的设置

      请查看Runtime Configuration了解更多详情。

      有时,您实际上在开发和生产中需要不同 设置。使用 PHP 代码有无数种方法可以解决这个问题(从从 $_SERVER['HTTP_HOST'] 变量创建一个布尔常量到只拥有一个具有不同值的 config.php 文件)但使用 .htaccess 会更棘手。我通常使用&lt;IfDefine&gt; directive:

      <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
      

      相关:Find out how PHP is running on server (CGI OR fastCGI OR mod_php)

      【讨论】:

      • 谢谢!很有帮助的解释。
      【解决方案4】:

      一些评论者提到了Vagrant,这是一个很好的解决方案。

      如果您对使用 Vagrant 不感兴趣,可以使用 FastCGI 作为 Apache 的接口并使用在此 blog 上提出的 SetEnv PHPRC... 建议进行调查:

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

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

      第二种解决方法是使用 PHPRC 环境变量 在 Apache 中使用 SetEnv 指令进行配置。该指令 允许您设置一个环境变量,然后将其传递给任何 在任何静态 (x)HTML 中设置的 CGI 脚本和/或服务器端包含 (SSI) 页(或其他文档类型)。在这种情况下,你会告诉每个 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 文档changing the runtime configuration 建议您可以使用某些值,例如 php_value 来尝试 伴随着,可能是SetEnv 指令。

      他提出了另一个不使用 FastCGI 的选项,而是利用 php_valuephp_flag 等配置选项。

      不过,其他人似乎在通过 FastCGI 执行脚本方面取得了一些成功,请参阅:Separate php.ini for different virtual hosts

      其他建议涉及PHPINI 指令,这可能与您的需求相关,请参阅:How do I limit PHP apps to their own directories and their own php.ini?

      【讨论】:

      • SetEnv PHPRC 至少在 Ubuntu 上不起作用。它仍然只加载来自/etc 的那个。但是,使用PHPINIDir &lt;path-to-root&gt; 可以工作(例如PHPINIDir "/some/directory/public_html")。
      • 文档中的 cmets 说 PHPRC 还应该包含 php.ini 所在的目录,而不是配置文件的完整路径:php.net/manual/en/configuration.php
      猜你喜欢
      • 2016-06-26
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 2016-09-11
      • 2013-02-17
      • 2018-05-20
      • 1970-01-01
      • 2012-01-29
      相关资源
      最近更新 更多