2011-07-04 32 views
2

我試圖從使用PHP和cURL(libcurl)的機構中的數據服務獲取XML。開發工作正在我的本地機器上完成。它是在PHP中作爲Drupal和Transformations模塊的一部分評估的代碼。使用舊證書調用HTTPS頁面時發生cURL超時

它具有SSL的支持,從運行中所示:

$curl-config --features(從libcurl docs

SSL
的IPv6
libz進行
NTLM

PHP代碼是執行:

/** 
* Get a web file (HTML, XHTML, XML, image, etc.) from a URL. Return an 
* array containing the HTTP server response header fields and content. 
* FROM: http://bit.ly/lNIlOu 
*/ 
function get_web_page($url) 
{ 
    $agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30'; 
    //$agent = 'spider'; 

    $options = array(
    CURLOPT_RETURNTRANSFER => true,  // return web page if successful 
    CURLOPT_HEADER   => false, // don't return headers 
    CURLOPT_FOLLOWLOCATION => true,  // follow redirects 
    CURLOPT_ENCODING  => "",  // handle all encodings 
    CURLOPT_USERAGENT  => $agent, // who am i 
    CURLOPT_AUTOREFERER => true,  // set referer on redirect 
    CURLOPT_CONNECTTIMEOUT => 120,  // timeout on connect 
    CURLOPT_TIMEOUT  => 120,  // timeout on response 
    CURLOPT_MAXREDIRS  => 10,  // stop after 10 redirects 
    CURLOPT_SSL_VERIFYPEER => false, // Disabled SSL Cert checks 
    CURLOPT_SSL_VERIFYHOST => false, // Disable host checks ? 
); 

    $ch  = curl_init($url); 
    curl_setopt_array($ch, $options); 
    $content = curl_exec($ch); 
    $err  = curl_errno($ch); 
    $errmsg = curl_error($ch); 
    $header = curl_getinfo($ch); 
    curl_close($ch); 

    $header['errno'] = $err; 
    $header['errmsg'] = $errmsg; 
    $header['content'] = $content; 
    return $header; 
} 

$url = 'https://ws.admin.washington.edu/student/v4/public/section.xml?year=2011&quarter=autumn&curriculum_abbreviation=BIOL&course_number=&id=&search_by=Instructor'; 
$result = get_web_page($url); 

echo '<pre>CURL result:<br/>'; 
var_dump($result); 
echo '</pre>'; 

傾銷$ CH的削減版本:

array(24) { 
    ["url"]=> 
    string(155) "https://ws.admin.washington.edu/student/v4/public/section.xml?year=2011&quarter=autumn&curriculum_abbreviation=BIOL&course_number=&id=&search_by=Instructor" 
    ["content_type"]=> 
    NULL 
    ["http_code"]=> 
    int(0) 
    ["header_size"]=> 
    int(0) 
    ["request_size"]=> 
    int(237) 
    ... 
    ["ssl_verify_result"]=> 
    int(20) 
    ["redirect_count"]=> 
    int(0) 
    ["total_time"]=> 
    float(120.41427) 
    ... 
    ["connect_time"]=> 
    float(0.11626) 
    ... 
    ["certinfo"]=> 
    array(0) { 
    } 
    ["errno"]=> 
    int(28) 
    ["errmsg"]=> 
    string(67) "Operation timed out after 120000 milliseconds with 0 bytes received" 
    ["content"]=> 
    bool(false) 
} 

當我訪問自己的網站它只是負載。我甚至將代理簽名設置爲與我自己完全相同。

任何幫助,將不勝感激。

+1

這很奇怪,它不適合你。我複製了上面的代碼,並通過命令行(在Mac上)運行它,並且它像魅力一樣工作。嘗試添加'curl_setopt($ ch,CURLOPT_VERBOSE,1);'並查看附加信息是否有幫助。 –

+0

感謝您的嘗試。我使用它作爲Drupal模塊的一部分,這可能是原因,模塊或Drupal中的某些內容可能已經改變了cURL設置,但是因爲我正在創建自己的實例,所以我不明白。將這個添加到我的帖子中,並嘗試添加你給我的東西。 – JeroenEijkhof

+0

實際上,簡單地在Drupal外面運行它就會出現同樣的問題。現在我不知道。 – JeroenEijkhof

回答

0

現在,當我將其上傳到我的服務器時,它就可以正常工作。我試圖從我的Mac OSX 10.6.7這似乎阻止通常用於HTTPS協議的端口443。我找不到打開它的方法或找出它被阻止的原因。

但我的腳本正常工作以外我的本地機器

感謝您的幫助。

1

對我而言加入curl_setopt($ch, CURLOPT_SSLVERSION, 3);神奇地解決了這個問題!

+0

這是在媽媽是一個非常普遍的問題,默認的SSL版本設置爲2,但是openssl模塊不支持它,我遇到了同樣的問題並且搜索了很多東西來找到解決方案。 – Stony

相關問題