Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zbyt duże zużycie danych w APACHE
Forum PHP.pl > Forum > PHP
Rozpalacz
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.
Pyton_000
http://stackoverflow.com/a/17642638
Rozpalacz
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?
Pyton_000
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()
Rozpalacz
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ć?
Pyton_000
nie wiem co robisz...

ogólnie
if(strlen($string) > 500000)
die()
Rozpalacz
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.
Pyton_000
Na początku pliku ustaw sobie

ini_set('memory_limit', '20M');
lub .htaccess
php_value memory_limit 20M
Rozpalacz
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?
Pyton_000
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.
Rozpalacz
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?
Pyton_000
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().
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.