【问题标题】:PHP: Returning string from server to client when json_encode failsPHP:当json_encode失败时从服务器返回字符串到客户端
【发布时间】: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 你实际上 只发送纯文本-接收端接收此纯文本,然后将其解释为“特殊”的东西(即数组)......这对于您的目的可能完全没有必要(但应该完全有可能)

标签: php json


【解决方案1】:

所以在尝试了一些不同的事情之后,我尝试将 pdflatex 生成的日志文件发送到客户端。因此,不是返回文件的内容(与命令返回的内容相同),而是返回日志文件的路径。然后在我的浏览器中我使用了这段代码:

        // 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.logfile 是我的服务器中日志文件的相对路径。然后我使用以下内容将文件加载到文本区域中。

// 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";
  }
  });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-21
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    相关资源
    最近更新 更多