2012-11-08 1 views
5

Ich habe dieses Problem, ich möchte HTTP-Anfrage von einem meiner Controller zu URL führen, die mit einem anderen Controller verknüpft ist. Sie sind völlig unabhängig voneinander.ZF: HTTP-Anfrage von einem Controller zu einem anderen hängt

Wenn mein Controller enthält folgenden Code meine Anwendungen hängt, bis ich Fatal Fehler: maximale Ausführungszeit von 30 Sekunden überschritten ...

$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; 

AFAIK gibt es keine hier Schleife. Wenn ich es von außerhalb ZF mache, funktioniert es ok.

+1

Fügen Sie einen weiteren Eintrag für die Header hinzu: '" Verbindung: schließen \ r \ n "'. –

+0

Funktioniert nicht Entschuldigung :( – Seba

+0

Ich habe auch Guzzle http Client getestet und habe das gleiche Ergebnis. Dachte, dass es vielleicht ein Problem mit file_get_contents. – Seba

Antwort

3

Sie diesen nicht klar waren, aber ich denke, Sie eine Sitzung in beiden Controllern verwenden.

Sitzungen verwenden eine Sperre, um zu verhindern, dass andere Skripts gleichzeitig die Daten zerstören. Wenn eine Sitzung verwendet wird, wird durch den Aufruf von session_start() die Sperre für die Sitzungsdatei eingerichtet und anschließend werden die Daten gelesen. Am Ende des Skripts werden die geänderten Sitzungsdaten zurückgeschrieben und die Sperre wird aufgehoben.

Sie können nicht auf den Webserver zugreifen, der dieselbe Sitzung erneut verwendet, die gerade mit Ihrer aktuellen Anfrage ausgeführt wird, weil Sie auf diese Weise in einem Deadlock enden.

Es gibt jedoch einen Ausweg: session_write_close() schreibt die Sitzungsdaten und gibt auch die Sperre frei, aber danach können Ihre Sitzungsdaten nicht geändert werden, es sei denn, Sie starten die Sitzung erneut mit einem Anruf an session_start().

Seien Sie jedoch vorsichtig: Es wird funktionieren, aber wenn Sie das Szenario komplizieren, wird es Sie in einen anderen Deadlock bringen, wenn Sie nicht genau darauf achten, welche Sitzungssperre aktiv ist. Es wird viel besser sein, dieses Problem zu lösen, indem der andere Code ausgeführt wird, ohne eine neue HTTP-Anfrage zu erstellen, da der Code dann im Kontext der aktuellen Anfrage ausgeführt wird und Sitzungssperren keine Rolle spielen.

2

Ich habe keine Erfahrung mit ZF. aber für mich ist das ein Header-Missmatch. Ihre URL

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

ist eine Controller-/Aktionsanforderung? und die Antwort ist im JSON-Format?

wenn so könnte man curl verwenden:

$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

Danke, dieser Code hängt auch .. Keine Antwort für eine lange Zeit.Es scheint, gibt es einige seltsame Interaktion zwischen Zend-Controllern.Aber ehrlich kann ich mir nicht vorstellen, wie :) – Seba

2

Haben Sie versucht, Zend_Http_Client zu verwenden.

$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();