当服务器没有指定文件结尾时,请阅读XML响应的末尾?

时间:2018-04-06 01:37:35

标签: php xml sockets

我正在编写一个通过XML与服务器通信的脚本。我可以告诉我向服务器API发出成功的请求,因为我可以在服务器的日志中看到它正在接收它们,但是我很难收到响应(XML)。我不拥有服务器,遗憾的是无法修改任何发送响应的程序。

我不认为服务器正在指定文件的结尾,因此执行while (!feof($fp)) { ... }会挂起。不幸的是,在我阅读之前,我认为我没有任何方式(据我所知)确定答案的大小。

我正在做什么以及我尝试过什么:

function postXMLSocket ($server, $path, $port, $xmlDocument) {
  $contentLength = strlen($xmlDocument);
  $result = '';
  // Handling error case in else statement below
  if ($fp = @fsockopen($server, $port, $errno, $errstr, 30)) {
    $out =  "POST / HTTP/1.0\r\n";
    $out .= "Host: ".$server."\r\n";
    $out .= "Content-Type: text/xml\r\n";
    $out .= "Content-Length: ".$contentLength."\r\n";
    $out .= "Connection: close\r\n";
    $out .= "\r\n"; // all headers sent
    $out .= $xmlDocument;
    fwrite($fp, $out);

    // ATTEMPT 5: Read until we have a valid XML doc -- hangs
    // libxml_use_internal_errors(true);

    // do {
    //   $result .= fgets($fp, 128);
    //   $xmlTest = simplexml_load_string($result);
    // } while ($xmlTest === false);

    // ATTEMPT 4: Read X # of lines -- works but I can't know how many lines response will be
    // for ($i = 0; $i < 10; $i++) {
    //   $result .= fgets($fp, 128);
    // }

    // ATTEMPT 3: Read until the lines being read are empty -- hangs
    // do {
    //   $lineRead = fgets($fp, 500);
    //   $result .= $lineRead;
    // } while (strlen($lineRead) > 0);

    // ATTEMPT 2: Read the whole file w/ fread -- only reads part of file
    // $result = fread($fp, 8192);

    // ATTEMPT 1: Read to the EOF -- hangs
    // while (!feof($fp)) {
    //   $result .= fgets($fp, 128);
    // }

    fclose($fp);
  }
  else {
    // Could not connect to socket
    return false;
  }
  return $result;
}

尝试说明:

1)首先,我尝试读取行,直到到达文件末尾。这种情况一直持续下去并导致超时,我认为这是因为服务器没有标记它所响应的XML文件的结尾,所以它被抓住了无限循环。

2)其次我尝试将响应读作一个完整的文件。这有效,我得到了回报,但它不完整(似乎响应非常大)。虽然这有效,但在阅读之前我无法知道回复的大小,所以我不认为这是一种选择。

3)接下来我尝试阅读,直到fgets返回一个空字符串。我假设如果它在传递文件末尾之后读取行会这样做,但这也会挂起。

4)对于这次尝试,我只是尝试读取一个硬编码的行数(在这种情况下为10),但这与上面的尝试2有类似的问题,我无法准确知道响应将有多少行直到读完之后。

5)这是我认为我变得聪明的地方。我知道响应将是XML,并将包含在<Response>节点中。因此,我认为我可以放弃阅读,直到$result变量包含有效的XML字符串,但这似乎也挂起了。

1 个答案:

答案 0 :(得分:0)

使用更高级别的HTTP请求方法可能会对您有所帮助。试试这个:

$('[data-fancybox="images"]')