Login pro

Ciao a tutti!

mi sono appena iscritto perché voglio imparare al meglio possibile e ho bisogno di confrontarmi con programmatori veri e propri.

Ho realizzato qualche tempo fa un sistema di login basilare. Normalmente si comporta in modo dignitoso, ma ogni tanto mi butta fuori dalla sessione e non mi è ancora del tutto chiaro il perché. Ma questo è il passato.

Ora il mio interesse è realizzare un nuovo sistema di login più complesso (account con permessi differenziati), più sicuro (cercare per quanto possibile di evitare accessi di malintenzionati), più performante (magari usando memcache).

Leggendo sul web si trovano un sacco di articoli qua e là che spiegano varie cose, ma spesso si limitano ad illustrare il singolo aspetto di cui parlano. Io vorrei a questo punto capire meglio perché a volte leggo che sia meglio fare una scelta piuttosto che un altra.

Prima domanda.

Il meccanismo delle sessioni di default scrive i dati di sessione in file temporanei in una directory apposita.

Ciò si può riprogrammare in modo che i dati vengano scritti in un database.

Ho trovato spesso articoli che spiegano come usare le sessioni classiche e spesso articoli che spiegano come implementare il meccanismo delle sessioni in mysql, ma quali sono i casi per cui è da preferire un sistema all'altro?

Quando ho migliaia di accessi conviene il db o i file? Per questioni di performance o di scalabilità? o di che altro?

Provare ad implementare un meccanismo di sessioni basato su memcache porta effettivi vantaggi dal punto di vista prestazionale? E' un sistema stabile e sicuro?

Grazie per la pazienza di aver letto tutta questa lunga intro!

Ciauz   :)

inviato 5 anni fa
elaidon
modificato 5 anni fa
X 0 X

Ci vorrebbe una giornata per rispondere in maniera approfondita a tutte queste domande!

Utilizzare il database per memorizzare le sessioni è utile solo quando hai bisogno di un maggiore controllo sull'intero sistema di gestione delle sessioni e quando vuoi ottenere maggiori informazioni sugli utenti che attualmente stanno navigando il tuo sito. Queste esigenze prima o poi arrivano.... ad esempio, come fai a sapere quali e quanti sono gli utenti collegati al tuo sito in un certo momento? Con le sessioni su DB è molto facile scoprirlo.

Inevitabilemente le sessioni su DB sono meno performanti delle sessioni su file ma i benefici per un sito "serio" sono irrinunciabili. Dalla mia esperienza comungue le sessioni su DB non sono mai un problema in termini di performance, fidati!

memcache va usato solamente quando hai una batteria di server in bilanciamento di carico e vuoi condividere la sessione tra le diverse macchine. Ovviamente tu non sei in queste condizioni...

Ho provato altri sistemi di cache in memoria per gestire le sessioni ma nessuno mi ha dato dei risultati prestazionali tali da convincermi ad abbandonare MySQL per le sessioni. Ripeto, le sessioni su DB non sono mai state un problema.

 :bye:

risposto 5 anni fa
Gianni Tomasicchio
X 0 X

Intanto grazie! :)

E' molto interessante la tua risposta. Io come sistema di cache ho al momento apc sul server, ma mi incasina proprio la gestione delle sessioni e anche qui non mi è chiaro perché. Nel senso che se su un sito ho il sistema di login base che dicevo di aver fatto senza apc funziona mentre se attivo apc comincia a darmi dei problemi.

Comunque è chiarissimo quanto è facile maneggiare i dati utenti con un db. Molto interessante è la tua esperienza. In pratica mi dici che il vantaggio di flessibilità/facilità nel raccogliere e gestire i dati utenti è talmente evidente da non poterci rinunciare in favore di un qualcosa che nella migliore delle ipotesi aumenterebbe le prestazioni in modo trascurabile. Ok.

Quindi per il mio nuovo sistema di login (ora sono nella fase in cui comincio a immaginare come progettarlo) è preferibile puntare su db.

Domanda. Nel sistema attuale ho realizzato questa classe:

