我试图让 exec 在 Windows 服务器上工作并收到错误消息“无法分叉”。在谷歌上搜索了一下这个问题之后,似乎推荐的修复方法是授予 IUSR 帐户对 c:\Windows\System32\cmd.exe 的 READ 和 EXECUTE 权限。
但这一定是一个重大的安全漏洞,对吧?安全吗?是否有另一种方法来执行 [from php] 驻留在服务器上的 exe?
它需要执行 cmd.exe 因为当 Windows PHP 看到这个时:
exec("foo -bar -baz");
它称之为:
cmd /c foo -bar -baz
如果您让用户输入参数,这只是一个安全漏洞。IE,你不应该这样做:
// DO NOT DO THIS!
exec("foo -bar=" . $_GET['bar']);
相反,您应该使用escapeshellarg清理您的参数。
// This is okay. (Be sure foo.exe can handle unexpected input!)
exec("foo -bar=" . escapeshellarg($_GET['bar']));
您应该记住的一件事是,在 Windows 下创建进程会比在 Unix 类操作系统上产生更多开销。如果您有大量用户,重复调用exec()
可能会导致服务器瘫痪。如果您预计服务器上的负载会很重,您可能需要考虑让工作进程作为Windows 服务持续运行