【发布时间】:2015-06-30 18:31:13
【问题描述】:
我正在编写一个应用程序,它将一些数据发送到我的服务器以生成 PDF 文件。为此,我使用 shell_exec 调用适当的乳胶编译命令。我总是通过在服务器中使用以下代码在客户端显示日志的输出(这过于简单化以显示问题):
$log = shell_exec("cd ../../template; pdflatex $texinput;");
$ret["log"] = $log;
echo json_encode($ret);
然而,每隔一段时间,日志就会包含一个会破坏 json_encode 的字符。那就是 json_enconde($ret) 会是假的。
有没有其他方式将信息(作为文本或文件)发送给客户端?
编辑: 由于输出是 Latex 编译的输出,因此很难简单地重现。但是,当我被要求提供一个示例时,我设法使用日志文件(由 pdflatex 命令自动保存)和这个最小的 php 脚本创建了这个最小的示例。
这是 PHP 脚本:
$trial = "trial.log";
$handle = fopen($trial,"r");
$data = fread($handle,filesize($trial));
if ($handle === false){
$errors = error_get_last();
$ret["error"] = "Could not open $trial for reading. Type: " . $errors["type"] . " MSG: " . $errors["message"];
return;
}
fclose($handle);
echo "Done reading<br>";
if (json_encode($data) === false){
echo "I've failed";
}
else{
echo "All good";
}
这是文件 trial.log
https://www.dropbox.com/s/04ejx5s1mj0ojj2/trial.log?dl=0
我已经在我的浏览器中对其进行了测试,但我发现我失败了。但是我已经绕过了这个问题。 (见我的回答)
【问题讨论】:
-
当
$textinput是; rm -rf /*时会发生什么? -
我不明白。一方面,当我从不依赖于用户的值以编程方式创建 $texinput 的值时,它永远不可能。二,这和我的问题有什么关系?
-
如果您分配了值并且它不受发送到服务器的数据的影响。
-
我从来没有遇到过
json_encode对数组进行编码失败的情况,除非它包含复杂的对象。所以我很想知道$log中究竟有什么可能导致它失败......它是巨大吗?它包含二进制数据吗? 4 字节 utf8(例如笑脸)?你能用这样的东西引发错误并发布结果if(!json_encode($ret)) file_put_contents('fail.log', var_export($log,true)); -
哦 - 我们还需要知道你是如何在客户端中回答你的问题的 - 当你
echo回复json_encode你实际上 是只发送纯文本-接收端接收此纯文本,然后将其解释为“特殊”的东西(即数组)......这对于您的目的可能完全没有必要(但应该完全有可能)