Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> zbyt duże zużycie danych w APACHE, [PHP][APACHE]
Rozpalacz
post
Post #1





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 31.01.2006

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


Witam,

mam skrypt, który pobiera stronę internetową cURLem i odpowiednio ją mieli. Skrypt uruchamiany jest codziennie kilkadziesiąt razy. Zazwyczaj zużycie waha się od 1kb do 10mb. W ciągu ostatniego pół roku miałem dwie sytuacje że raz zużycie było 2GB a wczoraj 5GB.
Kod
xxx.xxx.xxx.222 - - [15/Jan/2015:12:25:01 +0100] "GET /ebok/ebok.php HTTP/1.1" 200 5341205253 "-" "Wget/1.13.4 (linux-gnu)"


Szczerze mówiąc nie ma tam żadnych pętli które mogłby by być nieskończone czy niewiadomo jakich obliczeń, dlatego sam nie wiem czemu wyszło aż 5GB.

Czy mogę się w jakiś sposób zabezpieczyć przed pożarciem mi całego limitu transferu? Ustawić jakoś w skrypcie, php.ini czy gdzieś by po przekroczeniu rozmiaru żużycia danych np 100MB przerywało działanie skryptu?

PS.
Podejrzewam, (chociaż nie wiem czy to możliwe by uzyskać 5GB) że takie zużycie mogło wyniknąć w testów, gdy zrobiłem 6 razy dla całego pobranego kodu HTML
Kod
print_r($dom)

wykorzystując PHP Simple HTML DOM Parser
print_r rzeczywiście wypisuje masę różnych rzeczy i strasznie długo to trwa. Ale dobrzeby było wiedzieć jak przerwać takie wykonywanie skryptu.

Ten post edytował Rozpalacz 16.01.2015, 21:19:47
Go to the top of the page
+Quote Post
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


http://stackoverflow.com/a/17642638
Go to the top of the page
+Quote Post
Rozpalacz
post
Post #3





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 31.01.2006

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


Raczej tu nie chodzi o CURL a zapewne o to że zaczęło wyświetlać sporą liczbę danych z print_r($dom). Czy można jakoś zabezpieczyc sie by skrypt nie działał w nieskończoność lub jakoś przerwać działanie skryptu?

Jakieś polecenie, funkcja w skrypcie PHP czy jakieś ustawienia w php.ini?
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


http://php.net/manual/en/info.configuratio...-execution-time
http://php.net/manual/en/function.set-time-limit.php

i do tego możesz sprawdzać długość generowanej odpowiedzi i jak przekroczy np. 500000 bajtów to die()
Go to the top of the page
+Quote Post
Rozpalacz
post
Post #5





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 31.01.2006

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


Cytat
długość generowanej odpowiedzi i jak przekroczy np. 500000 bajtów to die()


Rozwiązania z czasem nie mogę zastosować, gdyż czasem serwer z któego czytam stronę może być zapchany i chodzić wolniej. Ale to co zacytowałem si się podoba i byłoby rozwiązaniem. Jak to mam zastosować?
Go to the top of the page
+Quote Post
Pyton_000
post
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


nie wiem co robisz...

ogólnie
if(strlen($string) > 500000)
die()
Go to the top of the page
+Quote Post
Rozpalacz
post
Post #7





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 31.01.2006

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


Prosta rzecz. Jak to zrobić by zatrzymać wykonaywanie skryptu jeśli jego zużycie apache wynosi więcej niż np 10MB.
Chciałbym się zabezpieczyć przed takimi sytuacjami jak poniżej że skrypt ebok.php zużył mi 5GB transferu.
Kod
xxx.xxx.xxx.204 - - [15/Jan/2015:12:25:01 +0100] "GET /ebok/ebok.php HTTP/1.1" 200 5341205253 "-" "Wget/1.13.4 (linux-gnu)"

Chciałbym by skrypt zakończył działanie jeśli osiągnie zużycie 10MB. Może to być ustawione globalnie dla wszytskich wykonywanych skryptów.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Na początku pliku ustaw sobie

ini_set('memory_limit', '20M');
lub .htaccess
php_value memory_limit 20M
Go to the top of the page
+Quote Post
Rozpalacz
post
Post #9





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 31.01.2006

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


Pyton_000, zrobiłem tak jak pisałeś z ini_set('memory_limit', '1M');
  1. <?php
  2. ini_set('memory_limit', '1M');
  3. $a = array();
  4. for($x=1; $x<1000; $x++) {
  5. array_push($a, array('imie'=>'Pablo'.$x, 'nazwisko'=>'picasso'.$x, 'adres'=>'nowowiejska'.$x));
  6. }
  7. print_r($a);
  8. ?>

sytuacja wygląda tak że dostaję komunikat:
Kod
Fatal error:  Allowed memory size of 1048576 bytes exhausted (tried to allocate 72 bytes) in /home/public_html/bench.php on line 5

gdzie w logu Apache samo wykonanie skryptu (bez linijki z ini_set) pożera jakieś 10KB
Kod
xxx.xxx.xxx.134 - - [16/Jan/2015:23:25:50 +0100] "GET /bench.php HTTP/1.1" 200 11146 "-" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"

Teoretycznie powinno się wykonać. Czemu tak się dzieje, czy zużycie transferu Apache a memory_limit to dwie różne rzeczy i nie mają ze sobą nic wspólnego?
Go to the top of the page
+Quote Post
Pyton_000
post
Post #10





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


tak dokładnie, to co Ci podałem ogranicza zużycie pamięci alokowanej przez samo PHP. Możesz je ustawić na np. 100MB i potestować. Dojdziesz do limitu który Ci wystarcza i dodać jeszcze 30% na zapas.
Go to the top of the page
+Quote Post
Rozpalacz
post
Post #11





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 31.01.2006

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


Mam ustawienia domyślne na 128MB. Zatem w jaki sposób wygenerowało się zużycie apache na 5GB na jeden request? Czy nie powinno przerwać działania skryptu jeśli wywołałem print_r dla obiektu dom utworzonego przez PHP Simple HTML Dom? Wiem że wtedy zaczyna ładować masę danych i wyświetlać na stronie, ale czy nie powinno tego przerwać zużycie limitu RAM?

Ten post edytował Rozpalacz 17.01.2015, 17:17:19
Go to the top of the page
+Quote Post
Pyton_000
post
Post #12





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Nie bo print_r wypluwa dane, ale ile tych danych to już nie wiadomo.

Jeżeli wypluwasz dane to sprawdzaj strlen($zmienna) którą wypluwasz. Jeżeli ma więcej niż 10000000bajtów to die().
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: 15.09.2025 - 08:45