Kom ihåg mig?

PHP skript dör utan varning eller felmeddelande

 
Ämnesverktyg Visningsalternativ
Oläst 2007-11-07, 19:58 #11
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 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.
blixtsystems är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-07, 21:10 #12
orreborres avatar
orreborre orreborre är inte uppkopplad
Flitig postare
 
Reg.datum: Apr 2003
Inlägg: 309
orreborre orreborre är inte uppkopplad
Flitig postare
orreborres avatar
 
Reg.datum: Apr 2003
Inlägg: 309
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".
orreborre är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-07, 21:13 #13
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
Den enda minnesinställningen jag känner till är memory_limit i php.ini, och den gör som sagt ingen skillnad.
blixtsystems är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-07, 22:40 #14
SimonPs avatar
SimonP SimonP är inte uppkopplad
Mycket flitig postare
 
Reg.datum: May 2006
Inlägg: 832
SimonP SimonP är inte uppkopplad
Mycket flitig postare
SimonPs avatar
 
Reg.datum: May 2006
Inlägg: 832
-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.
SimonP är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-08, 07:07 #15
mbomelin mbomelin är inte uppkopplad
Medlem
 
Reg.datum: Feb 2004
Inlägg: 248
mbomelin mbomelin är inte uppkopplad
Medlem
 
Reg.datum: Feb 2004
Inlägg: 248
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.
mbomelin är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-08, 10:39 #16
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
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
blixtsystems är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-08, 12:27 #17
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
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.
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-08, 12:48 #18
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 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.
blixtsystems är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-08, 13:06 #19
SimonPs avatar
SimonP SimonP är inte uppkopplad
Mycket flitig postare
 
Reg.datum: May 2006
Inlägg: 832
SimonP SimonP är inte uppkopplad
Mycket flitig postare
SimonPs avatar
 
Reg.datum: May 2006
Inlägg: 832
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.
SimonP är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-08, 13:50 #20
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
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;	
 }
	}
parserclass.inc.php innehåller en state machine:
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);
	}
}
?>
ft.php innehåller parse regler för Full Tilt filer och anropar först FSM funktionen i parserclass ett antal gånger för att bygga en array med states, och sedan kör den:
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);
Det få parserclass att läsa in handen och köra reexp uttrycken för att extrahera informationen.

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.
blixtsystems ä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)
 
Ämnesverktyg
Visningsalternativ

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 15:28.

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