<?

   //-------------------------------------------------------------------------------------------------------
   // Manager_Connection questa classe serve a gestire la connessione con il server
   //-------------------------------------------------------------------------------------------------------   
   class Manager_Connection
   {
      private $Server;
      private $Username;
      private $Password;
      private $Database;
      private $db_connection;

      // Costruttore della classe a cui passare i dati di accesso al database
      function __construct($in_Server, $in_Username, $in_Password, $in_Database)
      {
         // imposta le variabili di sistema
         $this->Server = $in_Server;
         $this->Username = $in_Username;
         $this->Password = $in_Password;
         $this->Database = $in_Database;
         // avvia il collegamento al server
         $this->StartDatabaseConnection();
      }
      
      // distruttore della classe che chiude la connessione
      function __destruct()
      {
         $this->CloseDatabaseConnection();
         unset($this->Server);
         unset($this->Username);
         unset($this->Password);
         unset($this->Database);         
      }
      
      // Questa funzione serve a settare le impostazioni di accesso del server
      public function SetConnectionInfo($in_Server, $in_Username, $in_Password, $in_Database)
      {
         $this->__construct($in_Server, $in_Username, $in_Password, $in_Database);
      }      
         
      // Questa funzione avvia la connessione al server         
      public function StartDatabaseConnection()
      {
         /* Controllo se la connessione sia già aperta o meno, se non è aperta, la apro */
         if ($this->db_connection === NULL)
         {
            /* Avvio la connessione al database */
            $this->db_connection = @new mysqli($this->Server, $this->Username, $this->Password, $this->Database);   
            /* Verifico che non ci siano errori durante la connessione */
            if (mysqli_connect_errno() !== 0)
            {
               /* In caso di malfunzionamento manda alla pagina di errore */
               // echo "<script>location.href = 'database_error.php';</script>";
            }
         }   
      }

      // Questa funzione restituisce la connessione attuale
      public function GetDatabaseConnection()
      {
         if ($this->db_connection !== NULL)
         {
            return $this->db_connection;
         }
         /* In caso di malfunzionamento manda alla pagina di errore */
         return -1;
      }

      // Questa funzione chiude la connessione al database
      public function CloseDatabaseConnection()
      {
         if ($this->db_connection !== NULL)
         {
            @$this->db_connection->close();
            $this->db_connection = NULL;
         }
      }   
                  
   }


?>

Quando la includo in php la utilizzo per creare una connessione al db e poi la passo alle altre varie classi che utilizzo per interrogare mysql.

Il mio tentativo era in sostanza minimizzare il numero di connessioni al db. Questo perchè immagino che la cosa sia più efficiente. Ma è realmente così? E' una logica corretta?

Tra l'altro ultimamente leggevo che per ottimizzare le prestazioni dell'interprete php dovrei evitate l'operatore @ che a quanto pare è lento.

In generale ho commesso errori in questo codice? Cose che un esperto farebbe in modo diverso?

Grazie di nuovo!

risposto 5 anni fa
elaidon
X 0 X

Il codice mi sembra corretto però se cerchi risultati professionali e vuoi rimanere produttivo (ridurre il tempo per realizzare le diverse funzioni) ti consiglio di utilizzare un framework. Sono collaudati e sicuri, trovi tutte le funzioni di base già realizzate e ti concentri solo sulle pecarità del tuo sistema.

Di certo aggiungono pesantezza al sistema ma ti assicuro che finirai per aggiungerla anche tu se vuoi realizzare un sistema "serio".

 :bye:

P.S.: io non uso quasi mai la @ perché metto sempre in piedi un sistema personalizzato di gestione degli errori e delle eccezioni

risposto 5 anni fa
Gianni Tomasicchio
X 0 X

si, voglio una cosa molto professionale per sviluppare un mio progetto enorme. Per framework intendi ambienti tipo zend?

E' tanto che in effetti penso a quale sia il modo migliore di procedere e che tengo anche in considerazione l'opzione framework...però da quando ho iniziato a programmare a 10 anni...mi è sempre interessato capire il perché è meglio fare una cosa piuttosto che un'altra e il come. Ora io posso utilizzare un ambiente già bello e pronto ma non ne sentirei il pieno controllo. Non mi basta usare una cosa, voglio capirne la logica...non voglio dipendere da altri. Esempio lampante è il tanto di moda Joomla. Per carità è stato calcolato che per pagare tutte le ore di lavoro impiegate a realizzarlo ci vorrebbero 15 milioni di euro. Sarà stabile, sicuro, ben progettato, ben supportato. Ma tutto ciò vale per l'oggi. E fra 3 anni? Io voglio sviluppare una base mia sulla quale lavorare  migliorarla sempre anche e solo per mia pura passione e conoscenza personale.

