经过一番努力,我发现了一些无法解释/解决的行为,所以在此寻求帮助。在我们的服务器上(Ubuntu 16.04.5 LTS with PHP 7.0.30),我们使用一些位于 'httpdocs' 之外的工具,这些工具使用
但是由于某些原因,在这个过程中丢失了一个字节?我已经尝试了一些其他解决方案,使用
到目前为止,
我为什么会丢失一个字节?将 $output 数组转换回字符串的正确方法是什么?是否有一种方法通过将数组合并来获得 240 字节的输出?或者是否有其他函数可以执行命令,同时给出输出和 return_var?
exec()
调用以获取它们的输出。在这种情况下,它是一个 QRCode 生成器。
然而,其中一些 QR 码将不会被显示。我们从工具中得到了一个输出(输出 PNG 数据),但当我们将其显示为图像时,由于某种原因它似乎已经损坏了。
经过大量调试,我发现结果有时与工具的输出相差 1 或 2 个字节。
我最后使用下面的 QR 码进行了调试(12345),它是一个 240 字节的文件。然而,当最终输出它时,长度似乎只有 239 字节,所以我们在某个地方丢失了一个字节?
我发现使用exec()
,我们正在创建一个输出数组。尾部空格(例如 \n)不包括在此数组中,因此可以使用implode()将数组粘合回字符串,如下所示:<?php
$cmd = 'cat qr.png';
$output = array();
$exit_code = 0;
exec($cmd, $output, $exit_code);
if($exit_code === 0)
{
header ("Content-type: image/png;");
print implode(PHP_EOL, $output);
}
die();
但是由于某些原因,在这个过程中丢失了一个字节?我已经尝试了一些其他解决方案,使用
shell_exec()
(但是这里没有return_var,所以我们无法检查验证过程...)<?php
$command = 'cat qr.png';
$output = shell_exec($command);
if($output !== null)
{
header ("Content-type: image/png;");
print $output;
}
die();
...并使用passthru()
(但这会直接输出内容,这不是所需的。像下面示例中的输出缓冲区在实际代码中不可行...)
<?php
$command = 'cat qr.png';
$return_var = 0;
ob_start();
passthru($command, $return_var);
if($return_var === 0)
{
header ("Content-type: image/png;");
$output = ob_get_clean();
print $output;
}
die();
到目前为止,
exec()
函数一直对我们非常有效,可以得到 $return_var 和 $output,但现在我正在失去字节。我已经尝试了一些 PHP_EOL 的变体,我们现在使用它们作为粘合剂(\n,\r 和 \n\r),但是对于前两个行结束符,我仍然只得到了 239 个字节,而对于最后一个行结束符,我最终得到了 241 个字节,因此多了 1 个字节。我为什么会丢失一个字节?将 $output 数组转换回字符串的正确方法是什么?是否有一种方法通过将数组合并来获得 240 字节的输出?或者是否有其他函数可以执行命令,同时给出输出和 return_var?
cat qr.png
,但在最终解决方案中,它类似于/usr/local/bin/tools/generate-qr --input="12345"
,因此readfile无法使用。编码相同,但我在某个地方缺少一个换行符。当对比文件时,在工作文件(第3行)中看到了一个倒置的问号,但在损坏的输出中却没有。当使用PHP的ord()函数将倒置的问号粘贴到字符串中时,它告诉我它的值为13(回车?)...所以我从exec()中缺少一个换行符,但如何正确地获取它呢? - BazardshoxerContent-type: image / png;
后,您如何将命令行输出发送到客户端?您的工具是否会生成QR码作为类似于▄█▄这样的符号文本输出,并将其保存为图像二进制文件到文件系统中? - Accountant م