PHP et Sessions

  • ScottG
  • Proficient
  • Proficient
  • No Avatar
  • Inscription: Juil 06, 2010
  • Messages: 260
  • Status: Online

Message Mars 6th, 2013, 9:52 am

Ok donc ce n'est pas une erreur ou une question sa a plus d'une enquête sur les autres pensées des peuples. Depuis le dernier numéro, j'ai eu qui m'a amené, ainsi plusieurs jours de forte pensée, de tâtonnements et frustration. Im commence à repenser comment Im va gérer les sessions.

Dans le passé, j'ai un fichier qui est inclu dans toutes les pages de mes projets php appelé initialize.php le rôle unique de ce fichier est de configurer la session @session_start() ; et toutes les classes qui sont nécessaires par le biais du projet comme la classe de base de données.

Ce fichier ressemble à
PHP Code: [ Select ]
<?php
 
/**
*   The initialize class starts all of the main classes and
*   sets the site up.
*
*   @Author     William Gaines <sgscott87@gmail.com>
*   @Copyright  2013-2014 indefinite Designs.
*  
*/
 
 
/***********************************/
/*  Start Session                  */
/***********************************/
 
// Start/Continue a session
@session_start();
 
 
/***********************************/
/*  Error Reporting                */
/***********************************/
 
// We want to see our errors
ini_set('display_errors', '1');
 
// Report all except notices
error_reporting(E_ALL ^ E_NOTICE);
 
 
/***********************************/
/*  Includes and Objects           */
/***********************************/
 
// Include the config
require_once('config.php');
 
// General Functions
require_once('general.php');
 
// Start our error class
require_once('class.error.php');
$err = new Error();
 
// Database Authentication File
require_once('dbauth.php');
 
// Start our database object instance (singleton)
require_once('class.db_connect.php');
$db = DBConnection::instance();
 
?>
 
  1. <?php
  2.  
  3. /**
  4. *   The initialize class starts all of the main classes and
  5. *   sets the site up.
  6. *
  7. *   @Author     William Gaines <sgscott87@gmail.com>
  8. *   @Copyright  2013-2014 indefinite Designs.
  9. *  
  10. */
  11.  
  12.  
  13. /***********************************/
  14. /*  Start Session                  */
  15. /***********************************/
  16.  
  17. // Start/Continue a session
  18. @session_start();
  19.  
  20.  
  21. /***********************************/
  22. /*  Error Reporting                */
  23. /***********************************/
  24.  
  25. // We want to see our errors
  26. ini_set('display_errors', '1');
  27.  
  28. // Report all except notices
  29. error_reporting(E_ALL ^ E_NOTICE);
  30.  
  31.  
  32. /***********************************/
  33. /*  Includes and Objects           */
  34. /***********************************/
  35.  
  36. // Include the config
  37. require_once('config.php');
  38.  
  39. // General Functions
  40. require_once('general.php');
  41.  
  42. // Start our error class
  43. require_once('class.error.php');
  44. $err = new Error();
  45.  
  46. // Database Authentication File
  47. require_once('dbauth.php');
  48.  
  49. // Start our database object instance (singleton)
  50. require_once('class.db_connect.php');
  51. $db = DBConnection::instance();
  52.  
  53. ?>
  54.  


Un peu d'aperçu avec ma dernière question, j'ai eu était avec ImageMagick(IM) ( programmation-forum/imagemagick-et-windows-t108116.html pour ceux qui veulent connaître les détails), mais pour dire les choses simplement j'ai chassé vers le bas un problème et l'appel à IM était en effet l'origine du problème se produise alors que je courais à ma queue en essayant de trouver une fix/alternative pour popen() . Il n'était pas jusqu'à ce que j'ai vraiment déchiré le script à bare bones, j'ai découvert la question et qu'étant que depuis que j'ai eu des séances quand l'appel à IM a été effectuée si la page est actualisée ou appelée à nouveau le php script serait essayer de configurer les sessions à nouveau, mais il pourrait pas parce que les sessions ont été utilisées, résultant en une session verrouiller ceci à son tour aurait blocage IM. Fermer les sessions php avant l'appel IM et ensuite leur réouverture après que l'appel était terminé résolu ce problème.

En lisant l'article ci-dessus sur PHP Session se verrouille, m'a amené à repenser comment traiter les séances. Je pense à la création d'une classe de Session pour gérer les sessions. L'idée étant que le fichier que php écrit info session à sera toujours fermé sauf si vous avez besoin ajouter ou modifier des séances. Une fois que les sessions ont été mis en place qu'ils peuvent être fermés, et vous serez toujours en mesure d'accéder à la $_SESSION variable.

