ZF:来自一个控制器的http请求挂起

Seb*_*sza 5 php zend-framework http

我有这个问题,我想从我的一个控制器执行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;
Run Code Online (Sandbox Code Playgroud)

AFAIK这里没有循环.如果我从ZF外面这样做,它可以正常工作.

Sve*_*ven 3

您对此不清楚,但我猜您在两个控制器中都使用了会话。

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

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

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

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