Ga naar inhoud
  • 0

PHP script gebruikt te veel geheugen


fredmatrack

Vraag

Hallo,

 

ik ben bezig met een script dat gegevens (van leraren) uit een MySQL databank kopieert naar een FileMaker database.

Op zich werkt dat prima, alleen, het geheugengebruik loopt per leraar ontzettend op.

 

Een stukje uit het logbestand:

2007-10-10 12:41:37 1. Gebruikt geheugen: 896264

2007-10-10 12:41:37 Verbinding met MySQL gemaakt

2007-10-10 12:41:37 2. Gebruikt geheugen: 898232

2007-10-10 12:41:37 3. Gebruikt geheugen: 901136

2007-10-10 12:41:38 4. Gebruikt geheugen: 1046320

2007-10-10 12:41:38 5. Gebruikt geheugen: 1046320

2007-10-10 12:41:38 Aantal gevonden leraren in Mastertabel: 271

2007-10-10 12:41:38 6. Gebruikt geheugen: 1046320

2007-10-10 12:41:38 6.2 Gebruikt geheugen: 1048992

2007-10-10 12:41:38 6.3 Gebruikt geheugen: 1049728

2007-10-10 12:41:38 6.4 Gebruikt geheugen: 1052224

2007-10-10 12:41:38 6.5 Gebruikt geheugen: 1052304

2007-10-10 12:41:38 6.1 Gebruikt geheugen: 1048480

2007-10-10 12:41:38 Michel ***** toegevoegd aan FileMaker

2007-10-10 12:41:38 7. Gebruikt geheugen: 1201216

2007-10-10 12:41:38 6.2 Gebruikt geheugen: 1198744

2007-10-10 12:41:38 6.3 Gebruikt geheugen: 1199600

2007-10-10 12:41:38 6.4 Gebruikt geheugen: 1200552

2007-10-10 12:41:38 6.5 Gebruikt geheugen: 1200408

2007-10-10 12:41:38 6.1 Gebruikt geheugen: 1196584

2007-10-10 12:41:38 ****** Aerts toegevoegd aan FileMaker

 

 

Wat doe ik nu fout? Ik zou verwachten dat de leraar wordt toegevoegd en vervolgens de volgende leraar wordt aangepakt, zonder dat er extra geheugen wordt gereserveerd.

 

Dit is het script:

<?php 
//mb_internal_encoding('UTF-8'); 

include("config.php"); 
include("functies.php"); 
include("classLeraar.inc.php"); 
include($fmapi); // FileMaker API 

   write_log("1. Gebruikt geheugen: ".memory_get_usage()); 

// Verbinden met MySQL host 
   mysql_conn(); 
   write_log("2. Gebruikt geheugen: ".memory_get_usage()); 

// Connectie naar de database. 
   $fm = new FileMaker(); 
   $fm->setProperty('hostspec', $fmhost); 
   $fm->setProperty('database', $fmdatabaseleraren); 
   $fm->setProperty('username', $fmuser); 
   $fm->setProperty('password', $fmpwd); 
   write_log("3. Gebruikt geheugen: ".memory_get_usage()); 

// Alle lerarenID uit FileMaker in een array opslaan 
   $findCommand = $fm->newFindAllCommand('phpLerarenLeraarID'); 
   $findCommand->addSortRule('leraarID', 1, FILEMAKER_SORT_ASCEND); 
   $result = $findCommand->execute(); 
   write_log("4. Gebruikt geheugen: ".memory_get_usage()); 

   if (FileMaker::isError($result)) { 
           write_log("Fout in syncFMLeraren: ".$result->getMessage()); 
           exit; 
   } 

   $records = $result->getRecords();    
   $lerarenids = Array(); 
   $i = 0; 

   foreach ($records as $record) { 
       $lerarenids[$i] = $record->getField('leraarID'); 
       $i++; 
   } 

   unset($i); 
   unset($record); 
   unset($result); 
   unset($records); 
   unset($findCommand); 
   write_log("5. Gebruikt geheugen: ".memory_get_usage()); 

// Alle lerarenIDs ophalen uit master 
   $query = "select lerarenID from tblLerarenMaster order by naam, voornaam"; 
   $result = mysql_query($query); 

   unset ($query); 
   write_log("Aantal gevonden leraren in Mastertabel: " . mysql_num_rows($result));    
   write_log("6. Gebruikt geheugen: ".memory_get_usage()); 

//  ID's uit LerarenMaster overlopen 
   while($line = mysql_fetch_row($result)){ 
       $objMasterLeraar = getObjMasterLeraar($line[0]); 
       write_log("6.1 Gebruikt geheugen: ".memory_get_usage()); 

       if(in_array($objMasterLeraar->LerarenID,$lerarenids)){ 
           write_log($objMasterLeraar->Voornaam." ".$objMasterLeraar->Naam." zit in FileMaker"); 
           syncLeraarMasterFM($objMasterLeraar); 
       } 
       else{    
           insertLeraarIntoFM($objMasterLeraar); 
           write_log("7. Gebruikt geheugen: ".memory_get_usage());  
       } 
       unset($objMasterLeraar); 
   } 
   write_log("8. Gebruikt geheugen: ".memory_get_usage()); 






