【问题标题】:Save shell output to variable将 shell 输出保存到变量
【发布时间】:2016-06-07 17:40:00
【问题描述】:

我正在尝试使用 mogrify (GraphicsMagicks) 压缩 jpg,我需要将结果存储在变量中。

$compressed_jpg_content = shell_exec("gm mogrify -quality 85 - < ".escapeshellarg($image_path)." $filename.jpg");
    if (!$compressed_jpg_content) {
        throw new Exception("Conversion to compressed JPG failed");
    }

但是它不起作用,我得到Conversion to compressed JPG failed,我认为我的命令有问题

编辑

感谢艾伦·巴特勒

在这种情况下,$image_path 实际上是一个 POST 变量,$filenameI4tWX0HI.jpg

错误:gm mogrify: Unable to open file (I4tWX0HI.jpg)

错误非常明显,因为I4tWX0HI.jpg 尚不存在。话虽如此,我如何修改命令以使其将内容放入变量中而不是尝试打开文件

问候

【问题讨论】:

  • 您可以尝试将2&gt;&amp;1 附加到命令末尾以将标准错误转换为标准输出并回显compressed_jpg_content 以查看该错误以进行调试。试试$compressed_jpg_content = shell_exec("gm mogrify -quality 85 - &lt; .escapeshellarg($image_path)." $filename.jpg 2&gt;&amp;1"); echo $compressed_jpg_content;
  • @AllenButler 检查编辑

标签: php shell shell-exec


【解决方案1】:

根据gm mogrify手册,如果用新图像覆盖原始文件,则无法在命令行中指定目标图像。

您可以尝试以下选项之一:

1) 希望如果 mogrify 从 STDIN 准备好,它会输出到 STDOUT。不能测试所以它是客人。您会注意到在这种情况下您跳过了输出文件:

$compressed_jpg_content = shell_exec("gm mogrify -quality 85 - < ".escapeshellarg($image_path));

b) 让 mogrify 更改图像(忽略您拥有的文件名)然后读取图像数据:

$compressed_jpg_content = shell_exec("gm mogrify -quality 85 ".escapeshellarg($image_path)." && cat ".escapeshellarg($image_path));

c) 如果您不想更改原始文件,请在之前复制它:

$tmpfile = tempnam(sys_get_temp_dir(), "image_");
copy($image, $tmpfile);
shell_exec("gm mogrify -quality 85 ".escapeshellarg(tmpfile));
$compressed_jpg_content = file_get_contents($tmpfile);
unlink($tmpfile);

【讨论】:

  • 选项 b 工作正常。如果$image_path 是 BMP 并且我想将其转换为 jpg,命令将如何更改
  • 您必须使用 -format 选项设置为 jpg。 Mogrify 然后将输出到相同的文件名,其中 .bmp 文件扩展名被替换为 .jpg。
猜你喜欢
  • 2018-01-27
  • 1970-01-01
  • 2021-11-12
  • 2011-11-10
  • 2012-08-17
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2022-10-21
相关资源
最近更新 更多