2014-03-31 6 views
-2

Здравствуйте, У меня есть устройство Ethernet, которое я могу запросить через браузер или Linux Curl без проблем, это ответ, который я получаю с завитком. Ответ представлен в простой XML-нотации. URL, чтобы получить устройство, чтобы ответить на это http://mydevice.com/state.xml?noReply=0php http GET команда не работает


[email protected]:/home/dave/www$ curl -v -0 http://mydevice.com/state.xml?noReply=0 
* About to connect() to mydevice.com port 80 (#0) 
* Trying mydevice.com... connected 
> GET /state.xml?noReply=0 HTTP/1.0 
> User-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 
> Host: mydevice.com 
> Accept: */* 
> 
<?xml version="1.0" encoding="utf-8"?> 
<datavalues> 
<relaystate>0</relaystate> 
<inputstate>0</inputstate> 
<rebootstate>0</rebootstate> 
<totalreboots>0</totalreboots> 
* Connection #0 to host mydevice.com left intact 
* Closing connection #0 

Но когда я использую этот PHP код не работает, Есть некоторые отладочная информация в этом коде. Код работает, если я укажу его на www.example.com, я исчерпал поиск Google без подсказок и т. Д. ... Я даже упростил массив PHP http, чтобы использовать только то, что использует Linux Curl, но по-прежнему нет ответа с устройства , Просьба сообщить.

--------------------- PHP код ------------

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<?php 

$xml_status = 'http://mydevice.com/state.xml?noReply=0'; 
$test1 = 'http://www.example.com/'; 

$myURL = $xml_status; 
//$myURL = $test1; 

function aa_dump($type = "NoNameGiven", $input1) 
{ 
    echo "<pre>\r\n"; 
    echo "---DEBUG-------- Printing $type ---------------\r\n"; 
    var_dump($input1); 
    echo "\r\n--------------------------\r\n"; 
} 

// this will break the URL into 
// [scheme] => http 
// [host] => www.example.com 
// [path] => /foo/bar 
// [query] => hat=bowler&accessory=cane 

$aa_arrayURL = parse_url($myURL); 
aa_dump("URL structure", $aa_arrayURL); 

$aa_host = $aa_arrayURL['host']; 
$aa_path = $aa_arrayURL['path']; 
$aa_query = $aa_arrayURL['query']; 

file_get_contents($myURL); 
aa_dump("file_get_content $myURL", $http_response_header); 

//$postdata = http_build_query(array('noReply' => '0')); 
//aa_dump('postdata', $postdata); 


$params = array('http' => array('method' => "GET", 
    'header' => array("Host: $aa_host", 
     "Content-Type: text/html", 
     "Accept: */*", 
     "Accept-Encoding: gzip, deflate", 
     "Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7", 
     "Accept-Language: en-US", 
     "Connection: close", 
     "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"), 
    'timeout' => '2', 
    'max_redirects' => '0', 
    'ignore_errors' => '1', 
    'Request_fulluri' => 'TRUE', 
    'content' => "{$aa_path}?{$aa_query}") 
); 

aa_dump('params', $params); 

// workaround for php bug where http headers don't get sent in php 5.2 
if(version_compare(PHP_VERSION, '5.3.0') == -1){ 
    ini_set('user_agent', 'PHP-SOAP/' . PHP_VERSION . "\r\n" . $params['http']['header']); 
} 

$context = stream_context_create($params); 

$homepage = file_get_contents($myURL, false, $context); 
aa_dump('homepage', $homepage); 

?> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Status</title> 
</head> 

<body> 
<hr /> 
<p>In body of HTML now</p> 
<p>Status...</p> 

<?php 
print("<p>headers_list</p>"); 
var_dump(headers_list()); 

print("<p>homepage</p>"); 
if(strlen($homepage) == 0) 
{ 
    echo '<p><font color="red">string came back empty</font></p>'; 
} 
else 
{ 
    echo '<p>string has value</p>'; 
    $xml = simplexml_load_string($homepage); 
    echo '<pre>homepage: '.$homepage.'</pre>'; 
    echo '<pre>XML 1: '.$xml.'</pre>'; 
} 

?> 
</body> 
</html> 
+0

Мне кажется, не хватало: '$ http_response_header = $ myURL = file_get_contents ($ myURL);' перед последней строкой. – Zini

+0

Извините, я новичок в PHP, вы можете объяснить, что вы имеете в виду? Я поставил свой примерный PHP-код на чтение руководств по PHP в Интернете. Где строка "$ http_response_header = $ myURL = file_get_contents ($ myURL);" идет и что он делает? – user2679455

+0

Если вы можете запросить устройство с помощью команды Linux Curl, вы сможете сделать это из PHP с помощью PHP 'curl' extension. Будут ли другие оболочки работать, зависит от вашей конфигурации PHP. Если вы не получаете ответа, возможно, PHP не делает то, что вы думаете. Посмотрите на журналы ошибок сервера. –

ответ

0

Вы можете рассмотрите возможность использования расширения cURL PHP. Это довольно распространенная плата за проезд, и это дает вам немного больше гарантий, чем обертки для хардкорных потоков.

Ссылка на страницу: https://php.net/curl

Также немного образец кода для простого GET, взятый из комментариев:

<?php 
     // create curl resource 
     $ch = curl_init(); 

     // set url 
     curl_setopt($ch, CURLOPT_URL, "example.com"); 

     //return the transfer as a string 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

     // $output contains the output string 
     $output = curl_exec($ch); 

     // Check if any error occurred 
     if(curl_errno($ch)) { 
      echo 'Curl error: ' . curl_error($ch); 
     } 

     // close curl resource to free up system resources 
     curl_close($ch);  
?> 

У вас есть шквал вариантов локон, чтобы установить заголовки, печенье и т.п. (через curl_setopt). Просто взгляните на документ, это определенно стоит вашего времени. Не нужно лететь слепым.

+0

Я попробую это сейчас, thx. – user2679455

Смежные вопросы