2008-11-20 115 views
11

我想從file_get_contents從另一個文件的內容(不要問爲什麼)。 我有兩個文件:test1.php和test2.php。 Test1.php返回一個字符串,以登錄的用戶爲基礎。無法發送cookie與file_get_contents

Test2.php試圖獲取test1.php的內容並且正在被瀏覽器執行,從而得到cookie。

要使用的file_get_contents送餅乾,我創建了一個流方面:

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"))`; 

我以便在檢索內容有:

$contents = file_get_contents("http://www.domain.com/test1.php", false, $opts); 

但現在我得到的錯誤:

Warning: file_get_contents(http://www.domain.com/test1.php) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found

有人知道我在這裏做什麼嗎?

編輯: 忘了提及:沒有streaming_context,頁面剛剛加載。但沒有cookies我沒有得到我需要的信息。

+0

僅供參考如果您使用的是A2hosting,您必須請求fopen訪問權限(由於安全原因,他們默認關閉) – 2010-08-04 21:48:17

回答

24

首先,這可能只是您的問題中的一個錯字,但file_get_contents()的第三個參數需要是您的流式上下文,而不是選項數組。我跑了一個快速測試像這樣的東西,一切都按預期

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n")); 
$context = stream_context_create($opts); 
$contents = file_get_contents('http://example.com/test1.txt', false, $context); 
echo $contents; 

的錯誤指示服務器返回一個404嘗試從機器PHP抓取網址時運行你的工作站/臺式機/筆記本。這可能是因爲您的Web服務器無法訪問該站點,您的本地計算機具有緩存副本或其他網絡惡意軟件。

確保您在運行此測試時重複您的確切請求,包括您發送的cookie(命令行卷曲對此很有用)。這是完全可能的,有問題的頁面可以在沒有cookie的瀏覽器中正常加載,但是當你發送cookie時,網站實際上返回404。你認爲它的確如此。

如果您正在屏幕抓取,請下載Firefox和LiveHTTPHeaders擴展的副本。執行所有必要的步驟,以達到Firefox中所需的任何頁面。然後,使用LiveHTTPHeaders的輸出重新創建完全相同的請求請求。包括每個標頭,而不是只是餅乾。

最後,PHP Curl存在的原因。如果可能的話,(我沒有問!)用它代替。 :)

+0

使用此代碼時,我收到「HTML header fail」錯誤,所以我需要通過添加「session_write_close();」來獲得解決方案在file_get_contents之前。這是正確的方式嗎? – KinjalMistry 2016-05-11 11:37:26

0

確保服務器上存在file1.php。嘗試在您自己的瀏覽器中打開它以確保!

1

只是出於好奇,你試圖file_get_contents在其中有一個空間的網頁?我記得試圖在名稱中有一個空格的URL上使用fgc,而我的Web瀏覽器解析它就好了,fgc沒有。我最終不得不用str_replace來替換''和'%20'。

我認爲這應該是相對容易發現,但它只會報告一半的文件名。另外,我在其中一篇文章中注意到,有人在定義標題時使用了\ r \ n。請記住,PHP不喜歡這些單引號,但它們可以雙倍工作。

8

只是爲了分享這些信息。 使用session_start()時,會話文件被PHP鎖定。因此,實際的腳本是唯一可以訪問會話文件的腳本。如果您嘗試通過fsockopen()file_get_contents()訪問它,您可以等待很長時間,因爲您嘗試打開已鎖定的文件。

解決此問題的一種方法是使用session_write_close()解鎖文件並在session_start()之後重新鎖定它。

例子:

<?php 
$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n")); 
$context = stream_context_create($opts); 
session_write_close(); // unlock the file 
$contents = file_get_contents('http://120.0.0.1/controler.php?c=test_session', false, $context); 
session_start(); // Lock the file 
echo $contents; 
?> 

由於file_get_contents()是一個阻塞函數,這兩個腳本將不會在併發試圖修改會話文件。

但我確定這不是用擴展連接操縱會話的最佳方式。

BTW:它的速度更快比捲曲fsockopen()

讓你找到一個更好的我。

+3

非常感謝發佈這:)我希望我能給更多upvotes,因爲你剛剛救了我把我所有的頭髮拉出來。 – 2012-10-25 03:35:47