Faites le test suivant
S1.php ce fichier définit une variable de session personnalisé
PHP Code: [ Select ]
<?php
@session_start();
$_SESSION['my_session'] = 'Yay! It works';
session_write_close();
?>
<br />
<a href="s2.php">Next</a>
 
  1. <?php
  2. @session_start();
  3. $_SESSION['my_session'] = 'Yay! It works';
  4. session_write_close();
  5. ?>
  6. <br />
  7. <a href="s2.php">Next</a>
  8.  


S2.php ce fichier représente une tentative mal depuis la session n'a pas étée continué résultant dans aucune info Session
PHP Code: [ Select ]
<?php
echo (!empty($_SESSION['my_session'])) ? $_SESSION['my_session'] : 'Boo! It failed! You Suck Sessions!';
?>
<br />
<a href="s3.php">Next</a>
 
  1. <?php
  2. echo (!empty($_SESSION['my_session'])) ? $_SESSION['my_session'] : 'Boo! It failed! You Suck Sessions!';
  3. ?>
  4. <br />
  5. <a href="s3.php">Next</a>
  6.  


S3.php ce fichier démarre/continue la session et puis se ferme immédiatement le fichier de session qui nous donne accès à la $_SESSION variable.
PHP Code: [ Select ]
<?php
@session_start(); session_write_close();
echo (!empty($_SESSION['my_session'])) ? $_SESSION['my_session'] : 'Boo! It failed! You Suck Sessions!';
?>
<br />
FIN
 
  1. <?php
  2. @session_start(); session_write_close();
  3. echo (!empty($_SESSION['my_session'])) ? $_SESSION['my_session'] : 'Boo! It failed! You Suck Sessions!';
  4. ?>
  5. <br />
  6. FIN
  7.  


C'est donc l'idée de base derrière ma classe session. Lorsque le constructeur est appelé il commence et se termine la session immédiatement en vous donnant la $_SESSION variable. une chose importante à noter est que vous êtes pas en mesure de définir les autres sessions sauf si vous démarrez la session à nouveau. Voir l'exemple ci-dessous

PHP Code: [ Select ]
<?php
@session_start();
$_SESSION['my_session'] = 'Yay! It works';
session_write_close();
 
$_SESSION['bad_session'] = 'This will not work!';
 
@session_start();
$_SESSION['good_session'] = 'Yay! Another good session!';
session_write_close();
 
?>
<pre>
<?php
var_dump($_SESSION);
?>
</pre>
<br />
FIN
 
  1. <?php
  2. @session_start();
  3. $_SESSION['my_session'] = 'Yay! It works';
  4. session_write_close();
  5.  
  6. $_SESSION['bad_session'] = 'This will not work!';
  7.  
  8. @session_start();
  9. $_SESSION['good_session'] = 'Yay! Another good session!';
  10. session_write_close();
  11.  
  12. ?>
  13. <pre>
  14. <?php
  15. var_dump($_SESSION);
  16. ?>
  17. </pre>
  18. <br />
  19. FIN
  20.  


La classe j'ai rendrait aussi pourrez donc ajouter et modifier les infos de session ainsi donc au lieu de faire $_SESSION ["index"] = "content" ; vous devriez faire quelque chose comme $sess -&gt; Modifier ("index", "contenu"); .

Des idées ou des préoccupations ? Que pensez-vous de cette approche aux Sessions ? Puisqu'il s'agit d'une classe très simple, qu'il sera probablement achevée avant que quiconque lit ce post lol.
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Mars 6th, 2013, 9:52 am

  • ScottG
  • Proficient
  • Proficient
  • No Avatar
  • Inscription: Juil 06, 2010
  • Messages: 260
  • Status: Online

Message Mars 6th, 2013, 10:40 am

Comme indiqué, j'ai ont terminé la classe et le suis tester actuellement
  • Bigwebmaster
  • Site Admin
  • Site Admin
  • Avatar de l’utilisateur
  • Inscription: Déc 20, 2002
  • Messages: 8922
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Offline

Message Mars 7th, 2013, 11:38 am

