我正在编写一个通过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字符串,但这似乎也挂起了。
答案 0 :(得分:0)
使用更高级别的HTTP请求方法可能会对您有所帮助。试试这个:
$('[data-fancybox="images"]')