FAQ |
Kalender |
![]() |
#11 | ||
|
|||
Flitig postare
|
Jag testade nu att köra i CLI...är det det du menar?
Resultat...det händer ingenting. Tar en knapp sekund och sedan är jag tillbaka till prompten. Jag hittar inte heller några kommandon som verkar som de skulle ge mig mer information. |
||
![]() |
![]() |
![]() |
#12 | |||
|
||||
Flitig postare
|
Jag tycker det låter som om php är tilldelat för lite minne för uppgiften.
Priva att ändra detta i php.ini och se om det tar längre tid innan det "dör". |
|||
![]() |
![]() |
![]() |
#13 | ||
|
|||
Flitig postare
|
Den enda minnesinställningen jag känner till är memory_limit i php.ini, och den gör som sagt ingen skillnad.
|
||
![]() |
![]() |
![]() |
#14 | |||
|
||||
Mycket flitig postare
|
-Testa att minimiera kommandona i din huvudloop, t.ex. ta bort mysql anropen och se om det fungerar.
-Prova att använda fopen() och fgets() (eller fread()) istället för file_get_contents(), eftersom file_get_contents() använder memory-map teknik för att läsa in filen kan det vara värt att testa en variant utan memory mapping. |
|||
![]() |
![]() |
![]() |
#15 | ||
|
|||
Medlem
|
släng in
error_reporting(E_ALL); ini_set('display_errors', 'On'); längst upp i php-filen. Ibland får man tvinga php att felrapportera. |
||
![]() |
![]() |
![]() |
#16 | ||
|
|||
Flitig postare
|
Tack för tipsen.
Jag har testat tidigare att deaktivera databasdelen samt att inte lagra datan i en array, men samma problem. fgets är inte så enkelt att ändra till då systemet skall läsa hand för hand och inte linje för linje vilket kanske hade varit bäst....men jag skulle gärna undvika att skriva om såpass mycket. Jag har testat att läsa in hela filen med fopen och med cURL och sedan använda substr för att plocka ut relevant hand. Skriptet dör på precis samma ställe men minnesanvändningen är högre. Jag har E_ALL och E_STRICT. Faktum är att om jag låter skriptet köra tills det dör så dyker det inte ens upp i access.log |
||
![]() |
![]() |
![]() |
#17 | ||
|
|||
Klarade millennium-buggen
|
Det är två problem. Dels fungerar inte ditt script när du ökar på mängden indata. Dels får du inte bra loggar där du tycker att du ser allt.
Det finns en funktion som heter memory_get_peak_usage. Den kanske kan hjälpa dig att få grepp om minnesförbrukningen. |
||
![]() |
![]() |
![]() |
#18 | ||
|
|||
Flitig postare
|
Jag ser absolut ingenting i loggar eller output vilket sannerligen är ett problem i detta fall....någon slags indikation på varför skriptet dör vorde mycket hjälpsamt, om inte annat för att jag då skulle haft något att googla med för att få mer insikt om problemet.
Jag har testat memory_get_peak_usage och det ligger på ungefär samma som memory_get_usage, d.v.s. drygt 5Mb. |
||
![]() |
![]() |
![]() |
#19 | |||
|
||||
Mycket flitig postare
|
Testa att läsa betydligt fler än 1 hand/gång, problemet verkar inte vara att minnet tar slut, utan snarare att nått anrop krashar efter att det itererats för många gånger, som t.ex file_get_contents.
Posta källkoden till din huvudloop så blir det lättare att försöka hitta felet. |
|||
![]() |
![]() |
![]() |
#20 | ||
|
|||
Flitig postare
|
Det är inte en huvudloop direkt utan tre klasser som interagerar, annars hade jag redan postat den, men det blir en hel del kod som kan vara relevant.
HHParser.php är huvudklassen som kollar vad det är för format på text filen (vilket pokernätverk den kommer ifrån). Den relevanta koden där är: Kod:
function getFormat(){ // parser rules to get HH format $this->Parser->FSM('/<general>/',$this, 'FormatFound', 'iPoker', 'STOP','FMT'); $this->Parser->FSM('/PokerStars Game/',$this,'FormatFound', 'Poker Stars', 'STOP','FMT'); $this->Parser->FSM('/\*\* Game ID/',$this,'FormatFound', 'MicroGaming', 'STOP','FMT'); $this->Parser->FSM('/Full Tilt Poker Game/',$this,'FormatFound', 'Full Tilt', 'STOP','FMT'); $this->Parser->ParseFile(FILE,"FMT", 0, 100); } function FormatFound($str){ $this->location=$str; $this->addSessionToDB(); switch($str){ case "Poker Stars": require("classes/sites/ps.php"); $this->Data->setMode("PS"); $this->Site=new PS($this); break; case "MicroGaming": require("classes/sites/mg.php"); $this->Data->setMode("MG"); $this->Site=new MG($this); break; case "Full Tilt": require("classes/sites/ft.php"); $this->Data->setMode("FT"); $this->Site=new FT($this); break; } } Kod:
<? /* Finite State Machine Parser class. FSM-based text parser framework. */ //Parse() result codes define("FSMSTOP_OK",0); //FSM reached end of text or file. define("FSMSTOP_UNHANDLED",1); //FSM stopped because some state is unhandled. define("FSMSTOP_STOP",2); //FSM stopped by a handler. class FSMParser { var $FSMArr=array(); var $STATE; /* FSM programming */ function FSM($expect,$caller,$execute,$arg,$defaultstate,$state=NULL, $start=NULL, $end=NULL, $greed=FALSE, $recurse=NULL){ $this->FSMArr[]=array("ex"=>$expect,"ca"=>$caller,"do"=>$execute,"ar"=>$arg,"ds"=>$defaultstate,"cs"=>$state, "st"=>$start, "en"=>$end, "gr"=>$greed, "re"=>$recurse); } /* Main loop method. */ function Parse($text,$state){ $PTR=0; $LEN=strlen($text); $RET=FSMSTOP_OK; $this->STATE=$state; $EN=$LEN; $nextState; $lastPTR; $a=$this->FSMArr; $this->FSMArr=array(); $tok_off=NULL; $tok_key=NULL; $tok_len=NULL; while($PTR<$LEN){ if(isset($a)){ foreach($a as $tkey=>$line){ if( (!$line["cs"]) or ($line["cs"]==$this->STATE) ) { if($line["st"] != NULL){ $PTR=$line["st"]; } if($line["en"] != NULL){ $EN=$line["en"]-$PTR; } //echo "<br/>STATE: ".$line["cs"]." REGEXP: ".$line["ex"]." RANGE:".$PTR."-".$EN; //echo "<br/>".substr($text,$PTR,$EN)."<br/>"; if(preg_match($line["ex"],substr($text,$PTR,$EN),$matches,PREG_OFFSET_CAPTURE)) { if( (is_null($tok_off)) or ($matches[0][1]<$tok_off) or ( ($matches[0][1]==$tok_off) and (strlen($matches[0][0])>$tok_len) ) ) { $tok_off=$matches[0][1]; $tok_len=strlen($matches[0][0]); $tok_key=$tkey; $STRING=$matches[0][0]; } } if($line["gr"]==TRUE || $line["re"] == TRUE){ $nextState=$line["ds"]; } } } if(is_null($tok_key)){ if(!is_null($nextState)){ $this->STATE=$nextState; $nextState=NULL; continue; } else { $RET=FSMSTOP_UNHANDLED; break; } } $PTR+=$tok_off+$tok_len; $lastPRT=$PTR; $arg=$a[$tok_key]["ar"] != "string" ? $a[$tok_key]["ar"] : $STRING; $arr=array($a[$tok_key]["ca"], $a[$tok_key]["do"]); $result=call_user_func($arr, $arg); $nextState=$result; if($a[$tok_key]["re"] != TRUE){ $this->STATE=$a[$tok_key]["ds"]; } else { $this->STATE=$a[$tok_key]["cs"]; $nextState=NULL; } $tok_off=NULL; $tok_len=NULL; $tok_key=NULL; } } return $RET; } /* Main loop method - file wrapper. */ function ParseFile($filename,$state, $offset=0, $end=NULL){ ini_set('default_socket_timeout', 120); return $this->Parse(file_get_contents($filename, FALSE, NULL, $offset, $end),$state); } } ?> Kod:
$this->C->Parser->FSM('/(Seat[\r\n'.$this->playerNameChars.':.$,]+\))+/',$this, 'TablePlayers', 'string', 'HANDFORCED','TABLEPLAYERS', NULL, $streets[0]); // // 18 rader med olika states för att gå igenom all information // $this->C->Parser->FSM('/\r?\n/',$this, 'HandEnd', 'string', 'STOP','HANDEND', $endIndex); $this->C->Parser->ParseFile(FILE,"TABLEPLAYERS", $this->offset, $endIndex); Då alla states är genomgångna så börjar ft.php om från början och bearbetar nästa hand på samma vis. Tyvärr är det som du ser inte alltför enkelt att ändra så man läser mer eller mindre än en hand åt gången. Jag kan förvisso läsa in hela filen i ParseFile funktionen i parserclass, men jag måste ändå plocka ut reveant del någonstans. Resultatet då jag har testat att läsa in hela filen och använda substr för att plocka ur nödvändig del är att den kör lika långt men använder mer minne. |
||
![]() |
![]() |
Svara |
|
|