Kom ihåg mig?
Home Menu

Menu


PHP skript dör utan varning eller felmeddelande

 
Ämnesverktyg Visningsalternativ
Oläst 2007-11-07, 15:06 #1
blixtsystems blixtsystems är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2005
Inlägg: 442
blixtsystems blixtsystems är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2005
Inlägg: 442
Jag håller på att parsar handhistoriefiler för poker och efter mycket slit så har jag fått ihop ett system som fungerar bra, men med ett mycket besvärligt undantag.
Då text filerna blir stora så dör skriptet innan det är klart.

Filerna är inte jättestora och problemet visar sig innan de nått 100k.
Systemet är en state machine där jag använder file_get_contents för att läsa in hand för hand (en 20-30 rader åt gången) för att sedan köra en loop med olika "states" som har diverse reguljära uttryck för att extrahera informationen.
Informationen sparas sedan i en array och då en hand är färdig parsad sparas den i en MySQL databas.
Sedan rensar jag arrayerna och börjar på nästa hand.

Enligt memory_get_usage så använder skriptet drygt 5 Mb då det dör.
Jag har testat att höja memory limit till 100M, men det gör ingen skillnad.
Skriptet jobbar bara i några sekunder innan det dör och timeout är satt till 120s.

PHP ger inte ger mig inte någonting att gå på vad det är som får skriptet att dö, varken varningar eller felmeddelanden.
I firefox kör skriptet en 4 sekunder och sedan dyker det upp en "connection reset" sida. I IE dyker det upp en "page not available" sida efter någon sekund.

Det bästa hade väl varit att läsa linje för linje, men det blir lite knepigt att ändra i detta stadium med det system jag använder.
Och man tycker att en 20-30 linjer åt gången inte borde vara några problem alls.

Är det några resursinställningar i PHP eller apache som jag kan fixa problemet?
Koden jag använder för att läsa in en hand från textfilen är:
Kod:
file_get_contents($filename, FALSE, NULL, $offset, $end)
Kan det finnas ett bättre alternativ för att läsa in hand för hand?
blixtsystems är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-07, 15:17 #2
Björklunds avatar
Björklund Björklund är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jul 2006
Inlägg: 594
Björklund Björklund är inte uppkopplad
Mycket flitig postare
Björklunds avatar
 
Reg.datum: Jul 2006
Inlägg: 594
Vad säger php-error-loggen?
Björklund är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-07, 15:45 #3
blixtsystems blixtsystems är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2005
Inlägg: 442
blixtsystems blixtsystems är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2005
Inlägg: 442
Ingenting i varken PHP eller apache loggar, och jag kör med E_ALL.
blixtsystems är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-07, 15:50 #4
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Hur körs det? Som Apache modul, CGI eller som CLI script?

CLI är mer eller mindre känt att vara en instabil variant.

Lägg in breaks i scriptet?
Anpassa scriptet så att den inte gör om arbetet när det kraschar utan fortsätter där det slutade. Kan vara att scriptet får något oväntat svar?

Hur hämtar du indata? Från en lokal fil? Från en annan server?

Lite mer info så sätt kan behövas.
Jonas är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-07, 16:00 #5
blixtsystems blixtsystems är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2005
Inlägg: 442
blixtsystems blixtsystems är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2005
Inlägg: 442
Lokalt så kör jag det med en oförändrad xampp installation på XP och det är väl som apache modul.
Jag får samma problem på mitt webhotell som kör med linux och som CGI.

Jag har ingen aning om hur jag skall lyckas få skriptet att börja om där det dog.
PHP har ju slutat exekvera det och jag kan inte komma på någon metod för att känna av det och starta om processen.

Indata är från en lokal fil.
blixtsystems är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-07, 16:06 #6
blixtsystems blixtsystems är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2005
Inlägg: 442
blixtsystems blixtsystems är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2005
Inlägg: 442
Jag missade....angående breaks så kör ju koden som sagt hand för hand och normalt har jag Charles debugging proxy på och då så försvinner inte sidan utan slutar bara ladda vid en viss punkt.
Så jag kan följa exakt var det dör och det har inte att göra med kod eller input vid den punkten.
Tar jag bort några rader i början av filen så parsar den några rader till, så det förefaller helt klart vara någon slags resursbegränsing.
blixtsystems är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-07, 16:11 #7
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Stäng av max_execution_time, höj minnes användning, Finns en hel del man kan ändra i php.ini, gör ändringarna där istället för i scriptet och starta om apache.

Eka även ut data i webläsaren...
Jonas är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-07, 16:26 #8
blixtsystems blixtsystems är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2005
Inlägg: 442
blixtsystems blixtsystems är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2005
Inlägg: 442
Har testat följande i php.ini

pcre.backtrack_limit = 1000000
pcre.recursion_limit = 1000000
ignore_user_abort = On
max_execution_time = 120
max_input_time = -1
memory_limit = -1

Ingen av ändringarna har någon inverkan på hur lång skriptet kommer innan det dör.
pcre.recursion_limit verkar krasha apache vid den extrema inställningen men då den inte gör det har den ingen effekt på hur långt skriptet kör.
blixtsystems är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-07, 18:18 #9
blixtsystems blixtsystems är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2005
Inlägg: 442
blixtsystems blixtsystems är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2005
Inlägg: 442
Jag märkte nu att om jag inte skriver ut all data utan bara ett id för varje hand så dör skriptet ungefär dubbelt så tidigt.

Det tyder kanske på att det inte är en resurs som tar slut då jag inte ser varför den skulle använda mer resurser för att man tar bort en massa echo's?

Jag har dock fortfarande inte en aning vad det är som dödar skriptet
blixtsystems är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-07, 19:44 #10
WizKid WizKid är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Apr 2004
Inlägg: 618
WizKid WizKid är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Apr 2004
Inlägg: 618
Har du testat köra skriptet utan att köra det igenom Apache?
WizKid är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 06:04.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017