// Functies 
   function getObjMasterLeraar($leraarid){ 
       write_log("6.2 Gebruikt geheugen: ".memory_get_usage()); 
       $query = "select lerarenID, informatid, rijksregister, stamnummer, naam, voornaam, tweedevoornaam, initialen, nickname, roepnaam, afkorting, 
                     geboortedatum, geboorteplaats, geboorteland, geslacht, bankrekening, nationaliteit, nummerplaat, 
                     email, telefoon, gsm, straat, nr, bus, hoofdpostnr, hoofdgemeente, deelpostnr, deelgemeente, provincie, 
                     verblijf_straat, verblijf_nr, verblijf_bus, verblijf_hoofdpostnr, verblijf_hoofdgemeente, verblijf_deelpostnr, verblijf_deelgemeente, verblijf_provincie, 
                     indienstlos, indienstms, indienstbb, gebruikersnaam, paswoord 
              from tblLerarenMaster 
              where lerarenID = $leraarid 
              order by naam, voornaam"; 
       $result = mysql_query($query); 
       write_log("6.3 Gebruikt geheugen: ".memory_get_usage()); 
       if(mysql_num_rows($result) == 1){ 
           $line =   mysql_fetch_assoc($result); 

           $objLeraar = new Leraar; 
           $objLeraar->LerarenID = $line['lerarenID']; 
           $objLeraar->Pointer = $line['informatid']; 
           $objLeraar->Naam = $line['naam']; 
           $objLeraar->Voornaam = $line['voornaam']; 
           $objLeraar->TweedeVoornaam = $line['tweedevoornaam']; 
           $objLeraar->Initialen = $line['initialen']; 
           $objLeraar->Geslacht = $line['geslacht']; 
           $objLeraar->Nationaliteit = $line['nationaliteit']; 
           $objLeraar->Geboortedatum = date("n-j-Y", strtotime($line['geboortedatum'])); 
           $objLeraar->Geboorteplaats = $line['geboorteplaats']; 
           $objLeraar->Geboorteland = $line['geboorteland']; 
           $objLeraar->Nickname = $line['nickname']; 
           $objLeraar->Roepnaam = $line['roepnaam']; 
           $objLeraar->Afk = $line['afkorting']; 
           $objLeraar->Stamnummer = $line['stamnummer']; 
           $objLeraar->Nummerplaat = $line['nummerplaat']; 
           $objLeraar->Straat = $line['straat']; 
           $objLeraar->Nr = $line['nr']; 
           $objLeraar->Bus = $line['bus']; 
           $objLeraar->DeelPostNr = $line['deelpostnr']; 
           $objLeraar->Deelgemeente = $line['deelgemeente']; 
           $objLeraar->PostNr = $line['hoofdpostnr']; 
           $objLeraar->Gemeente = $line['hoofdgemeente']; 
           $objLeraar->Provincie = $line['provincie']; 
           $objLeraar->StraatVerblijf = $line['verblijf_straat']; 
           $objLeraar->NrVerblijf = $line['verblijf_nr']; 
           $objLeraar->BusVerblijf = $line['verblijf_bus']; 
           $objLeraar->DeelPostNrVerblijf = $line['verblijf_hoofdpostnr']; 
           $objLeraar->DeelgemeenteVerblijf = $line['verblijf_deelgemeente']; 
           $objLeraar->PostNrVerblijf = $line['verblijf_deelpostnr']; 
           $objLeraar->GemeenteVerblijf = $line['verblijf_hoofdgemeente']; 
           $objLeraar->ProvincieVerblijf = $line['verblijf_provincie']; 
           $objLeraar->Rekeningnummer = $line['bankrekening']; 
           $objLeraar->RijksregisterNr = $line['rijksregister']; 
           $objLeraar->GSM = $line['gsm']; 
           $objLeraar->Telefoon = $line['telefoon']; 
           $objLeraar->Email = $line['email']; 
           $objLeraar->EffectiefLOS = $line['indienstlos']; 
           $objLeraar->EffectiefMS = $line['indienstms']; 
           $objLeraar->EffectiefBB = $line['indienstbb']; 
           $objLeraar->Gebruikersnaam = $line['gebruikersnaam']; 
           $objLeraar->Paswoord = $line['paswoord']; 
           write_log("6.4 Gebruikt geheugen: ".memory_get_usage()); 
           mysql_free_result($result); 
           unset($result); 
           unset($line); 
           write_log("6.5 Gebruikt geheugen: ".memory_get_usage()); 
           return $objLeraar; 
       } 
       else{ 
           return null; 
       }   
   } 

   function syncLeraarMasterFM($objLeraar){ 


   } 

   function insertLeraarIntoFM($objLeraar){ 
       global $fm; 
       $result = null; 

       $rec = $fm->createRecord('phpLerarenInvoer', null); 
       $rec->setField("leraarID", $objLeraar->LerarenID); 
       $rec->setField("voornaam", $objLeraar->Voornaam); 
       $rec->setField("achternaam", $objLeraar->Naam); 
       $rec->setField("voornamen", $objLeraar->TweedeVoornaam); 
       $rec->setField("roepnaam", $objLeraar->Roepnaam); 
       $rec->setField("afkorting", $objLeraar->Afkorting); 
       $rec->setField("geslacht", $objLeraar->Geslacht); 
       $rec->setField("geboortedatum", $objLeraar->Geboortedatum); 
       $rec->setField("geboorteplaats", $objLeraar->Geboorteplaats); 
       $rec->setField("geboorteland", $objLeraar->Geboorteland); 
       $rec->setField("informatID", $objLeraar->Pointer); 
       $rec->setField("rekeningnr", $objLeraar->Rekeningnummer); 
       $rec->setField("nationaliteit", $objLeraar->Nationaliteit); 
       $rec->setField("email", $objLeraar->Email); 
       $rec->setField("telefoon", $objLeraar->Telefoon); 
       $rec->setField("gsm", $objLeraar->GSM); 
       $rec->setField("straat", $objLeraar->Straat); 
       $rec->setField("nummer", $objLeraar->Nr); 
       $rec->setField("bus", $objLeraar->Bus); 
       $rec->setField("postcode", $objLeraar->DeelPostNr); 
       $rec->setField("gemeente", $objLeraar->Deelgemeente); 
       $rec->setField("inDienstLOS", $objLeraar->EffectiefLOS); 
       $rec->setField("inDienstMS", $objLeraar->EffectiefMS); 
       $rec->setField("inDienstBB", $objLeraar->EffectiefBB); 
       $rec->setField("gebruikersnaam", $objLeraar->Gebruikersnaam); 
       $rec->setField("paswoord", $objLeraar->Paswoord); 
       $rec->setField("rijksregisternr", $objLeraar->RijksregisterNr); 
       $rec->setField("stamnr", $objLeraar->Stamnummer); 

       // Commit sturen naar de database 
       $result = $rec->commit(); 

       if (FileMaker::isError($result)) { 
               write_log("Record wegschrijven mislukt voor $objLeraar->Voornaam $objLeraar->Naam: ". $result->getMessage()); 
               //unset($fm); 
               unset($rec); 
               unset($result); 
               return 0; 
       } 
       else{ 
           write_log("$objLeraar->Voornaam $objLeraar->Naam toegevoegd aan FileMaker"); 
           //unset($fm); 
           unset($rec); 
           unset($result); 
           return 1; 
       } 
   }  

