2012-03-22 120 views
0

我遇到了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

回答

0

好吧,經過至少幾個星期的頭部搔抓後,我發現我正在傳入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); 
0

有一次我打開了一個到遠程http服務器的連接。最終我發現他們的服務器集羣前面有一個負載平衡器。我不知道他們使用了什麼,但是,在第一次請求時,它會有時發出重定向到完全相同的URL,因此他們可以設置一個cookie中的一個cookie。

我最初並沒有打擾到在重定向後發回cookie,因爲它沒有它。有一天它間歇地開始給我網關超時。根據第二個請求發回cookie解決了它。

相關問題