我已经安装了EasyPHP WAMP用于本地开发(我没有托管任何网站)。
有没有办法为单独的虚拟主机设置自定义php设置?
目前和开箱即用的php.ini
文件是从C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\binaries\php\php_runningversion\php.ini
加载的。如果我可以将自定义php.ini
文件放入虚拟主机目录覆盖原始php.ini
中的设置这样,我可以更好地模拟每个站点的生产服务器环境。
我看过这个与在线托管帐户的工作。但我无法弄清楚如何在我的机器上完成这项工作。
答案 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_value
,php_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”是域目标,它就不会做您想要的。因此,我在上面的虚拟主机块中的回答。