在IIS上调试PHP错误(因为它与调用com对象有关)

在IIS上调试PHP错误(因为它与调用com对象有关),php,.net,dll,iis-7,com,Php,.net,Dll,Iis 7,Com,这个问题与我写的另一个问题有关: 我在PHP中使用DOTNET()函数调用我编写的DLL 通过从命令行运行php.exe example.php(DLL仍在php文件夹中),我可以让它正常工作 我将php文件移动到同一台机器上的IIS7WebServer文件夹中(将DLL保留在同一个php文件夹中),但不断收到500个内部服务错误 我已经检查了服务器日志(在c:\inetput\logs\和c:\windows\temp\php53errors中),但似乎没有任何关于错误原因的相关信息。我甚至

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

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

通过从命令行运行
php.exe example.php
(DLL仍在php文件夹中),我可以让它正常工作

我将php文件移动到同一台机器上的IIS7WebServer文件夹中(将DLL保留在同一个php文件夹中),但不断收到500个内部服务错误

我已经检查了服务器日志(在
c:\inetput\logs\
c:\windows\temp\php53errors
中),但似乎没有任何关于错误原因的相关信息。我甚至试图更改
php.ini
设置以获得更多错误反馈,但这似乎没有帮助

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

  • 该php文件没有适当的权限(我的dll执行一些文件读取/写入)
  • php找不到DLL
  • 我得到的实际错误是:

    FastCGI进程意外退出


    你知道如何调试这个问题吗

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

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

    • IUSR\U机器
      -在IIS6和之前的版本上
    • IIS7及更高版本上的IUSR
    这些用户需要对要执行的php文件拥有权限

    在IIS7和更高版本上,我使用一个名为的命令行工具来设置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)"
    
     icacls.exe YOUR-FILE-HERE  /grant "BUILTIN\IIS_IUSRS:(RX)"
    
    您还可以向IUSR所属的组授予权限,如下所示:

     icacls.exe  YOUR-FILE-GOES-HERE  /grant "NT AUTHORITY\IUSR:(RX)"
    
     icacls.exe YOUR-FILE-HERE  /grant "BUILTIN\IIS_IUSRS:(RX)"
    
    在这两种情况下,您可能需要在设置文件级权限后停止并重新启动IIS

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

     icacls.exe YOUR-FILE-HERE  /grant "BUILTIN\IIS_IUSRS:(F)"
    
    …授予文件的全部权限

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

    当我想在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
    开关

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

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

    • IUSR\U机器
      -在IIS6和之前的版本上
    • IIS7及更高版本上的IUSR
    这些用户需要对要执行的php文件拥有权限

    在IIS7和更高版本上,我使用一个名为的命令行工具来设置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)"
    
     icacls.exe YOUR-FILE-HERE  /grant "BUILTIN\IIS_IUSRS:(RX)"
    
    您还可以向IUSR所属的组授予权限,如下所示:

     icacls.exe  YOUR-FILE-GOES-HERE  /grant "NT AUTHORITY\IUSR:(RX)"
    
     icacls.exe YOUR-FILE-HERE  /grant "BUILTIN\IIS_IUSRS:(RX)"
    
    在这两种情况下,您可能需要在设置文件级权限后停止并重新启动IIS

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

     icacls.exe YOUR-FILE-HERE  /grant "BUILTIN\IIS_IUSRS:(F)"
    
    …授予文件的全部权限

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

    当我想在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