我使用 PHP 5.4 , IIS 7.5 。
如果执行一个简单的命令,就可以:
<?php
exec("dir", $r);
print_r($r);
?>
但是如果打开.exe文件,不起作用,页面加载直到php超时并且没有打开记事本:
<?php
exec("notepad.exe", $r);
print_r($r);
?>
如果在命令行中执行记事本的php,就可以:
php -f <file>
我认为问题出在IIS上,但我不知道是什么。谢谢!
更新
我做了另一个测试用例并且无法正常工作,页面完成加载但不删除任务:
<?php
$r = exec("SCHTASKS.exe /Delete /TN TaskTest /F");
print_r($r);
?>
IIS_IUSRS有权执行schtasks。
解
记事本无法打开,因为它是一个交互式程序。
对于Tasks调度程序,将任务文件夹(C:\ Windows \ System32 \ Tasks)的读写权限授予IUSR。
答案 0 :(得分:1)
问题在于您指示exec
收集并返回生成的进程的输出,而进程必须终止才能实现此目的。由于记事本不会立即终止PHP永远等待(您可以通过运行任何非交互式进程来测试它,例如net.exe
)。
外卖: exec
和朋友不打算启动互动流程。
在任何情况下,exec
将生成一个命令解释器,而命令解释器又会产生记事本。但是,由于最近的Windows版本中引入了安全功能,并且取决于运行IIS的用户,这些进程不会在当前桌面上创建可见窗口,因此您无需查看任何内容。您将能够使用任务管理器或其他等效程序验证它们是否已生成。
答案 1 :(得分:1)
是什么让你觉得它不起作用?
请注意,Windows服务通常无法与桌面交互,因此可能是记事本 启动的情况,而不是您可以看到它的任何地方 - 以及PHP将等待它终止,没有人能看到它终止它,它会超时,正如你所看到的那样。
可能也是这样的情况,即Web服务器正在运行的用户对记事本所在的文件夹没有执行权限(假设它具有相关路径)。