我正在编写一个应用程序,它将一些数据发送到我的服务器以生成PDF文件。为此,我使用shell_exec来调用approapiate latex compilation命令。我总是通过在服务器中使用以下代码来显示客户端的日志输出(这是过度简化以显示问题):
$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
我在浏览器中测试了它,但是我失败了。但是我绕过了这个问题。 (见我的回答)
答案 0 :(得分:0)
因此,在尝试了几个不同的事情后,我尝试将pdflatex生成的日志文件发送到客户端。因此,不是返回文件的内容(与命令返回的内容相同),而是返回日志文件的路径。然后在我的浏览器中我使用了这段代码:
.main{ width:100%;}
.sub{width:23%; position:relative; background:green; height:80px; float:left; margin:1%;}
.sub .error{position:absolute; width:100%; left:0px; top:0px; background:red; height:100px; z-index:10;}
.sub .error .close{position:absolute; right:10px; top:10px; text-align:center; font-size:11px; background:#FF0; height:20px; width:35px; cursor:pointer; content:"";}
obj.logfile是我的服务器到日志文件的相对路径。然后我使用以下内容将文件加载到文本区域。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div class="main">
<div class="sub"></div>
<div class="sub">
<div class="error">
<span class="close">close</span>
</div>
</div>
<div class="sub"></div>
<div class="sub"></div>
<div class="sub"></div>
<div class="sub"></div>
<div class="sub"></div>
<div class="sub"></div>
</div>