Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Skrypt zżerający ogromne ilości transferu
Forum PHP.pl > Forum > Przedszkole
smietek
Witam.
Mam pewien skrypt, który łączy się 50 razy z pewną stronką przez różne serwery proxy zapisane w pliku przez cUrla.
Na początku wszystko było dobrze, do póki było to rozłożone na dwie części, bo gdy było złączone nie wyświetlało strony. Wtedy skrypt nie zżerał mi tak dużo transferu.
Jednak postanowiłem nieco ulepszyć go, by użytkownicy strony mogli widzieć rezultat skryptu bez konieczności czekania na ostanie połączenie - dlatego użyłem sesji do przechowywania wyników i za każdym połączeniem odświeżałem stronę. Jednak okazało się, że skrypt w jeden dzień zużył mi ok. 1,5 GB transferu (użytkowników mam prawie 3 tysiące, aktywnych więcej niż 3/4).

I teraz moje pytanie: co spowodowało tak wielki wzrost transferu? To, że co połączenie ładuję stronę (wtedy można by to rozwiązać za pomocą iframe) czy to, że przechowuje duże ilości danych w sesji (chociaż to jest po stronie użytkownika)?

Od razu mówię, że pliki graficzne wczytywane do wyglądu strony już zostały skompresowane do jak najmniejszego rozmiaru bez straty jakości.
_Martin_
Hej

Tak sobie myślę czy zapytania do bazy jakieś masz?
Odczyt zapis, odczyt, zapis! to może dużo pociągnąć!
smietek
Nie, żadnych zapisów ani odczytów do bazy danych nie mam. Jedyne co ładuje z zewnętrznego pliku to listę proxy przez file() (wygodnie się potem przegląda jako tablicę).

Ogóle gdy napisałem ten skrypt od nowa pod sesje, przybyło mi:
  1. wczytywanie i zapisywanie w sesji
  2. funkcja serialize() i unserialize()
  3. przekierowanie przez meta http-equiv="refresh"
  4. unset() danych z sesji
  5. odświeżanie strony co jedno załadowane proxy (czyli 50-55 odświeżeń)
Odświeżam temat. Czy ktoś może mi pomóc? Coś zaproponować?
Wicepsik
Zapewne chodzi Ci o grę menelgame.

Teraz zobacz.

3 tys użytkowników * 50 stron * 10kb jedna = 1,500,000 kb transferu
A 1,5gb to jest ok. 1,572,864 kb

Więc marne szanse masz na zmniejszenie transferu.
smietek
Czyli jedynym rozwiązaniem na zminimalizowanie zużycia jest ramka, w której będę ładował cały skrypt i wyświetlał sam wynik. Btw: do transferu liczy się rozmiar pliku .php czy zwrócony kod HTML?

Ktoś może mi odpowiedzieć?
wookieb
Warto zastosować nagłowki Expires i polecam dodatek do firefoxa o nazwie yslow. Powie ci jak odciążyć serwer od transferu.
zegarek84
Cytat(smietek @ 30.06.2009, 10:49:37 ) *
Btw: do transferu liczy się rozmiar pliku .php czy zwrócony kod HTML?

Ktoś może mi odpowiedzieć?

zwrócony kod html - ale ten kod też możesz skompresować przez gzip - pozatym umiejętnie nadając nagłówki w php mozna określić czy plik został zmodyfikowany czy nie i czy ma zostać pobrany czy nie - tu polecam zainteresować się ETag...

i sprawdzaj te nagłówki wg. własnego algorytmu i przerywaj połaczenie jeśli taki plik posiada przeglądarka...

pozatym nieraz na stronie wiele się nie zmienia - można by takie elementy zmieniać poprzez ajax/js - same skrypty js i style css też da się poddać kompresji gzip....

zaś obrazki srawdzaj czy przeglądarka nie ma ich w pamięci aktualnych - jeśli nie aktualne wyślij nowszą wersję, jeśli ma aktualne zrwaj połaczenie - przy okazji można by dodać obsługę algorytmu sprawdzającego czy ktoś nie hotlinkuje obrazków...
smietek
Zegarek, z tego co napisałeś interesują mnie tylko obrazki (tak, żeby nie ładowały się za każdym razem).
Jak to zrobić, bo ja tego nie czaje?
zegarek84
ten mój post gdzie obrazek miał wyglądać jak obrazek (zorjentujesz się jak przeczytasz o co chodzi):
http://forum.php.pl/index.php?s=&showt...st&p=626640

i np. taki skrypt do samych obrazków (gdzie w zasadzie ob_start() nie potrzebny - ale exit niby też nie jednak jeśli miały by być jakieś znaki za kodem to dobrym zwyczajem moim zdaniem używać):

  1. <?php
  2. $file=$_GET['co'];
  3. // sprawdź jeszcze sobie np. czy obrazek istnieje - jeśli nie to obrazek z komunikatem if(!file_exists($file))
  4.  
  5. //czy hotlinkują czego nie chcielibyśmy ;) - ale osobno obrazki niech sobie w kartach otwierają do oglądania - to i tak w pełni nie da się zabezpieczyć ale zwykłe hotlinkowanie to i tak dużo...
  6. if((isset($_SERVER['HTTP_REFERER']))?(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)!=$_SERVER['SERVER_NAME']):false)$file='stop_hotlinking_small.gif';
  7.  
  8. $file_last_modification = filemtime ($file);
  9. $gm_file_last_modification = gmdate ("D, d M Y H:i:s T", $file_last_modification);
  10. // jeśli nie zmodyfikowany przerwanie połączenia
  11.  
  12. // Tutaj właściwa część skryptu Cache
  13. $etag = '"'.md5($file.$file_last_modification). '"';
  14. $modified = !isset($_SERVER['HTTP_IF_NONE_MATCH']) || trim($_SERVER['HTTP_IF_NONE_MATCH']) != '*' && strpos($_SERVER['HTTP_IF_NONE_MATCH'], $etag) === false;
  15. if (!$modified){header('HTTP/1.1 304 Not Modified');}
  16. header('ETag: '.$etag);
  17. if (!$modified) exit;
  18.  
  19. header("Content-type: " . image_type_to_mime_type(exif_imagetype($file)));
  20. header('Last-Modified: '.$gm_file_last_modification);
  21.  
  22.  
  23.  
  24. readfile($file);
  25. ob_end_flush();exit;
  26. ?>


możesz też się zainteresować innymi nagłówkami head - np. jaka ma być żywotność obrazka i inne co może w niektórych przeglądarkach też zmniejszyć ilość odpytań serwera - ale skrypt bazowy już masz....

//coś klawiatura zaczyna mi się ciąć...

// ps. - zanim się wysyła nagłówki head nie możesz nic wcześniej do przeglądarki wysłać - a więc pliki tez musza być kodowane bez BOM..
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.