2008-11-20 28 views
11

Próbuję pobrać zawartość z innego pliku z file_get_contents (nie pytaj dlaczego). Mam dwa pliki: test1.php i test2.php. Test1.php zwraca ciąg, w oparciu o zalogowanego użytkownika.Nie można wysyłać plików cookie z file_get_contents

Test2.php próbuje pobrać zawartość test1.php i jest wykonywany przez przeglądarkę, tym samym pobierając pliki cookie.

Aby wysłać pliki cookie z file_get_contents, tworzę kontekst Streaming:

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

mam retreiving zawartość z:

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

Ale teraz pojawia się błąd:

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

Czy ktoś wie, co tu robię?

edycja: zapomniałem wspomnieć: bez stream_context, strona po prostu ładuje. Ale bez ciasteczek nie otrzymam potrzebnych informacji.

+0

FYI- jeśli korzystasz z A2hosting, musisz poprosić o przyznanie dostępu fopen (domyślnie zostały one wyłączone ze względów bezpieczeństwa) –

Odpowiedz

24

Po pierwsze, jest to prawdopodobnie tylko literówka w pytaniu, ale trzecim argumentem dla file_get_contents() musi być kontekst przesyłania strumieniowego, a nie szereg opcji. Pobiegłem szybki test z czymś takim, i wszystko działało zgodnie z oczekiwaniami

$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; 

Błąd wskazuje, że serwer jest zwrócenie 404. Spróbuj pobierania URL z PHP maszyna pracuje na i nie z twoja stacja robocza/komputer/laptop. Możliwe, że twój serwer sieciowy ma problemy z dotarciem do witryny, Twój komputer lokalny ma kopię z pamięci podręcznej lub inne pomyłki sieciowe.

Pamiętaj, aby powtórzyć dokładnie tę prośbę, wykonując ten test, łącznie z plikiem cookie, który wysyłasz (dobry efekt ma to w przypadku linii poleceń). Jest całkiem możliwe, że strona, o której mowa, może ładować dobrze w przeglądarce bez pliku cookie, ale kiedy wyślesz ciasteczko, witryna faktycznie zwraca 404.

Upewnij się, że $ _SERVER ['HTTP_COOKIE'] ma nieprzetworzony plik cookie myślisz, że tak.

W przypadku skrobania ekranu pobierz Firefox i kopię rozszerzenia LiveHTTPHeaders. Wykonaj wszystkie niezbędne czynności, aby przejść do dowolnej strony w Firefoksie. Następnie, korzystając z danych wyjściowych z LiveHTTPHeaders, odtwórz dokładnie to samo żądanie. Uwzględnij wszystkie nagłówki, tylko te pliki cookie, a nie ani.

Wreszcie, PHP Curl istnieje z jakiegoś powodu. Jeśli to w ogóle możliwe, (nie pytam!) Użyj zamiast tego. :)

+0

Podczas korzystania z tego kodu otrzymuję komunikat o błędzie "Błąd nagłówka HTML", więc potrzebuję aby uzyskać rozwiązanie, dodając "session_write_close();" przed file_get_contents. Czy to właściwy sposób? – KinjalMistry

0

Upewnij się, że plik1.php istnieje na serwerze. Spróbuj otworzyć ją we własnej przeglądarce, aby się upewnić!

1

Po prostu z ciekawości, czy próbujesz file_get_contents na stronie, która ma w sobie miejsce? Pamiętam, jak próbowałem użyć fgc na adresie URL, który miał spację w nazwie i podczas gdy moja przeglądarka internetowa parsowała to dobrze, fgc nie. Skończyło się na tym, że musiałem użyć str_replace, aby zastąpić "" z "% 20".

Sądzę, że powinno to być względnie łatwe do zauważenia, mimo że raportowałby tylko połowę nazwy pliku. Zauważyłem też, że w jednym z tych wpisów ktoś użył \ r \ n podczas definiowania nagłówków. Należy pamiętać, że PHP nie lubi tych pojedynczych cudzysłowów, ale działają dobrze w podwójnym.

8

Aby udostępnić te informacje. Podczas korzystania z pliku session_start() plik sesji jest blokowany przez PHP. W związku z tym rzeczywisty skrypt jest jedynym skryptem, który może uzyskać dostęp do pliku sesji. Jeśli spróbujesz uzyskać do niego dostęp za pomocą fsockopen() lub file_get_contents(), możesz odczekać zbyt długo, zanim spróbujesz otworzyć plik, który został zablokowany.

Jednym ze sposobów rozwiązania tego problemu jest użycie session_write_close(), aby odblokować plik i ponownie go zarchiwizować za pomocą session_start().

Przykład:

<?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; 
?> 

Od file_get_contents() jest funkcją blokowania, zarówno skrypt nie będzie w współbieżności podczas próby modyfikacji pliku sesji.

Ale jestem pewien, że to nie jest najlepszy sposób na manipulowanie sesją przy rozszerzonym połączeniu.

Btw: to szybciej niż cURL i fsockopen()

Daj mi znać, jeśli znajdziesz coś lepszego.

+3

Bardzo dziękuję za opublikowanie tego :) Żałuję, że nie mogłem dać więcej przegranych, ponieważ właśnie uratowałeś mnie przed wyciągnięciem wszystkich moich włosów. –

+1

Dzięki, to przyjemność podzielić się;) – Kursion

Powiązane problemy