Avez-vous considéré complètement mise au rebut à l'aide du gestionnaire de sessions de base de PHP et l'écrit votre propre afin que vous pouvez adapter à votre exact besoin et éviter les écueils que cela semble vous causer ?
Ozzu Hosting - Want your website on a fast server like Ozzu?
  • ScottG
  • Proficient
  • Proficient
  • No Avatar
  • Inscription: Juil 06, 2010
  • Messages: 260
  • Status: Online

Message Mars 12th, 2013, 8:12 am

J'ai pensé à faire ça, mais il n'y aurait beaucoup plus de traitement va sur base de données ou des fichiers physiques à gérer. Plus mes problèmes ont été résolus en fermant la session quand pas en service qui, par le lien dans l'autre poteau, a confirmé le problème.

Voici la classe que j'ai faite pour gérer la session et à certains usages
classe session
PHP Code: [ Select ]
<?php
/**
*   This file is the user class. It is used to add edit
*  delete login or anything else that involes the user.
*
*   @Author     William Gaines <sgscott87@gmail.com>
*   @Copyright  2013-2015
*  
*/
 
 
/***********************************/
/*  Initialize                     */
/***********************************/
 
class Session {
   
   // Start up the Session
   function __construct() {
     
      // Setup the session
      $this->start();
      $this->stop();
   
   }
   
   // This function will start the session
   public function start() {
     
      // Start/Continue the session
      (headers_sent()) ? @session_start() : session_start();
     
   }
   
   // This function will stop the session
   public function stop() {
     
      // Write the close of the seesion file and unlock it
      session_write_close();
     
   }
   
   /**
   * Adds/Edits Session info
   *
   * @param string/array $index This variable can be used as a string for the index in the session variable or as an associative array for the index and content
   * @param string/boolean $content This is the content that will be added to the index in the session. This will be false if the $index is an array.
   * @return boolean
   */
   public function modify($index, $content = false) {
     
      // Start Session
      $this->start();
     
      // Check to see if the $index is an array
      if(is_array($index)) {
         
         // Loop the index array
         foreach($index as $key => $value) {
           
            // Add to the Session
            $_SESSION[$key] = $value;
           
         }
         
      } else {
         
         // Add to the Session
         $_SESSION[$index] = $content;
         
      }
     
      // Stop Session
      $this->stop();
     
      // Kick out
      return true;
     
   }
   
   /**
   * Removes session info
   *
   * @param string/array $index This variable can be used as a string for the index in the session variable or as an array of indexs
   * @return boolean
   */
   public function kill($index) {
     
      // Start Session
      $this->start();
   
      // Check to see if the $index is an array
      if(is_array($index)) {
         
         // Loop the index array
         foreach($index as $key => $value) {
           
            // Add to the Session
            unset($_SESSION[$value]);
           
         }
         
      } else {
         
         // Add to the Session
         unset($_SESSION[$index]);
         
      }
     
      // Stop Session
      $this->stop();
     
      // Kick out
      return true;
     
   }
   
   /**
   * Removes ALL session info and reset everything
   *
   * Note: This will cause an error if there is already output on the page before calling the destroy
   * @return boolean
   */
   public function destroy() {
   
      // Kill the variables
      $this->kill($_SESSION);
     
      // Start Session
      $this->start();
     
      // Unset the session
      session_unset();
     
      // Check for headers sent and spit out a better error if they are. This is so that there is only one error that better describes what is going on
      // this will suppress the errors if the headers are sent and spit out nice warnings
      if(headers_sent($filename, $linenum)) {
         
         // Clear cookies
         @setcookie(session_name(),'',0,'/');
         
         // Reset the session id
         @session_regenerate_id();
         
         // Spit out error
         echo "<br /><strong>Warning:</strong> Your session may not be destroyed. You are receiving this warning due to the headers already being sent. This could occur due to output already on the page before the destroy function was called in <strong>$filename</strong> on line <strong>$linenum</strong><br />\n";
         
      } else {
         
         // Clear cookies
         setcookie(session_name(),'',0,'/');
         
         // Reset the session id
         session_regenerate_id();
         
      }
     
      // Stop Session
      $this->stop();
     
      // Kick out
      return true;
     
   }
 
}
 
