我正在使用php在我的Apache服务器上执行一个文件,我尝试了各种方法,Windows批处理文件本身确实执行并返回结果。
我已将我的批处理文件简化如下
c:\code\codegen.exe "c:\47.mp3" 0 30
Codegen.exe是Echonest编译的指纹识别工具。
从Windows GUI中运行批处理文件将返回预期的结果。
当在apache中执行php时,我得到了错误。
c:\code\codegen.exe "c:\47.mp3" 0 30 [ {"error":"could not decode", "tag":0, "metadata":{"filename":"c:\\47.mp3"}} ]
返回的错误与codegen.exe无法找到文件一致,换句话说,找不到文件。在该错误消息的后半部分,codegen.exe通过斜杠转义斜杠是正常的。
我用于执行的以下php脚本
<?php
$command = 'c:\\root\\test.bat';
$input = '1';
$descriptors = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
);
$ps = proc_open($command, $descriptors, $pipes);
if(is_resource($ps)){
fwrite($pipes[0], $input);
fclose($pipes[0]);
while(!feof($pipes[1])){
echo fread($pipes[1], 4096);
}
fclose($pipes[1]);
$output = proc_close($ps);
echo $output;
if($output!=0){
trigger_error("Command returned $output", E_USER_ERROR);
}
}else{
trigger_error('Could not execute command', E_USER_ERROR);
}
?>
我也试过了。
exec($ cmd。“2&gt;&amp; 1”,$ out,$ ret);
批处理文件再次执行但是codegen.exe无法识别路径,我也尝试了具有相同结果的shell_exec。
更多..
奇怪的是,在我自己的笔记本电脑上运行Windows 8它运行正常。我没有问题,并返回预期的结果。我在相同的设置上运行相同的脚本,唯一的区别是它运行的是Windows 7而不是Windows 8.
两个apache服务器都在管理员帐户下运行。 WHOAMI = nt authority \ system
我的感觉是它的某种权限问题而不是文件路径。虽然我已经尝试了所有我能想到的东西而且我完全难过,但是我们将非常感激任何帮助。
答案 0 :(得分:0)
尝试将该文件复制到D:\somewhere\47.mp3
以检查是否存在权限问题。
答案 1 :(得分:0)
这确实是一个权限问题,我不确定问题本身,但通过向计算机添加新的管理员帐户并在该帐户的上下文下执行Windows服务找到了解决方案。
根本原因可能是Apache最初安装在普通的Windows用户帐户下。该帐户随后被提升为管理员,并非所有权限都随之而来。 (我隐约记得改变帐户。)