来自PHP exec的taskkill

来自PHP exec的taskkill,php,windows,exec,taskkill,Php,Windows,Exec,Taskkill,我刚刚尝试执行以下操作: function kill_hr(){ exec("taskkill /IM uper.exe", $output = array(), $return); print_r($output); echo "<br />".$return; } 函数kill_hr(){ exec(“taskkill/IM uper.exe”,$output=array(),$return); 打印(输出); 回显“”$return; } 但

我刚刚尝试执行以下操作:

function kill_hr(){

    exec("taskkill /IM uper.exe", $output = array(), $return);

    print_r($output);

    echo "<br />".$return;

}
函数kill_hr(){
exec(“taskkill/IM uper.exe”,$output=array(),$return);
打印(输出);
回显“
”$return; }
但是,输出是这样的,并且不是很有用:

数组()1

当流程不存在时,它将执行以下操作:

数组()128


我正在试图弄清楚为什么进程存在时它会给我一个1-这是权限问题吗?如果是这样的话,我如何纠正这个问题?

程序返回的值是
$return
值。在Windows中,返回值0和1通常用于表示成功,因此您可以很容易地判断终止何时成功

但是,返回值128是任意的,这意味着
taskkill
的程序开发人员自己决定。128可能意味着该进程不存在

遗憾的是,似乎没有任何文档记录
taskkill
的返回值

如果您的目标是阻止出现
uper.exe
,那么返回值128和1都是可以接受的,并且您的代码变成:

function kill_hr()
{
    exec("taskkill /IM uper.exe", $output = array(), $return);
    return $return == 1 || $return == 128;
}
如果
uper.exe
被成功终止,或者如果它一开始没有运行,该函数将返回
true

编辑:重新阅读您的帖子,您可以尝试以下方法:;使用
runas
以web服务器用户身份启动命令提示符(从管理命令提示符):


然后,您将有一个命令提示符作为web服务器运行,您可以从那里发出
taskkill
命令。然后,您可能会看到一条文本错误消息。

我以前遇到过这个问题-一些过去有效的方法:

解决方案#1

使用Windows
start
命令启动
taskkill

exec('start/B taskkill/IM notepad.exe',$output=array(),$return)

解决方案#2

使用
cmd.exe
打开新命令行:

exec('cmd/c taskkill/IM notepad.exe',$output=array(),$return)


**注*:我在过去使用这两种方法从PHP启动后台进程-我不确定返回值是什么,所以您需要进行实验

除了其他答案外,命令返回的数值在Windows中称为ERRORLEVEL。在命令行上使用taskkill时,可以使用

echo %ERRORLEVEL%

感谢大家的帮助-我终于用以下方法结束了流程:

$output = shell_exec('taskkill /F /IM "uper.exe"');

我相信它也能与exec一起工作,但重要的是
/F
强制执行它!:)

我想我没有很好地解释我的问题!:)问题是taskkill没有成功,因为它没有返回0,并且我可以在任务列表中看到uper.exe没有被杀死-我的问题是为什么它没有被杀死,以及我如何做到这一点?尝试以web服务器用户的身份启动命令提示符(找出Apache或IIS运行的用户),然后从那里运行
taskkill
命令。这可能会在命令行上给您一条错误消息。感谢您的回复和有用的建议:我尝试了这两种方法,cmd解决方案给了我与以前相同的结果。但从一开始,它就取得了成功——我很兴奋,但我看到它并没有扼杀整个过程,但仍然取得了成功——发生了什么?我怎样才能让它杀人!!使用
start
时,所发生的情况是从
start
命令而不是从
taskkill
返回值
start
成功,但您不知道
taskkill
是否成功。不要使用“”标记,这在Win7 x64中不起作用。没有它,它工作得很好,谢谢!
$output = shell_exec('taskkill /F /IM "uper.exe"');