我正在编写一个应用程序,它将一些数据发送到我的服务器,以便生成PDF文件。为此,我使用shell_exec调用appropiate-latex编译命令。我总是通过在服务器中使用以下代码在客户端中显示日志的输出(这太简单了,无法显示问题):
$log = shell_exec("cd ../../template; pdflatex $texinput;");
$ret["log"] = $log;
echo json_encode($ret);
然而,每隔一段时间,日志就会包含一个破坏json_encode的字符。这就是json_encode($ret)将为false。
是否有其他方式将信息(以文本或文件形式)发送给客户端?
编辑:由于输出是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
我已经在我的浏览器中测试过了,结果我失败了。然而,我绕过了这个问题。(见我的回答)
因此,在尝试了几件不同的事情之后,我继续尝试将pdflatex生成的日志文件发送到客户端。因此,y没有返回文件的内容(与命令返回的内容相同),而是返回日志文件的路径。然后在我的浏览器中,我使用了以下代码:
// Getting the base URL
var url = window.location.href;
var l = url.length;
while (l--){
if (url[l] == '/') break;
}
url = url.substring(0,l);
// Creating the URL for the log file.
var logfile = url + obj.logfile;
obj.log文件是我的服务器中日志文件的相对路径。然后我使用以下内容将文件加载到一个文本区域。
// Loading the log file.
$.ajax({
type: "GET",
url: logfile,
success: function(text) {
document.getElementById("pdflatex_out").value = text;
},
error: function() {
document.getElementById("pdflatex_out").value = "Error. please contact the administrator";
}
});