Newsgroup: it.comp.www.php
Titolo: PHP Oracle e altre facezie :-)

Volevo provi un problema che non mi dà tregua.
Sto realizzando uno scprit di shell php che carica delle anagrafiche in
formato test in un db oracle 9.
La versione di php che uso è la 4.3.3
Il funzionamento dello script è semplice, quando viene invocato da
shell,
apre un file di testo in lettura, ed in un ciclo while che itera fino
alla fine dello stesso (EOF) leggo una riga alla volta ne estrapolo i
dati che mi servono e li inserisco nella varie tabelle del db.
Il funzionamento risulta essere corretto ma non riesco a rendere
scalabile lo script.
Mi spiego meglio, usano una serie di unset sono riuscito a contenere la
dimensione del mio script (lo eseguo su Solaris), invece non riesco a
mantenere di dimnesioni accettabili il processo Oracle corrispondente,
che dopo sole 3000 righe processate è già di dimensione 100 MB.
Ne il commit, ne il liberare risorse tramite sql_free_result cambia
questo comportamento.
Una delle ultime prove fatte è stata quella di uscire dal ciclo while
dopo 3000 record per vedere se almeno alla fine del ciclo venivano
rilasciate le risorse, ma misteriosamente usando il break si interrompe
lo script e non solo il ciclo.
Qualcuno ha qualche idea? Grazie in anticipo Andrea

 Qualcuno ha qualche idea? 
Postare il codice?
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

while (!feof($fp))
	{
		$guid = '#'.sprintf("%03d",$seq).sprintf("%011d",time());
		$row = fgets($fp, 8192);
		if ($row == '')
			continue;
		$myPersonArray = $myXmlInfo->GetPersonArray($row);
		unset($row);
		$myPersonInfo =& new
PersonInfo($myPersonArray,$myEpsArray,$myTimeRulesArray,$myDateFormat);
	  $reportSave =	$myPersonInfo->savePerson($guid,$loadCompany);
	  $operationDate =& new Date();
	  $monitorValuesArray["CurrentOperation"] = "Process Data";
		$monitorValuesArray["Processed"] =
incrementString($monitorValuesArray["Processed"]);
		if ($reportSave["flag"])
		{
		  $monitorValuesArray["SuccessfullyProcessed"] =
incrementString($monitorValuesArray["SuccessfullyProcessed"]);
	  	$monitorValuesArray["LastSuccessDate"] = $operationDate->getDate();
	  }
	  else
		{
		  $monitorValuesArray["Failed"] =
incrementString($monitorValuesArray["Failed"]);
 			$monitorValuesArray["LastFailedDate"] = $operationDate->getDate();
		}
		WriteLog($reportSave["msg"]);
   	$monitor->updateFields($monitorValuesArray);
	  $monitor->saveMonitor();
		if ($loadBadge)
			WriteLog($myPersonInfo->saveBadgePerson($guid));
		if ($loadBadge_2)
			WriteLog($myPersonInfo->saveBadgePerson_2($guid));
		if (($loadEps)||($applyEpsFields))
			WriteLog($myPersonInfo->saveEpsAuthorizationPerson());
		if (($loadTimerule)||($applyTimeRuleFields))
			WriteLog($myPersonInfo->saveTimeRulePerson());
		$seq++;
 		$i++;
                // Ogni tremila record esegue questa IF
 		if (fmod($i,$divide) == 0)
 		{
	 		Logout(UserName);
	 		sleep(60);
	 		echon("checl memory");
	 		Login(UserName,Password,"loadAnagraphic");
 		}
		if ($seq > 999)
			$seq = 0;
	}
All'incirca è questo.
Questo pezzo di codice che è il cuore dello script viene richiamato
all'interno di una funzione presente in una libreria che è inclusa nel
file che viene lanciato da shell.
Grazie Andrea


hile (!feof($fp))
        {
         $guid = '#'.sprintf("%03d",$seq).sprintf("%011d",time());
         $row = fgets($fp, 8192);
         if ($row == '')
                 continue;
         $myPersonArray = $myXmlInfo->GetPersonArray($row);
         unset($row);
         $myPersonInfo =& new
PersonInfo($myPersonArray,$myEpsArray,$myTimeRulesArray,$myDateFormat);
         $reportSave = $myPersonInfo->savePerson($guid,$loadCompany);
         $operationDate =& new Date();
         $monitorValuesArray["CurrentOperation"] = "Process Data";
         $monitorValuesArray["Processed"]
=incrementString($monitorValuesArray["Processed"]);
         if ($reportSave["flag"])
         	{
         	 $monitorValuesArray["SuccessfullyProcessed"]
=	incrementString($monitorValuesArray["SuccessfullyProcessed"]);
           $monitorValuesArray["LastSuccessDate"] =
$operationDate->getDate();
          }
          else
          {
          	$monitorValuesArray["Failed"] =
incrementString($monitorValuesArray["Failed"]);
            $monitorValuesArray["LastFailedDate"] =
$operationDate->getDate();
          }
          WriteLog($reportSave["msg"]);
      	  $monitor->updateFields($monitorValuesArray);
          $monitor->saveMonitor();
          $seq++;
        	$i++;
        	// Ogni tremila record esegue questa IF
        	if (fmod($i,$divide) == 0)
        	{
            Logout(UserName);
          	sleep(60);
            echon("check memory");
            Login(UserName,Password,"loadAnagraphic");
          }
          if ($seq > 999)
          	$seq = 0;
        }
All'incirca è questo questa volta un pochino più indentato.


 file che viene lanciato da shell.
Inserisci prima e dopo ogni istruzione che alloca memoria una chiamata
a 
http://www.php.net/memory_get_usage
 e logga in un file __LINE__ e la
memoria utilizzata prima e dopo l'istruzione.
Una volta fatto cio' analizza quali istruzioni allocano piu' memoria e
fai in modo di rilasciarla usando un unset oppure un $var = '';


Grazie, sicuramento così potrò vedere dove c'e' la dispersione. Ma
credo comunque che non bastino delle unset ne ho già usata una perogni
variabile. Il problema principale è il processo Oracle che ha fronte
di questo caricamento massivo diventa gigantesco fino a bloccare il
sistema e scoppiando dando un segmentation fault.
Putroppo lo script gira in un sistema particolare dove c'e' ilnotro
programma che effettua la connessione al DB. Quando io lancio il mio
script mim loggo sul programma che a sua volta mi fornisce una istanza
del db su cui lavorare. Quindi non posso sloggarmi dallo stesso.
Hai qualche ulteriore idea? Nel frattempo provo ad usare il
memopry_get_usage
Grazie Andrea

 Hai qualche ulteriore idea?
Perche' non ti puoi "sloggare" dallo stesso?
Non puoi far ripartire in automatico una istanza del programma ad ogni
esecuzione dello script?
-- 
I am what I am, I do what I can