?>

 

Ik weet dat het mogelijk is om via FileMaker een rechtstreekse koppeling te maken met MySQL. Dat wil ik momenteel echter liever vermijden.

Link naar reactie

2 antwoorden op deze vraag

Aanbevolen berichten

  • 0

De PHP functie memory_get_usage() geeft het geheugen weer (in bytes) dat op dat moment toegewezen is aan PHP. Je moet het dus niet optellen per leraar. 1,14 MB lijkt mij niet overdreven.

 

Daarnaast is het wel zo dat de FileMaker PHP API onbehoorlijk veel gegevens vanuit de WPE/webserver terugstuurt naar de browser, en dat dit bij grotere datasets of veel gebruikers tegelijk leidt tot aanzienlijk snelheidsverlies.

 

- Jeroen

Link naar reactie
  • 0

Dat klopt, maar als ik in de Activity Monitor van OS X ga kijken, dan zie ik dat het effectieve geheugen van mijn httpd proces telkens oploopt tot 20Mb. Per leraar komt er zo'n 0,20 Mb bij.

 

Dit zie ik bv. op het einde van de log:

2007-10-10 12:42:34 Karen ***** toegevoegd aan FileMaker

2007-10-10 12:42:34 7. Gebruikt geheugen: 14613816

2007-10-10 12:42:34 6.2 Gebruikt geheugen: 14611424

2007-10-10 12:42:34 6.3 Gebruikt geheugen: 14612320

2007-10-10 12:42:34 6.4 Gebruikt geheugen: 14620384

2007-10-10 12:42:34 6.5 Gebruikt geheugen: 14617904

2007-10-10 12:42:34 6.1 Gebruikt geheugen: 14613776

2007-10-10 12:42:34 ******* Ysebaert toegevoegd aan FileMaker

2007-10-10 12:42:34 7. Gebruikt geheugen: 14660936

2007-10-10 12:42:34 8. Gebruikt geheugen: 14655632

Link naar reactie

Doe mee aan dit gesprek

Je kunt dit nu plaatsen en later registreren. Indien je reeds een account hebt, log dan nu in om het bericht te plaatsen met je account.

Gast
Beantwoord deze vraag...

×   Geplakt als verrijkte tekst.   Plak in plaats daarvan als platte tekst

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...