Ciauz!

risposto 5 anni fa
elaidon
X 0 X

Capisco perfettamente il tuo timore ma un framework PHP moderno è sufficientemente flessibile da permetterti di fare qualsiasi cosa e di farla al meglio. Ma stiamo andando fuori argomento...

risposto 5 anni fa
Gianni Tomasicchio
X 0 X

si, voglio una cosa molto professionale per sviluppare un mio progetto enorme. Per framework intendi ambienti tipo zend?

E' tanto che in effetti penso a quale sia il modo migliore di procedere e che tengo anche in considerazione l'opzione framework...però da quando ho iniziato a programmare a 10 anni...mi è sempre interessato capire il perché è meglio fare una cosa piuttosto che un'altra e il come. Ora io posso utilizzare un ambiente già bello e pronto ma non ne sentirei il pieno controllo. Non mi basta usare una cosa, voglio capirne la logica...non voglio dipendere da altri. Esempio lampante è il tanto di moda Joomla. Per carità è stato calcolato che per pagare tutte le ore di lavoro impiegate a realizzarlo ci vorrebbero 15 milioni di euro. Sarà stabile, sicuro, ben progettato, ben supportato. Ma tutto ciò vale per l'oggi. E fra 3 anni? Io voglio sviluppare una base mia sulla quale lavorare  migliorarla sempre anche e solo per mia pura passione e conoscenza personale.

Vale la stessa cosa per quello che impari facendo da te: tra 3 anni probabilmente non ti servirà più (e se ti servirà ancora, avrai sbagliato qualcosa).

Joomla non è un framework, è un CMS: un prodotto già pronto da dare in mano a un cliente che deve fare una cosa abbastanza specifica (gestire i contenuti di un sito).

Un framework invece è uno strumento che ti consente di costruire un prodotto specifico, tagliato su misura per il tuo cliente (il cliente potresti anche essere tu stesso).

E non dire che preferisci capire come funzionano le cose, perché PHP è basato su C e il C a sua volta è basato su linguaggio macchina: perché allora non studi il C o il linguaggio macchina? Avrai sempre un certo livello di astrazione nella programmazione e in questo non c'è nulla di male. D'altronde, nulla ti impedisce di usare un framework e di verificare effettivamente cosa stia facendo e come (dando per scontato che parliamo di framework open source)

risposto 5 anni fa
Massimiliano Arione
X 0 X

in effetti conosco il C ma non il linguaggio macchina.

L'inizio del tuo ragionamento però non mi trova del tutto d'accordo.

Vale la stessa cosa per quello che impari facendo da te: tra 3 anni probabilmente non ti servirà più (e se ti servirà ancora, avrai sbagliato qualcosa).

L'idea è proprio quella che sarà più facile tenerlo aggiornato alle mie specifiche esigenze se ho completamente sotto controllo il codice.

D'altro canto quello che dici è proprio il punto cruciale su cui sto ragionando. Ritengo molto improbabile che framework tipo zend non vengano più supportati per un bel pò di anni a venire, e ovviamente ancora meno probabile che linguaggi come php o asp non abbiano davanti una lunga vita.

Io in fondo mi sono posto un obiettivo di poco conto, velocizzare il lavoro mio e dei miei collaboratori in ufficio e devo sviluppare un progetto molto grosso.

Io sviluppo siti e sono abituato a svilupparli in php, mysql, jquery. Quest'ultimo a sua volta è una sorta di framework javascript.

La prima parte di ciò che voglio realizzare è una sorta di phpMyAdmin visuale che mi permette di creare database e tabelle e metterle in relazione e inoltre mi deve generare in modo semiautomatico funzioni php che estraggono dati da query sql e li restituiscono in formato json.

risposto 5 anni fa
elaidon
X 0 X

discussione a rischio chiusura... l'argomento iniziale è la realizzazione di un sistema di login

risposto 5 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda