ZF:从一个控制器到另一个控制器的http请求挂起

时间:2012-11-08 15:33:11

标签: php http zend-framework

我有这个问题,我想从我的一个控制器执行HTTP请求到与另一个控制器链接的URL。它们完全相互独立。

当我的控制器包含以下代码时,我的应用程序会挂起,直到出现致命错误:超过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;

AFAIK这里没有循环。 如果我从ZF外面这样做,它就可以了。

3 个答案:

答案 0 :(得分:3)

您不清楚这一点,但我猜您在两个控制器中都使用会话。

会话使用锁定来防止同时运行的其他脚本破坏数据。使用会话时,对session_start()的调用会在会话文件上建立锁定,然后读取数据。在脚本结束时,将写回更改的会话数据,并释放锁定。

您无法使用当前使用当前请求运行的同一会话来访问网络服务器,因为您将以此方式陷入僵局。

但是有一条出路:session_write_close()也会写会话数据并释放锁定,但在此之后您的会话数据无法更改,除非您再次通过调用{{1}重新启动会话}}

但要小心:它会起作用,但是如果你使场景复杂化,如果你不密切注意哪个会话锁是活动的,它会让你陷入另一个死锁。通过在不创建新的http请求的情况下执行其他代码来解决此问题会更好,因为代码将在当前请求的上下文中执行,并且会话锁定无关紧要。

答案 1 :(得分:2)

我没有使用ZF的经验。但对我来说这是一个标题错配。你的网址

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

是控制器/操作请求?并且响应是json格式的?

如果是这样,你可以使用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);

答案 2 :(得分: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();