?>
 
  1. <?php
  2. /**
  3. *   This file is the user class. It is used to add edit
  4. *  delete login or anything else that involes the user.
  5. *
  6. *   @Author     William Gaines <sgscott87@gmail.com>
  7. *   @Copyright  2013-2015
  8. *  
  9. */
  10.  
  11.  
  12. /***********************************/
  13. /*  Initialize                     */
  14. /***********************************/
  15.  
  16. class Session {
  17.    
  18.    // Start up the Session
  19.    function __construct() {
  20.      
  21.       // Setup the session
  22.       $this->start();
  23.       $this->stop();
  24.    
  25.    }
  26.    
  27.    // This function will start the session
  28.    public function start() {
  29.      
  30.       // Start/Continue the session
  31.       (headers_sent()) ? @session_start() : session_start();
  32.      
  33.    }
  34.    
  35.    // This function will stop the session
  36.    public function stop() {
  37.      
  38.       // Write the close of the seesion file and unlock it
  39.       session_write_close();
  40.      
  41.    }
  42.    
  43.    /**
  44.    * Adds/Edits Session info
  45.    *
  46.    * @param string/array $index This variable can be used as a string for the index in the session variable or as an associative array for the index and content
  47.    * @param string/boolean $content This is the content that will be added to the index in the session. This will be false if the $index is an array.
  48.    * @return boolean
  49.    */
  50.    public function modify($index, $content = false) {
  51.      
  52.       // Start Session
  53.       $this->start();
  54.      
  55.       // Check to see if the $index is an array
  56.       if(is_array($index)) {
  57.          
  58.          // Loop the index array
  59.          foreach($index as $key => $value) {
  60.            
  61.             // Add to the Session
  62.             $_SESSION[$key] = $value;
  63.            
  64.          }
  65.          
  66.       } else {
  67.          
  68.          // Add to the Session
  69.          $_SESSION[$index] = $content;
  70.          
  71.       }
  72.      
  73.       // Stop Session
  74.       $this->stop();
  75.      
  76.       // Kick out
  77.       return true;
  78.      
  79.    }
  80.    
  81.    /**
  82.    * Removes session info
  83.    *
  84.    * @param string/array $index This variable can be used as a string for the index in the session variable or as an array of indexs
  85.    * @return boolean
  86.    */
  87.    public function kill($index) {
  88.      
  89.       // Start Session
  90.       $this->start();
  91.    
  92.       // Check to see if the $index is an array
  93.       if(is_array($index)) {
  94.          
  95.          // Loop the index array
  96.          foreach($index as $key => $value) {
  97.            
  98.             // Add to the Session
  99.             unset($_SESSION[$value]);
  100.            
  101.          }
  102.          
  103.       } else {
  104.          
  105.          // Add to the Session
  106.          unset($_SESSION[$index]);
  107.          
  108.       }
  109.      
  110.       // Stop Session
  111.       $this->stop();
  112.      
  113.       // Kick out
  114.       return true;
  115.      
  116.    }
  117.    
  118.    /**
  119.    * Removes ALL session info and reset everything
  120.    *
  121.    * Note: This will cause an error if there is already output on the page before calling the destroy
  122.    * @return boolean
  123.    */
  124.    public function destroy() {
  125.    
  126.       // Kill the variables
  127.       $this->kill($_SESSION);
  128.      
  129.       // Start Session
  130.       $this->start();
  131.      
  132.       // Unset the session
  133.       session_unset();
  134.      
  135.       // Check for headers sent and spit out a better error if they are. This is so that there is only one error that better describes what is going on
  136.       // this will suppress the errors if the headers are sent and spit out nice warnings
  137.       if(headers_sent($filename, $linenum)) {
  138.          
  139.          // Clear cookies
  140.          @setcookie(session_name(),'',0,'/');
  141.          
  142.          // Reset the session id
  143.          @session_regenerate_id();
  144.          
  145.          // Spit out error
  146.          echo "<br /><strong>Warning:</strong> Your session may not be destroyed. You are receiving this warning due to the headers already being sent. This could occur due to output already on the page before the destroy function was called in <strong>$filename</strong> on line <strong>$linenum</strong><br />\n";
  147.          
  148.       } else {
  149.          
  150.          // Clear cookies
  151.          setcookie(session_name(),'',0,'/');
  152.          
  153.          // Reset the session id
  154.          session_regenerate_id();
  155.          
  156.       }
  157.      
  158.       // Stop Session
  159.       $this->stop();
  160.      
  161.       // Kick out
  162.       return true;
  163.      
  164.    }
  165.  
  166. }
  167.  
  168. ?>
  169.  


test 1
PHP Code: [ Select ]
<?php
 
require_once('cms/classes/class.session.php');
$session = new Session();
 
$session->modify('first_test', 'Yay! It works');
 
