PHP Exec Won';不启动可执行文件
作为(源游戏引擎的专用服务器)故障排除的一部分,我决定尝试启动一些其他可执行文件(特别是Chrome和Firefox)。然而,这两项计划都没有启动。页面已加载(不像SRCDS那样挂起),但在检查Windows任务管理器时,进程从未实际启动$输出是一个长度为0的数组,$return\u var为1(没有提供实际发生错误的信息) 我使用的代码是(使用PHP Exec Won';不启动可执行文件,php,exec,executable,Php,Exec,Executable,作为(源游戏引擎的专用服务器)故障排除的一部分,我决定尝试启动一些其他可执行文件(特别是Chrome和Firefox)。然而,这两项计划都没有启动。页面已加载(不像SRCDS那样挂起),但在检查Windows任务管理器时,进程从未实际启动$输出是一个长度为0的数组,$return\u var为1(没有提供实际发生错误的信息) 我使用的代码是(使用system或passthru而不是exec时不会发生变化): 我的问题是,这有什么原因吗?我做得不对吗?看起来你是: 在窗户上 尝试异步启动外部程序
system
或passthru
而不是exec
时不会发生变化):
我的问题是,这有什么原因吗?我做得不对吗?看起来你是:
- 在窗户上
- 尝试异步启动外部程序
function async_exec_win($cmd)
{
$wshShell = new COM('WScript.Shell');
$wshShell->Run($cmd, 0, false); // NB: the second argument is meaningless
// It just has to be an int <= 10
}
需要注意的事项:您的命令必须正确转义。这两种实现都不对正在执行的命令执行任何验证,只是盲目地运行它。在不将用户输入转义到主机操作系统的情况下,决不能将用户输入传递到外部程序!用户是否您是否正在运行PHP?您是否有权运行相关程序?另外,您似乎正在尝试将输出重定向到Windows系统上的
/dev/null
,这将不起作用(请改用>nul
)将STDERR重定向到*nix和Windows上的STDOUT的正确语法是2>&1
。还要注意的是,仅仅重定向输出不足以异步启动程序,我想这是您正在尝试的。要在Windows上执行此操作,您需要可用的。@DaveRandom是的,我不太确定2/&1
是如何实现的在这里,感谢您指出。当使用`>nul`时,页面会挂起,并且永远不会加载-就像所有其他示例一样。用户PHP是在is系统下运行的,所以我假设它会运行。我将查看COM-非常感谢!非常有帮助,谢谢您。目前版本为5.3.13,因此COM默认工作-但是,在使用f下面的代码,Firefox仍然没有启动:$wshShell=new COM(“WScript.Shell”);$wshShell->Run(“Firefox.exe”,7,false);
。我也尝试过使用1和3作为WindowsStyle参数,但没有太大变化。该进程从未出现在任务管理器中。@Birjolaxew您是通过web服务器还是通过命令提示符运行它?通过WAMP 2.2,所以是web服务器。@Birjolaxew确定首先检查Apache服务运行的是哪个用户帐户和verify,它有文件系统权限来执行所讨论的文件。好吧,我刚刚意识到我有多么愚蠢-我只检查了在我的用户帐户下运行的进程,但由于Apache/PHP在系统下运行,程序将在那里运行。感谢你的帮助-我已经将它标记为接受的答案,因为它帮助了我很明显,如果不是因为你,我还得问更多愚蠢的问题。
SRCDS Output: 0
SRCDS Output2: 1
0:47:59,79
FF Output:0
FF Output2:1
Done.
function async_exec_win($cmd)
{
$wshShell = new COM('WScript.Shell');
$wshShell->Run($cmd, 0, false); // NB: the second argument is meaningless
// It just has to be an int <= 10
}
function async_exec_unix($cmd)
{
return (int) exec($cmd . ' > /dev/null 2>&1 & echo $!');
}