<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >session_set_save_handler</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="PHP 手册" HREF="index.html"><LINK REL="UP" TITLE="Session 会话处理函数" HREF="ref.session.html"><LINK REL="PREVIOUS" TITLE="session_set_cookie_params" HREF="function.session-set-cookie-params.html"><LINK REL="NEXT" TITLE="session_start" HREF="function.session-start.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="refentry" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >PHP 手册</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="function.session-set-cookie-params.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="function.session-start.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><H1 ><A NAME="function.session-set-save-handler" ></A >session_set_save_handler</H1 ><DIV CLASS="refnamediv" ><A NAME="AEN208707" ></A ><P > (PHP 4, PHP 5)</P >session_set_save_handler -- Sets user-level session storage functions </DIV ><DIV CLASS="refsect1" ><A NAME="AEN208710" ></A ><H2 >Description</H2 >bool <B CLASS="methodname" >session_set_save_handler</B > ( callback open, callback close, callback read, callback write, callback destroy, callback gc )<BR ></BR ><P > <B CLASS="function" >session_set_save_handler()</B > sets the user-level session storage functions which are used for storing and retrieving data associated with a session. This is most useful when a storage method other than those supplied by PHP sessions is preferred. i.e. Storing the session data in a local database. 如果成功则返回 <TT CLASS="constant" ><B >TRUE</B ></TT >,失败则返回 <TT CLASS="constant" ><B >FALSE</B ></TT >。 </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > The "write" handler is not executed until after the output stream is closed. Thus, output from debugging statements in the "write" handler will never be seen in the browser. If debugging output is necessary, it is suggested that the debug output be written to a file instead. </P ></BLOCKQUOTE ></DIV ><P > The following example provides file based session storage similar to the PHP sessions default save handler <CODE CLASS="parameter" >files</CODE >. This example could easily be extended to cover database storage using your favorite PHP supported database engine. </P ><P > Read function must return string value always to make save handler work as expected. Return empty string if there is no data to read. Return values from other handlers are converted to boolean expression. <TT CLASS="constant" ><B >TRUE</B ></TT > for success, <TT CLASS="constant" ><B >FALSE</B ></TT > for failure. </P ><DIV CLASS="warning" ><P ></P ><TABLE CLASS="warning" BORDER="1" WIDTH="100%" ><TR ><TD ALIGN="CENTER" ><B >警告</B ></TD ></TR ><TR ><TD ALIGN="LEFT" ><P > Write and Close handlers are called after destructing objects since PHP 5.0.5. Thus destructors can use sessions but session handler can't use objects. In prior versions, they were called in the opposite order. It is possible to call <A HREF="function.session-write-close.html" ><B CLASS="function" >session_write_close()</B ></A > from the destructor to solve this chicken and egg problem. </P ></TD ></TR ></TABLE ></DIV ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN208748" ></A ><P ><B >例 1. <B CLASS="function" >session_set_save_handler()</B > example </B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">function </font><font color="#0000BB">open</font><font color="#007700">(</font><font color="#0000BB">$save_path</font><font color="#007700">, </font><font color="#0000BB">$session_name</font><font color="#007700">) <br />{<br /> global </font><font color="#0000BB">$sess_save_path</font><font color="#007700">;<br /> <br /> </font><font color="#0000BB">$sess_save_path </font><font color="#007700">= </font><font color="#0000BB">$save_path</font><font color="#007700">;<br /> return(</font><font color="#0000BB">true</font><font color="#007700">);<br />}<br /><br />function </font><font color="#0000BB">close</font><font color="#007700">() <br />{<br /> return(</font><font color="#0000BB">true</font><font color="#007700">);<br />}<br /><br />function </font><font color="#0000BB">read</font><font color="#007700">(</font><font color="#0000BB">$id</font><font color="#007700">) <br />{<br /> global </font><font color="#0000BB">$sess_save_path</font><font color="#007700">;<br /> <br /> </font><font color="#0000BB">$sess_file </font><font color="#007700">= </font><font color="#DD0000">"$sess_save_path/sess_$id"</font><font color="#007700">;<br /> return (string) @</font><font color="#0000BB">file_get_contents</font><font color="#007700">(</font><font color="#0000BB">$sess_file</font><font color="#007700">);<br />}<br /><br />function </font><font color="#0000BB">write</font><font color="#007700">(</font><font color="#0000BB">$id</font><font color="#007700">, </font><font color="#0000BB">$sess_data</font><font color="#007700">) <br />{<br /> global </font><font color="#0000BB">$sess_save_path</font><font color="#007700">;<br /> <br /> </font><font color="#0000BB">$sess_file </font><font color="#007700">= </font><font color="#DD0000">"$sess_save_path/sess_$id"</font><font color="#007700">;<br /> if (</font><font color="#0000BB">$fp </font><font color="#007700">= @</font><font color="#0000BB">fopen</font><font color="#007700">(</font><font color="#0000BB">$sess_file</font><font color="#007700">, </font><font color="#DD0000">"w"</font><font color="#007700">)) {<br /> </font><font color="#0000BB">$return </font><font color="#007700">= </font><font color="#0000BB">fwrite</font><font color="#007700">(</font><font color="#0000BB">$fp</font><font color="#007700">, </font><font color="#0000BB">$sess_data</font><font color="#007700">);<br /> </font><font color="#0000BB">fclose</font><font color="#007700">(</font><font color="#0000BB">$fp</font><font color="#007700">);<br /> return </font><font color="#0000BB">$return</font><font color="#007700">;<br /> } else {<br /> return(</font><font color="#0000BB">false</font><font color="#007700">);<br /> }<br /><br />}<br /><br />function </font><font color="#0000BB">destroy</font><font color="#007700">(</font><font color="#0000BB">$id</font><font color="#007700">) <br />{<br /> global </font><font color="#0000BB">$sess_save_path</font><font color="#007700">;<br /> <br /> </font><font color="#0000BB">$sess_file </font><font color="#007700">= </font><font color="#DD0000">"$sess_save_path/sess_$id"</font><font color="#007700">;<br /> return(@</font><font color="#0000BB">unlink</font><font color="#007700">(</font><font color="#0000BB">$sess_file</font><font color="#007700">));<br />}<br /><br />function </font><font color="#0000BB">gc</font><font color="#007700">(</font><font color="#0000BB">$maxlifetime</font><font color="#007700">) <br />{<br /> global </font><font color="#0000BB">$sess_save_path</font><font color="#007700">;<br /> <br /> foreach (</font><font color="#0000BB">glob</font><font color="#007700">(</font><font color="#DD0000">"$sess_save_path/sess_*"</font><font color="#007700">) as </font><font color="#0000BB">$filename</font><font color="#007700">) {<br /> if (</font><font color="#0000BB">filemtime</font><font color="#007700">(</font><font color="#0000BB">$filename</font><font color="#007700">) + </font><font color="#0000BB">$maxlifetime </font><font color="#007700">< </font><font color="#0000BB">time</font><font color="#007700">()) {<br /> @</font><font color="#0000BB">unlink</font><font color="#007700">(</font><font color="#0000BB">$filename</font><font color="#007700">);<br /> }<br /> }<br /> return </font><font color="#0000BB">true</font><font color="#007700">;<br />}<br /><br /></font><font color="#0000BB">session_set_save_handler</font><font color="#007700">(</font><font color="#DD0000">"open"</font><font color="#007700">, </font><font color="#DD0000">"close"</font><font color="#007700">, </font><font color="#DD0000">"read"</font><font color="#007700">, </font><font color="#DD0000">"write"</font><font color="#007700">, </font><font color="#DD0000">"destroy"</font><font color="#007700">, </font><font color="#DD0000">"gc"</font><font color="#007700">);<br /><br /></font><font color="#0000BB">session_start</font><font color="#007700">();<br /><br /></font><font color="#FF8000">// proceed to use sessions normally<br /><br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><P > See also the <A HREF="ref.session.html#ini.session.save-handler" >session.save_handler</A > configuration directive. </P ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="function.session-set-cookie-params.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >起始页</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="function.session-start.html" ACCESSKEY="N" >下一页</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >session_set_cookie_params</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="ref.session.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >session_start</TD ></TR ></TABLE ></DIV ></BODY ></HTML >