PHP fpassthru/fopen调用导致“未能打开流:HTTP请求失败!”在第一次尝试

问题描述:

我遇到了fpassthru函数的一个间歇性问题,在那里我被给出以下错误,导致我不得不退出脚本。这是我得到的错误:PHP fpassthru/fopen调用导致“未能打开流:HTTP请求失败!”在第一次尝试

警告: 的fopen(HTTP://www.devcrm.lan/rw/category/ SESSION_ID = 29cc6ecc068bcc1a3862cadb8b9d09c5 & admin_sess_id = & G_ID = W & CAT_ID = 226 & D_ID = 0 & PDID = 0 &出售= 0 &页= 0 &位置= &蛞蝓=妇女/销售/ & AJAX = 0 & view_all = 0 &所有= 0 & c_code = RW & u_region = RW & C_ID = 1 & filter_cat_id [] = & filter_size [] = & filter_colour [] = & filter_price [] = & HTTP_USER_AGENT = Mozilla%2F5.0 +%28Windows + NT + 6.1%3B + WOW64%3B + rv%3A10.0.2%29 + Gecko%2F20100101 + Firefox%2F10.0.2 & user_http_host = www.devcrm.lan & user_mobile_config = 0) [function.fopen]:无法打开流:HTTP请求失败!在 /var/www/vhosts/dev/devcrm/shop/index.php上线213

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

$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设置问题?

+1

因此,请求回到同一台服务器?可能是由需要相互排斥的会议引起的。 – diolemo 2012-03-22 16:41:44

+0

@Yotaware是,正在向发出请求的同一台服务器发出请求_from_。这是一个Apache设置? – crmpicco 2012-03-22 16:49:59

+1

你使用PHP会话吗?如果是,则无法加载同时共享同一会话的2个页面。我建议改变代码,这样你就不必有额外的请求。也许你需要另一个关于这个问题。 – diolemo 2012-03-22 16:55:42

好吧,经过至少几个星期的头部搔抓后,我发现我正在传入stream_context_create的'超时'HTTP设置导致打开失败。当我评论这一点,我不再得到未能打开流:HTTP请求失败!来自fopen的警告。

但是,我不确定为什么自升级到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,因此他们可以设置一个cookie中的一个cookie。

我最初并没有打扰到在重定向后发回cookie,因为它没有它。有一天它间歇地开始给我网关超时。根据第二个请求发回cookie解决了它。