【问题标题】:PHP CLI errors from unix commands来自 unix 命令的 PHP CLI 错误
【发布时间】:2013-03-05 11:10:53
【问题描述】:

我正在编写 php 脚本,它将用于从“标准”站点创建站点。 unix shell命令很多,我发现了显示错误的问题。

示例:我需要检查站点文件夹是否不存在。

$ls_newsite = exec('ls /vhosts/'.$sitename, $output, $error_code);
if ($error_code == 0) {
    Shell::error('This site already exists in /vhosts/');
}
Shell::output(sprintf("%'.-37s",$sitename).'OK!');

所以,我可以处理错误,但它还是会显示出来。

php shell.php testing.com

Checking site...
ls: cannot access /vhosts/testing.com: No such file or directory
testing.com.................................OK!

如何防止显示?谢谢

【问题讨论】:

  • 正如@Colin Morelli 所说,您不需要为此使用控制台命令。 file_exists 就足够了。
  • 这只是显示问题的示例。
  • 但即便如此,您应该使用exec 命令的情况并不多。

标签: php shell unix exec command-line-interface


【解决方案1】:

您不需要这些 CLI 调用的输出,只需要错误代码。因此,将您的输出定向到/dev/null(否则PHP 将打印到stderr 的任何内容,除非您使用proc_open 并为其中的每一个创建管道——过大了)。

$ls_newsite = exec('ls /vhosts/' . $sitename . ' > /dev/null 2>&1', $output, $error_code);

这不会给你任何输出。

现在,谈谈其他一些问题:

escapeshellarg 用于传递给 shell 命令的任何内容。 编写相同代码的更好方法是:

$ls_newsite = exec(sprintf('ls %s > /dev/null 2>&1', escapeshellarg('/vhosts/' . $sitename)), $output, $error_code);

100% 确定您需要使用控制台命令。 大多数基于文件的控制台命令(statfile_existsis_dir 等)都有 PHP 等效项让您的代码更安全并且将允许它独立于平台。

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 2016-05-15
    • 2014-11-18
    • 2020-12-13
    • 2020-03-24
    • 2016-05-30
    • 2017-12-21
    • 2015-09-25
    相关资源
    最近更新 更多