2012-11-08 20 views
5

この問題を抱えています。コントローラの1つから他のコントローラにリンクされているURLへのHTTP要求を実行します。彼らはお互いに完全に独立しています。 ZF:1つのコントローラから1つのコントローラへの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

ヘッダーのエントリをもう1つ追加してください: ''接続:閉じる\ r \ n "'。 –

+0

Dosn't work申し訳ありません:( – Seba

+0

guess httpクライアントもテストしましたが、同じ結果が得られました。file_get_contentsの問題が考えられます。 – Seba

答えて

3

あなたはこれについて明確ではありませんでしたが、私はあなたが両方のコントローラでセッションを使用していると思います。

セッションでは、ロックを使用して、同時に実行されている他のスクリプトがデータを破棄しないようにします。セッションを使用する場合、session_start()への呼び出しは、セッションファイルのロックを確立し、データを読み取ります。スクリプトの最後に、変更されたセッションデータが書き戻され、ロックが解除されます。

現在のリクエストで現在実行中のセッションと同じセッションを再使用することはできません。デッドロックで終了するからです。

しかし、session_write_close()はセッションデータを書き込んでロックを解除しますが、その後はsession_start()を呼び出してセッションを再開しない限り、セッションデータを変更できません。

しかし、それはうまくいきます:シナリオを複雑にすると、セッションロックが有効であることに細心の注意を払わないと、別のデッドロックになります。新しいHTTPリクエストを作成せずに他のコードを実行することでこの問題を解決する方が良いでしょう。コードは現在のリクエストのコンテキストで実行され、セッションロックは問題にならないためです。

2

私はZFの経験がありません。しかし、それはヘッダーミスマッチです。あなたのURL

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(); 
関連する問題