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

时间:2014-03-10 19:36:02

标签: php apache easyphp

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

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

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

我看过这个与在线托管帐户的工作。但我无法弄清楚如何在我的机器上完成这项工作。

4 个答案:

答案 0 :(得分:13)

使用自定义php.ini文件对于基于CGI / FastCGI的PHP安装来说非常简单,但是当将PHP作为Apache模块(mod_php)运行时它是不可行的,因为整个服务器运行PHP解释器的单个实例。 / p>

我的建议:

  • 从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更棘手。我通常使用<IfDefine> 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)

答案 1 :(得分:2)

使用Fast CGI为vhost使用自定义php.ini文件的简单方法是将php.ini复制到主机中的文件夹中,例如&#34; customini&#34;。

之后再转到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 :(得分:0)

有几位评论家提到Vagrant这是一个很好的解决方案。

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

  

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

     

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

     

第二种解决方法是使用PHPRC环境变量   可以使用SetEnv指令在Apache中进行配置。这个指令   允许您设置一个环境变量,然后传递给任何环境变量   在任何静态(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等特定值来尝试   loaalong,可能是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?

答案 3 :(得分:0)

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

嵌入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模块块”,例如`块。请务必记住要考虑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 one httpd.conf`结合使用,或将extra / php.conf包含所有特定于域的PHP.ini设置(也请以块的形式) 。但是,只要“ localhost”是域目标,它就不会做您想要的。因此,我在上面的虚拟主机块中的回答。