2014-03-31 103 views
-2

你好, 我有一個以太網設備,我可以通過瀏覽器或Linux Curl查詢沒有問題,這是我用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,我用盡了谷歌搜索沒有提示等... 我甚至簡化了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的'curl'擴展名在PHP中執行此操作。其他包裝器是否可以工作取決於你的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