我在 Windows Server 2012 R2 上使用 IIS 8.5 来托管 ASP.NET 和 PHP 应用程序。由于有几个不同的 PHP 应用程序,我想使用 open_basedir 来限制访问。问题:使用 IIS PHP 管理器,无法为每个 vHost 使用不同的 php.ini 文件。因此,我找到了一个自定义解决方案:在 PHP 管理器添加了 php 处理程序的分配后,我修改了可执行文件,如下所示:
"C:\Program Files (x86)\PHP\v5.4.26\php-cgi.exe"|-c D:\Sites\my-domain.com
这是可行的,vHost 使用 php.ini 文件 D:\Sites\my-domain.com\php.ini。但这个解决方案对我来说有点不妥。有没有更好的方法为每个 vHost 设置一个 php.ini 文件?
答案1
+1 @ahmelsayed 的回答。但是您可以使用 Appcmd 在 IIS 中轻松创建具有不同 php.ini 文件的多个 FastCGI 应用程序。但每个应用程序池只有一个处理程序/php.ini,请参阅:
设置两个 FastCGI 应用程序:
Appcmd.exe set config /section:system.webServer/fastCGI
/+"[fullPath='c:\php5\php-cgi.exe', arguments='-c c:\php5\php.site1.ini'],
maxInstances='0', idleTimeout='300', activityTimeout='70',
requestTimeout='90', instanceMaxRequests='9999',
protocol='NamedPipe', flushNamedPipe='False']" /commit:apphost
Appcmd.exe set config /section:system.webServer/fastCGI
/+"[fullPath='c:\php5\php-cgi.exe', arguments='-c c:\php5\php.site2.ini',
maxInstances='0', idleTimeout='300', activityTimeout='70',
requestTimeout='90', instanceMaxRequests='9999',
protocol='NamedPipe', flushNamedPipe='False']" /commit:apphost
然后每个网站都可以拥有自己的 .php 处理程序,指向其中一个 php.ini 文件:
AppCmd.exe set config "site1.com" /section:system.webServer/handlers
"-+[name=`'PHP`',
path=`'*.php`',
verb=`'*`',
modules=`'FastCgiModule`',
scriptProcessor=`'c:\php5\php-cgi.exe|-c c:\php5\php.site1.ini`',
resourceType=`'File`',
allowPathInfo=`'true`',
requireAccess=`'Script`']"
AppCmd.exe set config "site2.com" /section:system.webServer/handlers
"-+[name=`'PHP`',
path=`'*.php`',
verb=`'*`',
modules=`'FastCgiModule`',
scriptProcessor=`'c:\php5\php-cgi.exe|-c c:\php5\php.site2.ini`',
resourceType=`'File`',
allowPathInfo=`'true`',
requireAccess=`'Script`']"
如果您不喜欢命令行,您当然可以通过 IIS 管理器单击来操作 :) 顺便说一句,假设正确配置了应用程序池标识和 NTFS 文件权限,我相信不需要 open_basedir。
编辑:两个参考:https://www.saotn.org/php-wincache-on-iis/和https://www.saotn.org/custom-php-version-iis-express-webmatrix3/展示如何在 IIS 中添加多个 FastCGI + PHP 应用程序。