php-doc-en/reference/session/sessionhandlerinterface.xml
Christoph M. Becker d1c3de7ae6
Update sessionhandlerinterface example for PHP 8.1
We require suitable return types or the ReturnTypeWillChange attribute
as of PHP 8.1.0.  We specify the return types where supported as of PHP
7.0.0, but go with the attribute for the union types.

Cf. <https://github.com/php/doc-en/issues/1090>.
2021-11-15 17:05:31 +01:00

165 lines
4.7 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<phpdoc:classref xml:id="class.sessionhandlerinterface" xmlns:phpdoc="http://php.net/ns/phpdoc" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>The SessionHandlerInterface class</title>
<titleabbrev>SessionHandlerInterface</titleabbrev>
<partintro>
<!-- {{{ SessionHandlerInterface intro -->
<section xml:id="sessionhandlerinterface.intro">
&reftitle.intro;
<para>
<classname>SessionHandlerInterface</classname> is an interface which defines the minimal
prototype for creating a custom session handler. In order to pass a custom
session handler to <function>session_set_save_handler</function> using its
<abbrev>OOP</abbrev> invocation, the class can implement this interface.
</para>
<para>
Please note the callback methods of this class are designed to be called internally by
PHP and are not meant to be called from user-space code.
</para>
</section>
<!-- }}} -->
<section xml:id="sessionhandlerinterface.synopsis">
&reftitle.interfacesynopsis;
<!-- {{{ Synopsis -->
<classsynopsis>
<ooclass><classname>SessionHandlerInterface</classname></ooclass>
<!-- {{{ Class synopsis -->
<classsynopsisinfo>
<oointerface>
<interfacename>SessionHandlerInterface</interfacename>
</oointerface>
</classsynopsisinfo>
<!-- }}} -->
<classsynopsisinfo role="comment">&Methods;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.sessionhandlerinterface')/db:refentry/db:refsect1[@role='description']/descendant::db:methodsynopsis[1])" />
</classsynopsis>
<!-- }}} -->
</section>
<section xml:id="sessionhandlerinterface.examples">
<example>
<title>
Example using <classname>SessionHandlerInterface</classname>
</title>
<para>
The following example provides file based session storage similar to the
PHP sessions default save handler <parameter>files</parameter>. This
example could easily be extended to cover database storage using your
favorite PHP supported database engine.
</para>
<para>
Note we use the OOP prototype with <function>session_set_save_handler</function> and
register the shutdown function using the function's parameter flag. This is generally
advised when registering objects as session save handlers.
</para>
<caution>
<para>
For brevity, this example omits input validation. However, the
<literal>$id</literal> parameters are actually user supplied values which
require proper validation/sanitization to avoid vulnerabilities, such as
path traversal issues. <emphasis>So do not use this example unmodified in
production environments.</emphasis>
</para>
</caution>
<programlisting role="php">
<![CDATA[
<?php
class MySessionHandler implements SessionHandlerInterface
{
private $savePath;
public function open($savePath, $sessionName): bool
{
$this->savePath = $savePath;
if (!is_dir($this->savePath)) {
mkdir($this->savePath, 0777);
}
return true;
}
public function close(): bool
{
return true;
}
#[ReturnTypeWillChange]
public function read($id)
{
return (string)@file_get_contents("$this->savePath/sess_$id");
}
public function write($id, $data): bool
{
return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
}
public function destroy($id): bool
{
$file = "$this->savePath/sess_$id";
if (file_exists($file)) {
unlink($file);
}
return true;
}
#[ReturnTypeWillChange]
public function gc($maxlifetime)
{
foreach (glob("$this->savePath/sess_*") as $file) {
if (filemtime($file) + $maxlifetime < time() && file_exists($file)) {
unlink($file);
}
}
return true;
}
}
$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();
// proceed to set and retrieve values by key from $_SESSION
]]>
</programlisting>
</example>
</section>
</partintro>
&reference.session.entities.sessionhandlerinterface;
</phpdoc:classref>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->