Проблема извлечения XML ответа после отправки XML через PHP curl - PullRequest
0 голосов
/ 30 апреля 2020

У меня проблемы с моим следующим кодом:

<?php
$url = "192.168.0.1:10040";

$xml = '<root><list><MatrixConnectionList><DviConsole type="name">Monitor X</DviConsole></MatrixConnectionList></list></root>';

$headers = array(
    "Content-type: text/xml",
    "Content-length: " . strlen($xml),
    "Connection: close",
);


//Execute the curl init
$ch = curl_init();

//Add URL to Curl
curl_setopt($ch, CURLOPT_URL, $url);

//Return response
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//set timeout
curl_setopt($ch, CURLOPT_TIMEOUT, 5);

//Add post option to curl
curl_setopt($ch, CURLOPT_POST, true);

//Add curel post field
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

//Add headers
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

//Add verbose for error logging
curl_setopt($ch, CURLOPT_VERBOSE, true);

//Execute Curl
$data = curl_exec($ch);

//Print response
error_log(print_r($xml, TRUE));
error_log(print_r($data, TRUE));

//Log errors and close curl
if(curl_errno($ch))
    print curl_error($ch);
else
    curl_close($ch);
?>

Ответ должен быть примерно таким:

<?xml version="1.0" encoding="utf-8"?><root><result type="list"><MatrixConnectionList><item><cpuId>0x0000</cpuId><cpuCl>DviCpu</cpuCl><cpuName>MISC</cpuName><cpuPoweredOn>true</cpuPoweredOn><signalType>viewonly</signalType><consoleId>0x000000</consoleId><consoleCl>DviConsole</consoleCl><consoleName>Monitor X</consoleName><connectionOwnerId>0x00000000</connectionOwnerId><connectionOwnerCl>DviMatrix</connectionOwnerCl><connectionOwnerPort>2</connectionOwnerPort><connectionOwnerName>Matrix X</connectionOwnerName><consoleConfigEnable>1</consoleConfigEnable><consolePoweredOn>true</consolePoweredOn><userName>0000000</userName><transmission>2</transmission></item></MatrixConnectionList></result></root>

За исключением случаев, когда я проверяю свой Apache журнал ошибок I см. следующее:

* upload completely sent off: 118 out of 118 bytes
* Operation timed out after 5001 milliseconds with 1456 out of -1 bytes received
[Thu Apr 30 10:48:05.967278 2020] [php7:notice] [pid 20251] [client 192.168.0.2:6000] , referer: http://192.168.0.1/pages/test.php

Я что-то здесь упускаю? Почему curl_exe c не присваивает возвращаемую строку моей переменной.

Спасибо!

1 Ответ

0 голосов
/ 30 апреля 2020

сервер, на который вы попали, не отправляет заголовок Content-Length (либо не отправляет его вообще, либо отправляет искаженный, я не уверен, вы можете проверить подробный журнал, чтобы узнать), который заставляет curl просто продолжать чтение, пока удаленный сервер не закроет сокет, и сервер использовал более 5 секунд для закрытия сокета, и 5 секунд, по-видимому, являются значением по умолчанию CURLOPT_TIMEOUT, поэтому вы получили ошибку тайм-аута ... и когда вы получите ошибку с CURLOPT_RETURNTRANSFER curl_exe c () не возвращает строку ответа, но возвращает bool (false), чтобы указать, что произошла ошибка.

вы можете попытаться увеличить CURLOPT_TIMEOUT, чтобы посмотреть, закроет ли сервер в конце концов сокет ,

// timeout at 10 seconds instead of 5, server reponds slowly sometimes..
curl_setopt($ch,CURLOPT_TIMEOUT,10);

или вы можете удалить

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

и добавить

$response="";
curl_setopt($ch,CURLOPT_WRITEFUNCTION,function($ch,string $data)use(&$response):int{
    $response.=$data;
    return strlen($data);
});
$error_if_false=curl_exec($ch);
if(false===$error_if_false){
     // error, but your response is now in $response regardless.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...