Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1

    Connessioni persistenti ingestibili

    Ciao,
    qualsiasi idea anche strampalata sarebbe di grandissimo aiuto..

    Sto creando una web application in php che si connette al DB oracle express 10g.
    Sto usando Apache 2.2.15 e PHP 5.3.2 su windows XP Sp3 e client oracle oci8 1.4

    Data la continua richiesta di dati aggiornati dal DB (funziona solo in LAN) ho preferito usare le connessioni persistenti (oci_pconnect).

    Ho impostato nel PHP.ini le variabili di gestione della connessione (massimo numero di connessioni e temeout di inattività) ma questi valori non vengono presi minimamente in considerazione, qualcuno ha idea del perchè?

    Inoltre quando tengo premuto F5 in una pagina che chiama una connessione persistente
    mi accorgo che le connessioni aumentano a dismisura (anche 50 connessioni in 10 secondi di pressione del tasto F5). Mentre se faccio F5 ogni secondo aumenta il numero di sessioni quando vuole lui (ogni tanto crea una connessione nuova). Questo può essere analogo al mantenimento del tasto F5 che fa molte richieste al secondo.

    Davvero non capisco come funziona la gestione delle connessioni persistenti.

    Grazie a tutti.

  2. #2
    Utente di HTML.it L'avatar di Laxus
    Registrato dal
    Oct 2010
    Messaggi
    251
    Davvero non capisco come funziona la gestione delle connessioni persistenti.
    qui puoi trovare un illuminante articolo: http://www.php.net/manual/en/feature...onnections.php
    in sintesi: non usare le connessioni persistenti.

  3. #3
    Ok. l'articolo l'ho letto.
    Dovendo collegarmi ad oracle mi accorgo che ogni connessione (login) è davvero pesante e lunga. C'è proprio una differenza abissale ad usare le pconnect. La navigazione/sistema è molto più veloce.
    Pensa ad un programma tipo dashboard che controlla dei parametri in RealTime.
    Ogni secondo deve leggere un grosso quantitativo di dati in un database (tutto in LAN).

    Devo riuscire a far in modo che PHP gestisca le pconnect.

    Per adesso ho solo impostato le variabili in php.ini

    Ma non so se bisogna settare qualcosa anche in Apache per gestirle.

    Inoltre facciamo un'ipotesi:
    codice:
    <? 
        include_once 'functions.php';
    ?>
    
    <html>
        <? Query(1)?> 
        <? Query(2)?>
    </html>
    Dove function contiene la funzione Query che ritorna un valore da una connessione pconnect.
    Se apro questa pagina ho una sola connessione.
    Saltuariamente se faccio il refresh della pagina si apre una nuova connessione.
    Più premo velocemente il tasto F5 più è probabile che si creino nuove connessioni.

    Cosa sbaglio? E' normale che si comporti così?

  4. #4
    quelle impostazioni che hai messo tu nel php.ini, probabilmente si riferiscono a mysql...ma tu usi oracle...
    Può essere?


  5. #5
    Ciao,
    no no c'è proprio una sezione apposita nel file php.ini

    codice:
    [OCI8]
    ; Connection: Enables privileged connections using external
    ; credentials (OCI_SYSOPER, OCI_SYSDBA)
    ; http://php.net/oci8.privileged-connect
    ;oci8.privileged_connect = Off
    
    ; Connection: The maximum number of persistent OCI8 connections per
    ; process. Using -1 means no limit.
    ; http://php.net/oci8.max-persistent
    ;oci8.max_persistent = -1
    oci8.max_persistent = 1
    
    ; Connection: The maximum number of seconds a process is allowed to
    ; maintain an idle persistent connection. Using -1 means idle
    ; persistent connections will be maintained forever.
    ; http://php.net/oci8.persistent-timeout
    oci8.persistent_timeout = 1500
    
    ; Connection: The number of seconds that must pass before issuing a
    ; ping during oci_pconnect() to check the connection validity. When
    ; set to 0, each oci_pconnect() will cause a ping. Using -1 disables
    ; pings completely.
    ; http://php.net/oci8.ping-interval
    ;oci8.ping_interval = 60
    
    ; Connection: Set this to a user chosen connection class to be used
    ; for all pooled server requests with Oracle 11g Database Resident
    ; Connection Pooling (DRCP).  To use DRCP, this value should be set to
    ; the same string for all web servers running the same application,
    ; the database pool must be configured, and the connection string must
    ; specify to use a pooled server.
    ;oci8.connection_class =
    oci8.connection_class = MYPHPAPP
    
    ; High Availability: Using On lets PHP receive Fast Application
    ; Notification (FAN) events generated when a database node fails. The
    ; database must also be configured to post FAN events.
    ;oci8.events = Off
    
    ; Tuning: This option enables statement caching, and specifies how
    ; many statements to cache. Using 0 disables statement caching.
    ; http://php.net/oci8.statement-cache-size
    ;oci8.statement_cache_size = 20
    
    ; Tuning: Enables statement prefetching and sets the default number of
    ; rows that will be fetched automatically after statement execution.
    ; http://php.net/oci8.default-prefetch
    ;oci8.default_prefetch = 100
    
    ; Compatibility. Using On means oci_close() will not close
    ; oci_connect() and oci_new_connect() connections.
    ; http://php.net/oci8.old-oci-close-semantics
    ;oci8.old_oci_close_semantics = Off
    oci8.old_oci_close_semantics = On
    Adesso sto cercando di usare le connect normali che vengono gestite bene.
    Si chiudono sempre ma ne risente la velocità.

    A questo punto ho due possibilità:
    1 - incompatibiltà tra le versioni dei programmi che sto usando.
    2 - le pconnect non funzionano bene lato php per dll oci

    provare ad esempio:
    Codice PHP:
    <?php
         $GLOBALS
    ['uname'] = 'user';
        
    $GLOBALS['pwd'] = 'password';
        
    $GLOBALS['db']='192.168.18.101/XE';
        
    $GLOBALS['table'] = 'nome_tabella';

        function 
    do_query($c$query)
        {
            
    $s oci_parse($c$query);
            
    oci_execute($sOCI_DEFAULT);
            
    oci_fetch_all($s$res);
            echo 
    "<pre>";
            
    var_dump($res);  // PHP debugging function for displaying output
            
    echo "</pre>";
        }

    try
    {
     
    $GLOBALS['conn'] = oci_pconnect($GLOBALS['uname'], $GLOBALS['pwd'],$GLOBALS['db']);
     
    //$s = oci_parse($GLOBALS['conn'], "insert into ".$GLOBALS['table']." values ('" . date('j:M:y') . "','test')");
      //oci_execute($s, OCI_DEFAULT);   // does not commit
                
     
    $GLOBALS['conn'] = oci_pconnect($GLOBALS['uname'], $GLOBALS['pwd'],$GLOBALS['db']);
     
    do_query($GLOBALS['conn'], "select * from ".$GLOBALS['table']." where rownum = 1");
                
      
    $GLOBALS['conn'] = oci_pconnect($GLOBALS['uname'], $GLOBALS['pwd'],$GLOBALS['db']);
      
    do_query($GLOBALS['conn'], "select * from ".$GLOBALS['table']." where rownum = 1");

    catch (
    Exception $e) {
       echo 
    'Caught exception: ',  $e->getMessage(), "\n";
    }

    ?>
    Se eseguo questo codice una volta... 1 connessione che rimane attiva
    Se faccio F5 ogni secondo... aggiunge una connessione ogni tanto
    Se tengo premuto F5.. aumentano le connessioni vertiginosamente

    E' come se PHP mantenesse un tempo minimo prima di rilasciare la connessione usata.

    Cosa ne pensate?

    Grazie a tutti

  6. #6
    A occhio...oci8.max_persistent = 1
    Gli dici che può avere massimo una connessione persistente...

    Inoltre oci8.connection_class = MYPHPAPP
    Sicuro che stai usando i pool di connessione? Mi sembra che tu abbia solo un web server...


  7. #7
    Si hai ragione ne posso impostare anche solo 1 ma quando ha bisogno se ne fa quante ne vuole.

    Se metto ad esempio 15 connessioni.. vedo che senza fare refresh a mano.. apache e php riescono a mantenere costante il numero.

    Appena inizio a fare dei refresh manuali si creano delle connessioni in + che non si chiudono.

    Ho messo il suddetto parametro a 0 così mi si chiudono tutte subito.

    Per quanto riguarda il pool di applicazioni ho fatto la prova con un oracle 10g standard con pool attivo ma non mi sembra che rispecchi comunque il numero impostato.

  8. #8
    Di Oracle non sono espertissimo, ma per ciò che riguarda i pool, come dice anche il commento del parametro relativo, viene utilizzato quando usi i pool su server multipli, quindi nel tuo caso, ce usi un solo apache, potrebbe non funzioare come ci si aspetta.

    Riguardo il numero di connessioni persistenti massime, credo che il comportamento sia giusto, ovvero ovviamente php deve aprire una nuova connessione se fai un refresh manuale, ma questa non è una persistente (perchè il limite è 1). Il fatto che non si chiuda è dovuta al tempo di ping (60 secondi) credo.
    Test.

    Imposta a 1 il numero di connessioni permanenti e apri una pagina. Controlla dal db manager il numero di connessioni. Attendi un minuto e mezzo senza fare nulla e ricontrolla il numero di connessioni. Dovrebbe essere ancora 1 (quella persistente).
    Fai un refresh della pagina e controlla il numero di connessioni. Dovrebbero essere 2 (una persistente e una "normale"). Attendi un minuto e mezzo e ricontrolla il numero di connessioni. Dovrebbero essere tornate 1 (quella persistente).

    Come detto è tutto un "dovrebbe" perchè non ho mai analizzato queste situazioni, sto semplicemente andando a logica.


  9. #9
    Pure io non sono esperto di Oracle (anzi, per nulla), ma dall'articolo

    http://php.net/manual/en/oci8.connection.php

    sembrerebbe che il ppol lo devi far partire anche nel db (vedi sezione DRCP Connection Pooling)
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  10. #10
    Ciao :-)
    avevo letto questo documento (ed altri) che descrivevano come abilitare il pool di oracle.

    Vedi apposita sezione del manuale ufficiale oracle
    http://www.oracle.com/technetwork/to...al-098250.html

    Infatti ho provato ad abilitarlo in una installazione di oracle 11g standard.
    Ho seguito i passi della guida e riesco a fare la connessione POOLED. Senza attivare il pool non riesce la connessione pooled quindi sono certo che era attiva e funzionante.

    Il funzionamento delle connessioni persistenti era comunque simile a quello che si ottiene senza pool. Ovvero quando le richieste sono troppe le connessioni vengono comunque create.
    E' come se di default "php + apache fossero generosi" se ci sono tante richieste non bloccano ma danno le connessioni e quelle in più sono da chiudere manualmente. (lato database in quanto lato php non si chiudono più se non buttando giù apache!!!)

    Cmq credo che non sia proprio obbligatorio (ho fatto un post apposito nella sezione database) che ci sia il pool delle connessioni lato database.

    Qualcuno sa se è obbligatoria la presenza del pool lato database per gestire le persistenti?


    -- Sto facendo il test consigliato nel post precedente da Dascos
    -- Controllare i socket aperti verso oracle (porta 1521) da apache e controllare le sessioni aperte da query oracle è equivalente. (nelle innumerevoli prove eseguite sono sempre stati uguali in numero ed in stato).

    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.