Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Skrypt zżerający ogromne ilości transferu
smietek
post
Post #1





Grupa: Zarejestrowani
Postów: 306
Pomógł: 32
Dołączył: 20.01.2008

Ostrzeżenie: (20%)
X----


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.
Go to the top of the page
+Quote Post
_Martin_
post
Post #2





Grupa: Zarejestrowani
Postów: 352
Pomógł: 9
Dołączył: 16.09.2005
Skąd: Rybnik

Ostrzeżenie: (0%)
-----


Hej

Tak sobie myślę czy zapytania do bazy jakieś masz?
Odczyt zapis, odczyt, zapis! to może dużo pociągnąć!
Go to the top of the page
+Quote Post
smietek
post
Post #3





Grupa: Zarejestrowani
Postów: 306
Pomógł: 32
Dołączył: 20.01.2008

Ostrzeżenie: (20%)
X----


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

Ten post edytował smietek 30.06.2009, 05:43:29
Go to the top of the page
+Quote Post
Wicepsik
post
Post #4





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

Ostrzeżenie: (20%)
X----


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.
Go to the top of the page
+Quote Post
smietek
post
Post #5





Grupa: Zarejestrowani
Postów: 306
Pomógł: 32
Dołączył: 20.01.2008

Ostrzeżenie: (20%)
X----


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ć?
Go to the top of the page
+Quote Post
wookieb
post
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Warto zastosować nagłowki Expires i polecam dodatek do firefoxa o nazwie yslow. Powie ci jak odciążyć serwer od transferu.

Ten post edytował wookieb 30.06.2009, 09:51:23
Go to the top of the page
+Quote Post
zegarek84
post
Post #7





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
smietek
post
Post #8





Grupa: Zarejestrowani
Postów: 306
Pomógł: 32
Dołączył: 20.01.2008

Ostrzeżenie: (20%)
X----


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?

Ten post edytował smietek 1.07.2009, 10:45:07
Go to the top of the page
+Quote Post
zegarek84
post
Post #9





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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..

Ten post edytował zegarek84 1.07.2009, 11:22:29
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.08.2026 - 12:30