Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: file_get_contents - przekierowanie
Forum PHP.pl > Forum > PHP
kubu65
Witam, posiadam taki kod (adres przykladowy):
  1. for( $x = 1; $x <= 10; $x++ ){
  2.  
  3. $dane = file_get_contents('http://www.adres.pl/'.$x.',1.html');

Więc tak, x to id produktu, a 1 (po przecinku) to id kategorii. Wchodząc na stronę zmieniając tylko id produktu strona przekierowuje na stronę z odpowiednim id kategorii. I tak wchodząc np na http://www.adres.pl/1001,1.html i kiedy produkt jest w kategorii id 5, przekierowuje na http://www.adres.pl/1001,5.html.
Oczywiście skrypt tego nie ogarnia i nie pobiera danych. Próbowałem zrobić opóznienie, aby był czas na pobranie danych, ale to z góry skazane było na niepowodzenie. Jest jakiś sposób na rozwiązanie tego problemu? Wiem że mogę przelecieć wszystko id produktów w każdej kategorii, ale wtedy z 150tys. robi się ok. 75mln zapytań.
Z góry wielkie dzięki.

EDIT:
teraz spróbowałem użyć:
  1. $url = 'http://www.adres.pl/1001,1.html';
  2. print_r(get_headers($url));

ale tylko dostałem
  1. [0] => HTTP/1.1 200 OK
  2. [1] => Date: Mon, 11 Jun 2012 01:08:51 GMT
  3. [2] => Server: Apache
  4. [3] => Set-Cookie: PHPSESSID=251867da4fa79520b6966c301daae2e6; path=/
  5. [4] => Expires: Thu, 19 Nov 1981 08:52:00 GMT
  6. [5] => Cache-Control: no-cache, must-revalidate
  7. [6] => Pragma: no-cache
  8. [7] => Vary: Accept-Encoding
  9. [8] => Content-Length: 57
  10. [9] => Connection: close
  11. [10] => Content-Type: text/html; charset=utf-8
Sephirus
Do takich rzeczy najlepiej było by użyć jednak CURL.

Dzięki niemu możesz nakazać pożądanie za przekierowaniami i w ten sposób otrzymywać ostateczną treść strony jeśli zostanie przekierowana.

Przykład:

  1. // pętla for...
  2. $ch = curl_init('http://www.adres.pl/'.$x.',1.html');
  3. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  4. curl_setopt($ch, CURLOPT_HEADER, 0);
  5. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  6. $dane = curl_exec($ch);
  7.  
  8. // przetwarzanie danych...


Jeśli nie masz dostępu do CURL lub masz włączone OPEN_BASEDIR (wówczas nie działa CURLOPT_FOLLOWLOCATION) proponuje użyć fopen lub fsocketopen i śledzić manualnie nagłówki. Czyli pobierasz strone z nagłówkami i patrzysz czy w nagłówkach nie ma "Location: jakis_adres" (preg_match) jeśli jest to robisz nowy request na ten adres i tak do skutku - jak nie ma już Location to bierzesz treść.
kubu65
Zastosowałem CURL. Kieyd jest wpisana odpowiednia kategoria to działa bez problemu, jednak w innym przypadku niestety już nie sad.gif
Wyłączyłem open_basedir, php info mam dwa razy "no value", natomiast curl:
cURL support enabled
cURL Information libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
i jeszcze w innych miejscach:
Configure Command '--without-curl'
additional .ini files parsed /etc/php.d/curl.ini

Co jeszcze może być źle, serwer zaktualizowałem, ale może trzeba coś do CURL doinstalować? Za bardzo nie wiem o co nawet pytać, ponieważ się na tym prawie nie znam.

EDIT:
Wpadłem na trochę inne rozwiązanie, ponieważ jest dużo pustych id, bo w przedziale 1-500tys. tylko 40tys. jest zajętych, postanowiłem, że pobiorę wszystkie linki do notatnika, ale nie potrafię zrobić tak prostej rzeży jak odczytywanie przez pętlę tekstu z .txt. Oczywiście każdy link będzie w osobnej lini.
johny_s
http://php.net/manual/en/function.fgets.php
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.