将 shell 输出保存到变量

Save shell output to variable

我正在尝试使用 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 不存在 yet.That ,我如何修改命令以使其将内容放入变量而不是尝试打开文件

此致

根据gm mogrify 手册,如果用新图像覆盖原始文件,所以您不能在命令行上指定目标图像。

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

1) 希望如果从STDIN 准备好mogrify,它会输出到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);