PHP:当json_encode失败时,从服务器向客户端返回字符串


PHP: Returning string from server to client when json_encode fails

我正在编写一个应用程序,它将一些数据发送到我的服务器,以便生成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";
  }
  });