php fork nobody,php exec函数 Unable to fork [dir] 错误解决笔记

简单来说,就是我编写了一段代码 exec('dir'),php会报错,提示 Unable to fork [dir] ,并且exec函数第三个参数返回值为-1。为了解决这个问题,我做了大量搜索,花了几乎一整的时间,尝试了网上提到的各种办法,最终问题得以解决,不过还是有很多不太清楚的地方,本文只是记录一下心得。

我的环境

Windows Server 2012 R2, IIS-8.5, PHP-5.6.28

问题查找顺序

1. 确定:检查php.ini的disable_functions是否包含了exec

2. 确定:C:\Windows\System32\ 路径被加入到环境变量中

2. IIS默认会建立一个IIS_IUSRS组,还有一个默认用户叫IUSR

3. php官网提到,exec函数会先打开cmd.exe,因此网上有帖子说需要让用户"IUSR"有执行cmd.exe的权限,我不确定是不是一定要这样做

4. C:\Windows\System32 以及 C:\Windows\SysWOW64 都有cmd.exe,还不太明白这2个的区别。

5. 貌似环境变量里有一个变量叫 ComSpec,指向了 C:\Windows\System32

6. 微软官方提供了一个工具Procmon.exe,大概可以监视一些东西。

https://docs.microsoft.com/en-us/sysinternals/

https://live.sysinternals.com/

最终监视出来的结果,貌似是php-cgi.exe创建了一个进程cmd.exe,然后执行dir命令,不过cmd.exe的完整路径为什么是 C:\Windows\SysWOW64\cmd.exe

7. IIS好像有多处地方可以修改user

1. 应用程序池(Application Pools)-> 高级设置(Advacned Settings) -> 标识(Identity)

2. 网站(Sites) -> 身份认证(Authentication) -> 匿名身份认证(Anonymous Authentication) -> 编辑(Edit)

3. 网站(Sites) -> 高级设置(Advacned Settings) -> 物理路径凭据(Physical Path Credentials)

8. 使用 get_current_user 函数可以获取到当前php到底是以哪个用户在运行

9. Windows任意文件或者目录下,查看指定用户的权限

右键 -> 属性 -> 安全 -> 高级 -> 有效访问 -> 选择用户 -> "输入用户名,点检查名称,确定" -> 查看有效访问

以上是很多人提到的有可能是权限不足造成的问题,各种测试下来,我发现并不是权限造成的,继续又查了好多资料!

10. 打开IIS首页 -> FastCGI Settings -> Edit -> Advacned Settings.Protocol由NamedPipe改为TCP,问题解决!

11. 继续查资料,为什么NamedPipe不行,其实我也不懂这玩意。大概就是fascgi和其他应用程序通信的方式,因为我在第7点处都指定了网络用户,导致了在创建pipe时(可能就是第6点提到的),权限不足引起的。

12. 最终解决方案:FastCGI Protocol继续保持NamedPipe(因为网上说windows下这种协议更快),第7点提到的3处分别为

1. 指定网络用户,不过在IIS_IUSRS组里

2. 使用应用程序池标识(Application pool identity)

3. 留空白,应用程序用户(通过身份认证)(Application user(pass-through authentication))

13. 关于NamedPipe的资料

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365600(v=vs.85).aspx

https://stackoverflow.com/questions/4098549/minimum-os-permissions-required-to-create-named-pipe-wcf

https://serverfault.com/questions/247064/permission-needed-for-named-pipes-on-windows-2008

https://stackoverflow.com/questions/21115821/what-is-fcgi-x-pipe-in-the-php-superglobal-array-and-what-is-it-used-for

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值