【问题标题】:Redirection in PHP exec call creates empty filePHP exec 调用中的重定向创建空文件
【发布时间】:2013-04-18 08:22:40
【问题描述】:

这很简单,我没有想法。我确信有一个快速的解决方法。

exec('echo 123 &> /var/log/123.log');

我确定这与权限无关,因为文件 123.log 已创建,但它只是空的。我也尝试过 shell_exec,但它根本不创建文件。 还尝试了所有重定向变体,即1> 2> >

使用 PHP 捕获输出不是选项,因为生产中的输出很大,我不想遇到内存问题。

任何想法表示赞赏。

顺便说一句,我使用的是 Ubuntu 12.04 LAMP。

【问题讨论】:

  • 您是否在终端中尝试过echo 123 &> /var/log/123.log
  • 您是否 100% 肯定它没有权限?尝试在终端中手动执行 echo 语句,看看它是否有效
  • 已验证,这对我也不起作用。将 PHP 5.3.10-1ubuntu3.4 与 Suhosin-Patch 一起使用。
  • 文件已创建。怎么可能是权限?一定是关于重定向是如何完成的。
  • 我在echo 123 2>&1 1>> /var/log/123.log 上取得了一些进展,但现在只捕获了stdoutstderr 不是。

标签: php shell io-redirection


【解决方案1】:

Debian 和基于 Debian 的 Linux 发行版(如 Ubuntu)现在使用 dash 而不是 bash 作为 /bin/sh。

&> 是 bash 扩展,破折号不知道。

cmd &> file的正确的posix兼容方式是cmd > file 2>&1

cmd > file 2>&1 适用于所有与 posix 兼容的 shell:dash、bash、ksh、zsh、ash ...

因此您需要将代码更改为:

exec('echo 123 > /var/log/123.log 2>&1');

【讨论】:

  • 一切正常。只是exec('echo 123 > ./123.log &'); 也很好
  • @AlexandrKapustin:不,那只会在后台运行echo 123 > ./123.log
  • 一年多后我又回到了这个 :) 是的,我确认这适用于默认 php (7.0.30) 的 ubuntu 16.04。
  • @ling:该示例会将 stdout 和 stderr 中的所有行写入日志文件,exec() 函数将返回一个空字符串。也许你的情况有些不同。我建议你问一个关于你正在执行的确切命令的新问题。
【解决方案2】:

试试不带 & 的 shell_exec:

echo shell_exec("echo 123 > /var/log/123.log");

【讨论】:

    【解决方案3】:

    唯一有用的是创建一个具有 exec 权限的 shell 脚本,例如test.sh:

    #!/bin/bash
    echo 123 &>> /var/log/123.log
    

    并像这样执行它:

    shell_exec('[full path to]/test.sh');
    

    所以,重定向操作符并不重要,其他都是(#! 指令,shell_exec)。

    【讨论】:

    • 原因是 cli 重定向是由 shell 处理的,只有这样我们才能确定执行了 bash。我不确定 exec 如何解释命令。
    • 为了完整性:另一种确保使用 bash 的方法是 shell_exec('/bin/bash -c \'echo 123 &> /var/log/123.log\'')。但我承认这很丑。
    • 谢谢@SamuelKirschner 我不接受我自己的回答的原因是它可以说至少和你评论中的那个一样丑……很高兴接受符合posix的那个。直到今天我才有时间验证它:)
    猜你喜欢
    • 1970-01-01
    • 2019-03-19
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多