// Make an array for sessions
$test_array = array(
            "first_test" => '1 I think you\'ve won!',
            "second_test" => '2 you belong in a zoo!',
            "third_test" => '3 your just like me!',
            "forth_test" => '4 get off the floor!',
            "fith_test" => '5 ... Umm your starting to jive?',
            "sixth_test" => '6 pickup those sticks!'            
            );
 
$session->modify($test_array);
 
?>
<pre>
<?php
var_dump($_SESSION);
?>
</pre>
<br />
<a href="s2.php">Next</a>
 
  1. <?php
  2.  
  3. require_once('cms/classes/class.session.php');
  4. $session = new Session();
  5.  
  6. $session->modify('first_test', 'Yay! It works');
  7.  
  8. // Make an array for sessions
  9. $test_array = array(
  10.             "first_test" => '1 I think you\'ve won!',
  11.             "second_test" => '2 you belong in a zoo!',
  12.             "third_test" => '3 your just like me!',
  13.             "forth_test" => '4 get off the floor!',
  14.             "fith_test" => '5 ... Umm your starting to jive?',
  15.             "sixth_test" => '6 pickup those sticks!'            
  16.             );
  17.  
  18. $session->modify($test_array);
  19.  
  20. ?>
  21. <pre>
  22. <?php
  23. var_dump($_SESSION);
  24. ?>
  25. </pre>
  26. <br />
  27. <a href="s2.php">Next</a>
  28.  


test 2
PHP Code: [ Select ]
 
<?php
 
require_once('cms/classes/class.session.php');
$session = new Session();
 
?>
<pre>
<?php
var_dump($_SESSION);
?>
</pre>
<?php
 
echo 'What about removing Sessions?';
 
$session->kill('second_test');
 
$session->kill(array('forth_test', 'fith_test'));
?>
<pre>
<?php
var_dump($_SESSION);
?>
</pre>
<br />
<a href="s2.php">Refresh</a> <a href="s3.php">Next</a>
 
  1.  
  2. <?php
  3.  
  4. require_once('cms/classes/class.session.php');
  5. $session = new Session();
  6.  
  7. ?>
  8. <pre>
  9. <?php
  10. var_dump($_SESSION);
  11. ?>
  12. </pre>
  13. <?php
  14.  
  15. echo 'What about removing Sessions?';
  16.  
  17. $session->kill('second_test');
  18.  
  19. $session->kill(array('forth_test', 'fith_test'));
  20. ?>
  21. <pre>
  22. <?php
  23. var_dump($_SESSION);
  24. ?>
  25. </pre>
  26. <br />
  27. <a href="s2.php">Refresh</a> <a href="s3.php">Next</a>
  28.  


test 3
PHP Code: [ Select ]
<?php
 
require_once('cms/classes/class.session.php');
$session = new Session();
 
// Please Note that before trying to destroy the sessions you CANNOT have any output before this call.
// This call is to destroy and rest the session info. This would happen mostly on a logout page.
$session->destroy();
echo 'What about Destroying Sessions?';
 
?>
<pre>
<?php
var_dump($_SESSION);
?>
</pre>
<br />
<a href="s4.php">Next</a>
 
  1. <?php
  2.  
  3. require_once('cms/classes/class.session.php');
  4. $session = new Session();
  5.  
  6. // Please Note that before trying to destroy the sessions you CANNOT have any output before this call.
  7. // This call is to destroy and rest the session info. This would happen mostly on a logout page.
  8. $session->destroy();
  9. echo 'What about Destroying Sessions?';
  10.  
  11. ?>
  12. <pre>
  13. <?php
  14. var_dump($_SESSION);
  15. ?>
  16. </pre>
  17. <br />
  18. <a href="s4.php">Next</a>
  19.  


test 4
PHP Code: [ Select ]
<?php
 
require_once('cms/classes/class.session.php');
$session = new Session();
 
?>
 
So you need to do something with the sessions that's not in this class?
<br />
<?php
$session->start();
// Do your stuff here
$session->stop();
?>
<br />
<br />
FIN
 
  1. <?php
  2.  
  3. require_once('cms/classes/class.session.php');
  4. $session = new Session();
  5.  
  6. ?>
  7.  
  8. So you need to do something with the sessions that's not in this class?
  9. <br />
  10. <?php
  11. $session->start();
  12. // Do your stuff here
  13. $session->stop();
  14. ?>
  15. <br />
  16. <br />
  17. FIN
  18.  

Afficher de l'information

  • Total des messages de ce sujet: 4 messages
  • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 197 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC