我已经安装了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
问题,而无需在引导代码或其他任何东西中添加配置代码。
<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中?