2012-11-08 7 views
5

Ho questo problema, voglio eseguire la richiesta HTTP da uno dei miei controller all'URL che è collegato con un altro controller. Sono completamente indipendenti l'uno dall'altro.ZF: richiesta http da un controller a un altro si blocca

Quando il mio controller contiene il codice seguente mie applicazioni si blocca fino a ottenere Fatal error: tempo massimo di esecuzione di 30 secondi superato ...

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

per quanto ne so non c'è ciclo qui. Se lo faccio da fuori ZF funziona ok.

+1

Aggiungere un'altra voce per le intestazioni: '" Connessione: chiudi \ r \ n "'. –

+0

Non funziona scusa :( – Seba

+0

Ho provato anche il client http Guzzle e ho ottenuto lo stesso risultato.Penso che forse è un problema con file_get_contents – Seba

risposta

3

Non erano chiari su questo, ma credo che si sta utilizzando una sessione in entrambi i controller.

Le sessioni utilizzano un blocco per impedire che altri script vengano eseguiti contemporaneamente dalla distruzione dei dati. Quando si utilizza una sessione, la chiamata a session_start() stabilisce il blocco sul file di sessione e quindi legge i dati. Alla fine dello script, i dati della sessione modificati vengono riscritti e il blocco viene rilasciato.

Non è possibile accedere al server Web riutilizzando la stessa sessione attualmente in esecuzione con la richiesta corrente, poiché si terminerà in un deadlock in questo modo.

C'è comunque una via d'uscita: session_write_close() scriverà i dati della sessione e rilasciare il blocco pure, ma dopo questo i dati di sessione non può essere modificato, a meno che non si riavvia di nuovo la sessione con una chiamata a session_start().

Attenzione però: funzionerà, ma se complicate lo scenario, vi porterà in un altro punto morto se non prestate molta attenzione su quale blocco di sessione è attivo. Sarà meglio risolvere questo problema eseguendo l'altro codice senza creare una nuova richiesta http, poiché il codice verrà quindi eseguito nel contesto della richiesta corrente e i blocchi di sessione non avranno importanza.

2

Non ho esperienza con ZF. ma per me è una corrispondenza perfetta per le intestazioni. il tuo URL

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

è una richiesta di controller/azione? e la risposta è in formato json?

se così si potrebbe usare curl:

$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

Grazie, anche questo codice si blocca. Nessuna risposta per molto tempo Sembra che ci sia una strana interazione tra i controller di zend.Fre francamente non riesco a immaginare come :) – Seba

2

Hai provato a utilizzare 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();