Newsgroup: it.comp.www.php
Titolo: Inserto oracle problematica

Ciao a tutti avrei un problema che vi espongo.
Ogni volta che faccio una insert su un db Oracle tramite uno script da
shell il processo relativo sale di mezzo mega. Dato che è
un'operazione massiva dopo qualche migliaia di insert mi esplode tutto
dando un segmentation fault.
Qualcuno ha idea di come fare a liberare le risorse dopo una insert. La
query da come risultato true o flase quindi non credo di poterci
invocare sopra sql_free_result.
La versione di Oracle è la 9 e quella di php è la 4.3.3.
Distinti P.

 La versione di Oracle č la 9 e quella di php č la 4.3.3.
[mi quoto]
Allora, forse, e' un problema di Oracle, non di PHP.
[/mi quoto]
-- 
I am what I am, I do what I can
Do. Or do not. There is not try.

 Do. Or do not. There is not try.
Dici eh! Ma qualche idea? Grazie comunque provo a dare un'occhiata nei
newsgroup relativi.
Ciao P.

Mi è venuta in mente una cosa però.
Quando faccio aprtire lo script, con il comando top vedo due processi
relativi.
Uno Oracle ed uno php. E' quello php che quando fa le insert cresce
quello Oracle cresce ma ad un certo punto si stabilizza.
Grazie comunque. Ciao P.

 quello Oracle cresce ma ad un certo punto si stabilizza.
Se il problema sta nel codice allora utilizza memory_get_usage per
identificare dove vengono allocate le risorse, se e' un problema di
database ...


 database ...
Non se po' fa. Purtroppo per usare memory_get_usage devo accedere
all'ini del php e non ho i diritti. Aspetta... è tornato il sistemista
dalla trasferta. Mi faccio abilitare il php. Ci sentiamo dopo, grazie
della pazienza.
Ciao P.

 all'ini del php e non ho i diritti. 
Dove lo avresti letto questo?



Ho provato ad usarlo quando me lo hai segnalato l'altro giorno è non
mi riconosceva il comando. Allora sono andato sul sito del php è ho
letto questo:
memory_get_usage() will only be defined if your PHP is compiled with
the --enable-memory-limit configuration option.
preso da qui:
http://it.php.net/memory_get_usage
Allora ho lasciato perdere e ho provato a testare altre strade.
Non è così?
Ciao P.

 Non è così?
[ti quoto]
Purtroppo per usare memory_get_usage devo accedere all'ini del php 
[/ti quoto]
Non mi sembra sia scritto da nessuna parte che per usare
memory_get_usage devi "accedere all'ini del php"



Nella pagina che ho quotato c'e' un link:
 See also memory_limit.
Se uno clicca sul link viene portato ad una pagina dove si parla di
memory limit il cui titolo è:
Description of core php.ini directives
Mi sbaglio?

 Mi sbaglio?
Tralasciando quanto detto sopra, memory_limit e' modificabile
PHP_INI_ALL ossia a tutti i livello, incluso lo script con ini_set,
SENZA dover accedere al php.ini.


 memory_get_usage DEVI usare memory_limit".
OK. Ma prima di questo c'e' scritto che:
memory_get_usage() will only be defined if your PHP is compiled with
the --enable-memory-limit configuration option.
Infatti abilitandolo continua a darmi l'errore.
Vuol dire quindi che devo compilare php con quell'opzione?
Grazie P.


Ho scoperto il problema.
La versione che uso è la 4.3.11 e la pagina di memory_get_usage dice:
memory_get_usage
(PHP 4 >= 4.3.2, PHP 5)
memory_get_usage -- Returns the amount of memory allocated to PHP
purtroppo...

 purtroppo...
Purtroppo che cosa? La 4.3.11 e' stat rilasciata dopo la 4.3.2 ...


 Vuol dire quindi che devo compilare php con quell'opzione?
Che mi sembra del tutto diverso da dire che devi "accedere all'ini del
php" per utilizzarla.



Cancella i due post precedenti. Ho trovato sempre nella stessa pagina
questo workaround. Funziona solo su Unix ma magari serve a qualcun
altro qui.
$my_pid = getmypid();
error_log("MEMORY USAGE (% KB PID ): ".`ps -eo%mem,rss,pid | grep
$my_pid`);
Un ultima domanda Setec. Cosa mi dici delle varie cache che ci sono in
giro.
Noi usiamo la Turck 2.6 ma è vecchia. Sai se ne esiste una gratuita
più nuova? Magari il problema potrebbe anche dipendere da quello.
Grazie P.

 Magari il problema potrebbe anche dipendere da quello.
Non credo. Penso sia un memory leak che affligge qualche parte o del
codice, o dell'estensione oracle o della libreria client di oracle.


Fai una commit ogni tanto (ogni mille record dovrebeb andare bene)
Oppure cambia rollback segment (devi farlo prima di ogni insert),
createne uno ad hoc per questa transazione


Penso anche io ma non si sa mai.
Adesso sto debuggando con il workaround che ho trovato.
Grazie P.

 createne uno ad hoc per questa transazione
Qui invece non ti seguo. Come si fa a cambiare rollback segment?
Forse mi manca un po' di teoria di base. 
Grazie comunque P.


Purtroppo continua a non riconoscerla. Il fatto che la 4.3.11 sia stata
rilasciata dopo IMHO non vuol dire che sia successiva in senso stretto.
Probabilmente migliorerà la 4.3.1 ma ne manterrà la struttura, o no?
Comuqnue il workaround che ho trovato funge bene.
Vada in debug mode ora!! :-)
Grazie ancora... anche se mi sa che ci risentiremo :-(

 struttura, o no?
4.3.2 -> 4.3.3 -> 4.3.4 -> 4.3.5 -> 4.3.6 -> 4.3.7 -> 4.3.8 -> 4.3.9 ->
4.3.10 -> 4.3.11
Se non ne sei convinto, controlla sul sito ufficiale.


 E' più performante della Turck?
eAccelerator is a further development from mmcache PHP Accelerator &
Encoder


 Se non ne sei convinto, controlla sul sito ufficiale.
Che somaro che sono! :-)
Hai ragione ma come ti spieghi il fatto che non prende il comando?
Probabilmente non è compilata come dovrebbe la versione  del php.
Grazie ancora Andrea
P.S.
Ho trovato il pezzo che diperde memoria, devo ancora andare un po' in
profondità!

 Hai ragione ma come ti spieghi il fatto che non prende il comando?
Che non hai compilato il PHP per supportarla esattamente come dice il
manuale?


deve essere la prima sql della transazione:
SET TRANSACTION USE ROLLBACK SEGMENT <segmento grande>
in genere si crea sempre un segmento di rollback molto grande in ogni
database da usare per grosse bonifiche alla banca dati, se non l'hai
gia' fatto crealo ti servira' in seguito
in genere invece non e' una buona idea fare commit ad ogni statement,
tieni presente che il commit e' la parte piu' pesante di una
transazione (e cosi' ne fai tante...)