multiuser-sessions.xml 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="learning.multiuser.sessions">
  5. <title>Gérer les sessions dans ZF</title>
  6. <sect2 id="learning.multiuser.sessions.intro">
  7. <title>Introduction aux sessions</title>
  8. <para>
  9. Le succès du web est en grande partie dûe aux protocoles qui le supportent: HTTP. HTTP sur
  10. TCP est par nature sans état ce qui signifie que le web n'a pas "de mémoire". Ce fait
  11. pose des problèmes pour les développeurs voulant traiter leur application comme un
  12. service riche.
  13. </para>
  14. <para>
  15. Interagir avec l'application web c'est en fait faire la somme de toutes les requêtes
  16. que celle-ci reçoit. Et comme il y a beaucoup de clients, il y a beaucoup de requête,
  17. et le moyen d'associer une requête à un client est appelé "session".
  18. </para>
  19. <para>
  20. En PHP, le problème des sessions a été résolu au travers de l'extension session qui utilise
  21. un système de persistance, typiquement basé sur des cookies et un stockage local des variables
  22. dans $_SESSION. Dans Zend Framework, le composant Zend_Session ajoute de la valeur au système
  23. de session de PHP notamment une manipulation objet.
  24. </para>
  25. </sect2>
  26. <sect2 id="learning.multiuser.sessions.basic-usage">
  27. <title>Utilisation classique de Zend_Session</title>
  28. <para>
  29. Le composant Zend_Session est un gestionnaire de session et une API pour stocker des données
  30. dans la session de manière objet. L'API de la classe Zend_Session API permet de régler des options
  31. et de démarrer/arrêter la session alors que Zend_Session_Namespace représente un objet
  32. contenant des données à stocker en session.
  33. </para>
  34. <para>
  35. C'est générallement une bonne pratique que de démarrer sa session en bootstrap, cependant
  36. la première création d'un objet Zend_Session_Namespace démarrera la session par défaut.
  37. </para>
  38. <para>
  39. Zend_Application peut permettre de configurer Zend_Session grâce aux parties
  40. Zend_Application_Resource. Pour les utiliser, en supposant que votre projet utilise
  41. Zend_Application, ajoutez le code suivant à application.ini:
  42. </para>
  43. <programlisting language="php"><![CDATA[
  44. resources.session.save_path = APPLICATION_PATH "/../data/session"
  45. resources.session.use_only_cookies = true
  46. resources.session.remember_me_seconds = 864000
  47. ]]></programlisting>
  48. <para>
  49. Comme vous le remarquez, les options utilisées sont les mêmes que celles que reconnait
  50. ext/session (l'extension session de PHP). Le chemin de stockage des session par exemple.
  51. Les fichiers ini peuvent utiliser des constantes, nous réutilisons APPLICATION_PATH
  52. pour calculer le chemin relatif vers un dossier arbitraire sensé stocker les sessions.
  53. </para>
  54. <para>
  55. La plupart des composants de Zend Framework utilisant les sessions n'ont rien besoin de plus.
  56. Dès lors, vous pouvez utiliser un composant faisant appel à la session, ou manipuler la session
  57. vous-même au travers d'un ou plusieurs objets Zend_Session_Namespace.
  58. </para>
  59. <para>
  60. Zend_Session_Namespace est une classe qui guide ses données vers $_SESSION. La classe s'appelle
  61. Zend_Session_Namespace car elle crée des espaces de noms au sein de $_SESSION, autorisant
  62. plusieurs composants ou objets à stocker des valeurs sans se marcher dessus. Nous allons voir
  63. dans l'exemple qui suit comment créer un simple compteur de session qui commence à 1000
  64. et se remet à zéro après 1999.
  65. </para>
  66. <programlisting language="php"><![CDATA[
  67. $mysession = new Zend_Session_Namespace('mysession');
  68. if (!isset($mysession->counter)) {
  69. $mysession->counter = 1000;
  70. } else {
  71. $mysession->counter++;
  72. }
  73. if ($mysession->counter > 1999) {
  74. unset($mysession->counter);
  75. }
  76. ]]></programlisting>
  77. <para>
  78. Comme vous le remarquez, l'objet de session utilise les méthodes magiques __get, __set,
  79. __isset, et __unset pour proposer une API intuitive. Les informations stockées dans
  80. notre exemple le sont en réalité dans $_SESSION['mysession']['counter'].
  81. </para>
  82. </sect2>
  83. <sect2 id="learning.multiuser.sessions.advanced-usage">
  84. <title>Utilisation avancée de Zend_Session</title>
  85. <para>
  86. Si vous voulez utiliser le gestionnaire de sauvegarde des sessions "DbTable", vous
  87. pouvez simplement ajouter ces options à application.ini:
  88. </para>
  89. <programlisting language="php"><![CDATA[
  90. resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable"
  91. resources.session.saveHandler.options.name = "session"
  92. resources.session.saveHandler.options.primary.session_id = "session_id"
  93. resources.session.saveHandler.options.primary.save_path = "save_path"
  94. resources.session.saveHandler.options.primary.name = "name"
  95. resources.session.saveHandler.options.primaryAssignment.sessionId = "sessionId"
  96. resources.session.saveHandler.options.primaryAssignment.sessionSavePath = "sessionSavePath"
  97. resources.session.saveHandler.options.primaryAssignment.sessionName = "sessionName"
  98. resources.session.saveHandler.options.modifiedColumn = "modified"
  99. resources.session.saveHandler.options.dataColumn = "session_data"
  100. resources.session.saveHandler.options.lifetimeColumn = "lifetime"
  101. ]]></programlisting>
  102. </sect2>
  103. </sect1>