![]() |
![]() ![]() |
![]() |
![]()
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 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
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? |
|
|
![]()
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() |
|
|
![]()
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ć? |
|
|
![]()
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() |
|
|
![]()
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. |
|
|
![]()
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 |
|
|
![]()
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');
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? |
|
|
![]()
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.
|
|
|
![]()
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 |
|
|
![]()
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(). |
|
|
![]() ![]() |
![]() |
Aktualny czas: 15.09.2025 - 08:45 |