5

我有这个问题,我想从我的一个控制器向与另一个控制器链接的 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;

AFAIK 这里没有循环。如果我从 ZF 外部进行操作,则可以。

4

3 回答 3

3

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

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

您无法重新使用与当前请求一起运行的同一会话来访问网络服务器,因为那样您将陷入死锁。

然而,有一个出路:session_write_close()将写入会话数据并释放锁定,但在此之后您的会话数据无法更改,除非您再次调用session_start().

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

于 2012-11-21T21:26:17.617 回答
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);
于 2012-11-08T17:33:15.717 回答
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 回答