2012-11-08 134 views
5

我有這個問題,我想從我的一個控制器執行HTTP請求到與另一個控制器鏈接的URL。他們完全相互獨立。ZF:從一個控制器到另一個控制器的http請求

當我的控制器包含下面的代碼我的應用程序掛起,直到我得到致命錯誤:超過30秒的最長執行時間...

$opts = array(
     'http'=>array(
     'method'=>"GET", 
     'header'=>"Accept-language: en\r\n" . 
        "Cookie: DEFAULTID=rookgqj7bdi4os6f4pt5vqkk74\r\n" 
     ) 
    ); 
    $context = stream_context_create($opts); 

    $contents = file_get_contents('http://10.10.3.6/__env/Module/post-types-list/json-export', false, $context); 
    print "xxx=". $contents; 

據我所知,這裏沒有循環。 如果我從外面使用ZF,它工作正常。

+1

爲頭添加一個條目:''Connection:close \ r \ n「'。 –

+0

Dosn't工作抱歉:( – Seba

+0

我也測試了Guzzle http客戶端並得到了相同的結果。認爲這可能是它與file_get_contents的問題 – Seba

回答

3

你是不是清楚這一點,但我猜你是在兩個控制器使用會話。

會話使用鎖來防止同時運行的其他腳本破壞數據。在使用會話時,對session_start()的調用會建立會話文件上的鎖定,然後讀取數據。在腳本結尾處,寫回已更改的會話數據,並釋放鎖。

您無法訪問網絡服務器重新使用與當前請求當前正在運行的會話,因爲您將以這種方式結束死鎖。

然而,有一條出路:session_write_close()將寫入會話數據並釋放鎖定,但在此之後,您的會話數據將無法更改,除非您再次通過呼叫session_start()重新啓動會話。

但要小心:它會起作用,但如果你使情況複雜化,如果你沒有密切關注哪個會話鎖定處於活動狀態,它會讓你陷入另一個僵局。通過執行其他代碼而不創建新的http請求來解決此問題會更好,因爲代碼將在當前請求的上下文中執行,並且會話鎖定無關緊要。

2

我沒有ZF的經驗。但對我來說這是一個標題錯位。您的網址

http://10.10.3.6/__env/Module/post-types-list/json-export 

是控制器/操作請求?和響應是在JSON格式?

如果是這樣,你可以捲曲使用:

$ch = curl_init(); 

// set URL and other appropriate options 
$options = array(
    CURLOPT_URL => 'http://www.example.com/', 
    CURLOPT_HEADER => 'Accept: application/json', // this is the tricky bit 
    ... 
); 

curl_setopt_array($ch, $options); 

$data = json_decode(curl_exec($ch)); 

//you then can even debug what's wrong with. 
$curl_info = (curl_getinfo($ch)); 
var_dump($curl_info); 

// dont forget to close curl 
curl_close($ch); 
+1

謝謝,這段代碼也掛起,很長一段時間沒有反應,似乎zend控制器之間有一些奇怪的交互,坦率地說我無法想象如何:) – Seba

2

您是否嘗試過使用Zend_Http_Client

$url = 'http://10.10.3.6/__env/Module/post-types-list/json-export'; 
$client = new Zend_Http_Client(); 
$client->setUri($url); 
$client->setHeaders('Accept-language','en'); 
$client->setHeaders('Cookie','DEFAULTID=rookgqj7bdi4os6f4pt5vqkk74'); 
$client->setConfig(array('maxredirects' => 1)); 
$response = $client->request()->getBody(); 
相關問題