5

私はこの問題を抱えています。コントローラーの 1 つから、別のコントローラーにリンクされている URL に対して 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の外部から実行すると、正常に動作します。

4

3 に答える 3

3

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

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

現在のリクエストで現在実行されているのと同じセッションを再利用してWebサーバーにアクセスすることはできません。これは、その方法でデッドロックが発生するためです。

ただし、解決策がありますsession_write_close()。セッションデータを書き込み、ロックも解除しますが、この後、を呼び出してセッションを再開しない限り、セッションデータを変更することはできませんsession_start()

ただし、注意してください。これは機能しますが、シナリオを複雑にする場合、アクティブなセッションロックに細心の注意を払わないと、別のデッドロックに陥ります。コードは現在のリクエストのコンテキストで実行され、セッションロックは問題にならないため、新しいhttpリクエストを作成せずに他のコードを実行することで、この問題を解決する方がはるかに優れています。

于 2012-11-21T21:26:17.617 に答える
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();
于 2012-11-22T05:56:57.970 に答える
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);
于 2012-11-08T17:33:15.717 に答える