PHP y sesiones

  • ScottG
  • Proficient
  • Proficient
  • No Avatar
  • Registrado: Jul 06, 2010
  • Mensajes: 263
  • Status: Offline

Nota Marzo 6th, 2013, 9:52 am

OK así que esto no es un error o problema su más de una investigación sobre el pensamiento de otro pueblos. Desde la última edición tuve me causó, así varios días de pesado pensó, ensayo y error y la frustración. Im a partir a repensar cómo Im que va a manejar sesiones.

En el pasado, tengo un archivo que se incluye en cada página de mis proyectos de php llamada initialize.php el papel único de este archivo es configurar la sesión @session_start(); y las clases que se necesitan a través del proyecto como la clase de base de datos.

Ese archivo parece
PHP Código: [ 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 poco de resumen con mi última edición que tuve fue con ImageMagick(IM) ( programación-Foro/imagemagick-y-windows-t108116.html para aquellos que quieren conocer los detalles), pero para decirlo simplemente yo perseguido por un problema y la llamada a IM hecho causaba el tema a pasar por lo que estaba persiguiendo mi cola tratando de encontrar una solución/alternativa para popen() . No fue hasta que arrancaron realmente el script bare bones descubrí la cuestión y eso que tuve sesiones cuando se hizo la llamada a IM si la página se actualiza o se llama otra vez el php script intentaría configurar las sesiones otra vez pero podría no porque las sesiones estaban en uso, resultando en una sesión de trabar esto a su vez le bloqueo IM. Cierre de las sesiones de php antes de la llamada IM y luego les reapertura después de que terminó la llamada resuelven este problema.

Al leer el artículo sobre cerraduras de sesión de PHP, me ha traído a repensar cómo manejar las sesiones. Estoy pensando en crear una clase de sesión para manejar las sesiones. La idea es que el archivo que php escribe información de sesión para siempre ser cerrado a menos que necesite agregar o cambiar las sesiones. Una vez que las sesiones han sido configuración pueden cerrarse y usted todavía será capaz de acceder a la $_SESSION variable.

Tome la siguiente prueba
S1.php este archivo configura una variable de sesión personalizado
PHP Código: [ 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 esto representa archivo no era un mal intento desde la sesión continuó dando por resultado ninguna información de sesión
PHP Código: [ 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 este archivo inicia/continúa la sesión y luego inmediatamente se cierra el archivo de sesión que nos da acceso a la $_SESSION variable.
PHP Código: [ 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.  


Así que esto es la idea básica detrás de mi clase de sesión. Cuando se llama al constructor se inicia y se cierra la sesión inmediatamente que le da el $_SESSION variable. algo importante a destacar es que eres no capaces de fijar cualquier otras sesiones a menos que iniciar la sesión de nuevo. Vea el ejemplo abajo

PHP Código: [ 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.  


Por lo que la clase estaría haciendo también será capaz de añadir y cambiar información de sesión así tan en vez de hacer $_SESSION ["índice"] = "content"; haces algo como $sess -&gt; modificar ("índice", "contenido"); .

¿Sus pensamientos o dudas? ¿Qué opinas de este enfoque a las sesiones? Puesto que se trata de una clase muy simple, muy probablemente se completará antes de que nadie lee este post lol.
  • Anonymous
  • Bot
  • No Avatar
  • Registrado: 25 Feb 2008
  • Mensajes: ?
  • Loc: Ozzuland
  • Status: Online

Nota Marzo 6th, 2013, 9:52 am

  • ScottG
  • Proficient
  • Proficient
  • No Avatar
  • Registrado: Jul 06, 2010
  • Mensajes: 263
  • Status: Offline

Nota Marzo 6th, 2013, 10:40 am

Como se ha dicho han completado la clase y lo estoy probando actualmente
  • Bigwebmaster
  • Site Admin
  • Site Admin
  • Avatar de Usuario
  • Registrado: Dic 20, 2002
  • Mensajes: 8925
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Offline

Nota Marzo 7th, 2013, 11:38 am

¿Ha considerado totalmente desguace usando PHPs sesión básica gestor y escribiendo su propia para que usted puede adaptarlo a su exacto necesita y evitar las trampas que esto parece estar causando?
Ozzu Hosting - Want your website on a fast server like Ozzu?
  • ScottG
  • Proficient
  • Proficient
  • No Avatar
  • Registrado: Jul 06, 2010
  • Mensajes: 263
  • Status: Offline

Nota Marzo 12th, 2013, 8:12 am

Tengo pensado hacerlo, pero entonces habría mucho más procesamiento en base de datos o archivos físicos para administrar. Más de mis problemas han sido resueltos por el cierre de la sesión cuando no esté en uso, que por el enlace en el otro post confirmó la cuestión.

Aquí le damos la clase que hace para dirigir la sesión y algunos usos
clase de sesión
PHP Código: [ 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.  


prueba 1
PHP Código: [ 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.  


prueba 2
PHP Código: [ 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.  


prueba 3
PHP Código: [ 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.  


prueba 4
PHP Código: [ 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.  

Publicar Información

  • Total de mensajes en este tema: 4 mensajes
  • Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 239 invitados
  • No puede abrir nuevos temas en este Foro
  • No puede responder a temas en este Foro
  • No puede editar sus mensajes en este Foro
  • No puede borrar sus mensajes en este Foro
  • No puede enviar adjuntos en este Foro
 
 

© 2011 Unmelted, LLC. Ozzu® es una marca registrada de Unmelted, LLC