1

这个问题与我写的另一个问题有关:

从 PHP 使用 DOTNET 时遇到问题。

我在 PHP 中使用该DOTNET()函数来调用我编写的 DLL。

php.exe example.php通过从命令行 运行(DLL 仍在 PHP 文件夹中),我能够使其正常工作。

我将 php 文件移动到同一台机器上的 IIS 7 webserver 文件夹(将 DLL 留在同一个 php 文件夹中),但我不断收到500 internal service error

我检查了服务器日志(inc:\inetput\logs\和 in c:\windows\temp\php53errors),但似乎没有任何有关导致错误的信息。我什至尝试更改php.ini设置以获得更多错误反馈,但这似乎无济于事。

我只能猜测这个问题可能与:

  1. 那个 php 文件没有适当的权限(我的 dll 做了一些文件读/写)
  2. php找不到DLL

我得到的实际错误是:

FastCGI 进程意外退出。

关于如何调试这个问题的任何想法?

4

1 回答 1

1

这里的问题几乎可以肯定与文件权限有关。

从命令行运行时php.exe,您以自己的登录用户身份运行。从 IIS 运行 PHP 脚本时,为了响应 http 请求,php.exe 以不同的用户身份运行。根据您的 Windows 版本,它可能是

  • IUSR_machine- 在 IIS6 和更早版本上
  • IUSR在 IIS7 及更高版本上

这些用户需要对要执行的 php 文件的权限。

阅读更多关于它的信息

在 IIS7 及更高版本上,我使用一个命令行工具icacls.exe来设置 IIS 需要读取的目录或文件及其启动的进程(如 php.exe)的权限。这种安全性适用于所有 IIS 应用程序:PHP、ASPNET、ASP-classic、Python 等。

IIS 还需要能够读取静态文件,如 .htm、.js、.css、.jpog、.png 文件等。您可以为所有这些设置相同的权限:读取和执行。

您可以直接向用户授予权限,如下所示:

 icacls.exe  YOUR-FILE-GOES-HERE  /grant "NT AUTHORITY\IUSR:(RX)"

您还可以向 IUSR 所属的组授予权限,如下所示:

 icacls.exe YOUR-FILE-HERE  /grant "BUILTIN\IIS_IUSRS:(RX)"

无论哪种情况,您都可能需要在设置文件级权限后停止并重新启动 IIS。

如果您的 .php 脚本读取和写入其他文件或目录,则同一用户需要对这些其他文件和目录的权限。如果您需要 .php 脚本才能删除文件,那么您可能需要

 icacls.exe YOUR-FILE-HERE  /grant "BUILTIN\IIS_IUSRS:(F)"

...授予文件的全部权限。

您也可以授予对整个目录的权限,指定将来在该目录中创建的所有文件都将继承在该目录上设置的特定于文件的权限。例如,为目录设置文件权限,然后将一堆文件复制到其中,所有文件都从父级获得权限。使用 OI 和 CI 标志执行此操作(这些首字母代表“对象继承”和“容器继承”)。

 icacls.exe DIRECTORY  /grant "BUILTIN\IIS_IUSRS:(OI)(CI)(RX)"
 copy FILE1 DIRECTORY
 copy FILE2 DIRECTORY
   ...

当我想在 IIS 中创建一个新的 vdir 以允许运行 PHP 脚本、ASPX 或 .JS(是的,ASP Classic)或 Python 或其他任何东西时,我执行以下步骤:

appcmd.exe add app /site.name:"Default Web Site" /path:/vdirpath /physicalPath:c:\docroot
icacls.exe DIRECTORY  /grant "BUILTIN\IIS_IUSRS:(OI)(CI)(RX)"

然后我将文件放入目录中,它们会获得适当的权限。

在目录上设置 ACL(访问控制列表)不会更改目录中已存在文件的 ACL。如果要对目录中已有的文件设置权限,则需要对特定文件使用 icacls.exe。icacls 接受通配符,它​​还有一个/t递归开关。

于 2012-06-08T03:26:14.240 回答