PHP fpassthru/fopen调用导致;无法打开流:HTTP请求失败&引用;第一次尝试

PHP fpassthru/fopen调用导致;无法打开流:HTTP请求失败&引用;第一次尝试,php,redirect,Php,Redirect,我遇到fpassthru函数的间歇性问题,出现以下错误,导致我必须退出脚本。这就是我得到的错误: 警告: 福彭(http://www.devcrm.lan/rw/category/?session_id=29cc6ecc068bcc1a3862cadb8b9d09c5&admin_sess_id=&g_id=W&cat_id=226&d_id=0&pdid=0&sale=0&page=0&position=&slug=womens/sale/&ajax=0&view_all=0&all=0&c_

我遇到fpassthru函数的间歇性问题,出现以下错误,导致我必须退出脚本。这就是我得到的错误:

警告: 福彭(http://www.devcrm.lan/rw/category/?session_id=29cc6ecc068bcc1a3862cadb8b9d09c5&admin_sess_id=&g_id=W&cat_id=226&d_id=0&pdid=0&sale=0&page=0&position=&slug=womens/sale/&ajax=0&view_all=0&all=0&c_code=RW&u_region=RW&c_id=1&filter_cat_id[]=&过滤器大小[]=&过滤器颜色[]=&过滤器价格[]=&HTTP\u USER\u AGENT=Mozilla%2F5.0+%28Windows+NT+6.1%3B+WOW64%3B+rv%3A10.0.2%29+Gecko%2F20100101+Firefox%2F10.0.2&USER\u HTTP\u host=www.devcrm.lan&USER\u mobile\u config=0) [function.fopen]:无法打开流:HTTP请求失败!在里面 /var/www/vhosts/dev/devcrm/shop/index.php,第213行

这是我使用fpassthru的代码区域。不幸的是,由于遗留代码问题,我不得不使用这个函数(无论如何,现在)。它用于在页面之间移动时发送并维护$url_参数

    $options = array(
        'http' => array(
            'max_redirects' => 5,          
            'timeout'       => 1,
        )
    );
    $context = stream_context_create($options);

    $fpthruPath = URL . "category/" . $url_parameters;

    $fp = fopen($fpthruPath, 'rb', false, $context);
    if ( false !== $fp ) {
        fpassthru($fp);
        fclose($fp);
    }
    exit();

奇怪的是,如果我将要插入fopen的URL粘贴到浏览器中,它就会工作!而且,它似乎只是在我第一次进入页面时抛出这个错误。这是Apache设置问题吗?

好的,经过至少两周的反复思考,我发现传递到
stream\u context\u create
中的“timeout”HTTP设置正在导致fopen失败。当我把这个注释掉时,我不再得到打开流失败的消息:HTTP请求失败!来自福彭的警告

但是,我不确定为什么升级到5.3.10后会出现问题,因为在使用5.1.6时,这从来都不是问题。我已经找了一些5.3性能的帖子,但是找不到太多。可以理解,我非常担心将其发布到一个实时环境中,好像5.1.6中的某些东西现在很难工作,可能是由于5.3.10中有限的超时。那么,新版本的PHP是否存在未记录的性能问题?在5.3.10上失败(间歇性)但在5.1.6上始终有效的脚本之间没有其他编码更改

我不确定是删除超时还是将其增加到5或类似的值

$options = array(
            'http' => array(
                'max_redirects' => 5          // stop after 5 redirects
                 // 'timeout'       => 1,         // timeout of 1 second
            )
        );
$context = stream_context_create($options);

$fp = fopen($fpthruPath, 'rb', false, $context);

有一次我正在打开一个到远程http服务器的连接。最终我发现在他们的服务器集群前面有一个负载平衡器。我不知道他们使用了什么,但是,在第一次请求时,它有时会重定向到完全相同的url,这样他们就可以设置一个包含serverid的cookie


在执行重定向时,我最初并不想发回cookie,因为它在没有重定向的情况下工作。有一天,它断断续续地开始给我网关超时。在第二个请求中发送cookie解决了这个问题。

那么请求将返回到同一个服务器?可能是由需要互斥的会话引起的。@Yotaware是的,请求是向请求所在的服务器发出的。这是Apache设置吗?是否使用PHP会话?如果是,则不能同时加载共享同一会话的两个页面。我建议更改代码,这样您就不必有额外的请求。也许你还需要问另一个问题。我同意最好不需要这种讨厌的解决办法。您的其他选项是不在子请求或主请求中启动会话,或创建其他非阻塞的会话处理程序。@Yotaware不,我没有使用PHP会话。这是我在代码中用于数据库目的的会话。是否有任何原因可以解释为什么只针对第一个请求而不针对任何后续请求?