Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从PHP在运行时不提供任何输出_Php_Exec - Fatal编程技术网

从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
而不是og
minutes

我在
处的
输出通过邮件发送给我

工作,单线解决方案 我没想到会这么简单。所需的只是通过将
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);