从PHP在运行时不提供任何输出
我一直在努力解决从PHP在运行时不提供任何输出,php,exec,Php,Exec,我一直在努力解决exec(),试图在使用atUnix系统命令添加任务时捕获它的输出。我的问题是,当从我的脚本运行时,它没有给出任何输出,但是在交互模式下从终端和PHP运行它会打印出几行 我要执行的命令如下: echo exec("echo 'php -f /path/to/file.php foo=1' | at now + 1 minutes", $result); var\u dump()给出string(0)“,print\u r()吐出Array()。我尝试过使用shell\u exe
exec()
,试图在使用at
Unix系统命令添加任务时捕获它的输出。我的问题是,当从我的脚本运行时,它没有给出任何输出,但是在交互模式下从终端和PHP运行它会打印出几行
我要执行的命令如下:
echo exec("echo 'php -f /path/to/file.php foo=1' | at now + 1 minutes", $result);
var\u dump()
给出string(0)“
,print\u r()
吐出Array()
。我尝试过使用shell\u exec()
,它输出NULL
,但是在网页上下文中运行时,以下输出为hi
:
echo exec("echo 'hi'");
这也输出了一些东西:
echo exec("atq");
但是,只要我在上使用,就不会输出任何内容。如何获得以下各项的输出:
exec("echo 'php -f /path/to/file.php foo=1' | at now + 1 minutes", $result);
因为目前,当PHP通过Apache以“正常”方式运行时,它不会输出任何内容,但是在终端以及PHP的交互控制台中运行该命令会给我带来如下预期结果:
php > echo exec("echo 'php -f /path/to/file.php foo=1' | at now + 1 minutes", $result);
warning: commands will be executed using /bin/sh
job 1219 at Sun Jun 10 12:43:00 2012
safe_模式
已关闭,我无法理解为什么在执行atq
或任何其他命令时,使用管道输入echo语句无法从at
获得任何输出。我找了又读,都没有用
如果对exec()
使用第二个参数,如何使exec()
将at的输出返回到字符串或数组?尝试创建一个最小(非)工作示例。把所有东西都分解,一次只测试一件东西
bash中有一个错误:
hpek@melda:~/temp$ echo 'php -f /path/to/file.php foo=1' | at now + 1 minutes
at: pluralization is wrong
job 22 at Sun Jun 10 14:48:00 2012
hpek@melda:~/temp$
写minutes
而不是ogminutes
我在
处的输出通过邮件发送给我 工作,单线解决方案
我没想到会这么简单。所需的只是通过将2>&1
放在要执行的命令末尾,将stderr重新路由到stdout。现在,at
的任何输出都被打印到stdout,因此被exec()
捕获:
我的旧解决方案:
我试图保持一行/两行的解决方案,但是最后唯一有效的方法是使用proc_open()
,因为at
会记录到stderr,而exec()
不会读取我要感谢@Tourniquet指出这一点,但是他删除了他的答案。引述:
就我所见,在输出到stderr时,它不是由
执行官。我对它不是很有信心,但考虑使用
,它允许您
将stderr引至其自身的管道
这实际上是正确的做事方式。我的解决方案(因为我只想要stderr)是这样做:
// Open process to run `at` command
$process = proc_open("echo 'php -f /path/to/file.php foo=1' | at now + 1 minutes", array(2 => array("pipe", "w")), $pipes);
// Get stuff from stderr, because `at` prints out there for some odd reason
if(is_resource($process)) {
$output = stream_get_contents($pipes[2], 100);
fclose($pipes[2]);
$return_value = proc_close($process);
}
$output
现在包含打印到stderr的中的任何内容(因为它不是一个错误,所以应该真正转到stdout),并且$return\u value
在成功时包含0
。这里是一个更复杂的解决方案,具有proc\u open。我写这个答案是因为,在我的例子中,“2>&1”解决方案不起作用
function runCommand($bin, $command = '', $force = true)
{
$stream = null;
$bin .= $force ? ' 2>&1' : '';
$descriptorSpec = array
(
0 => array('pipe', 'r'),
1 => array('pipe', 'w')
);
$process = proc_open($bin, $descriptorSpec, $pipes);
if (is_resource($process))
{
fwrite($pipes[0], $command);
fclose($pipes[0]);
$stream = stream_get_contents($pipes[1]);
fclose($pipes[1]);
proc_close($process);
}
return $stream;
}
用法示例:
// getting the mime type of a supplied file
echo runCommand('file -bi ' . escapeshellarg($file));
使用命令参数的另一个示例:
// executing php code on the fly
echo runCommand('/usr/bin/php', '<?php echo "hello world!"; ?>');
我希望这有助于:-)闻起来像是seLinux或其他许可问题。即使看不到任何输出,任务也会被安排吗?是的,即使没有输出,任务也会被安排。运行sudo-atq
列出新任务。@Jack你的确切意思是什么?我的意思是echo-exec(“echo'php-f/path/to/file.php-foo=1'|现在+1分钟2>&1“,$result)代码>@Jack它工作得很好。你就不能早点把它贴出来,让我省下几个小时的挣扎吗<代码>;)代码>哦,不!很抱歉,我不得不在SO和《加勒比海盗》之间做出选择;-)谢谢你展示了这个蹩脚的例子!现在正是这样做的。邮局还是联邦快递?
// executing php code on the fly
echo runCommand('/usr/bin/php', '<?php echo "hello world!"; ?>');
// converting an mp3 to a wav file
echo runCommand('lame --decode ' . escapeshellarg($source) . ' ' . escapeshellarg($dest), '', true);