<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[BIWEB开源PHP WMS系统创始人ArthurXF肖飞的blog]]></title> 
<link>http://www.bizeway.net/index.php</link> 
<description><![CDATA[网务通 - 网务公司发展之路]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[BIWEB开源PHP WMS系统创始人ArthurXF肖飞的blog]]></copyright>
<item>
<link>http://www.bizeway.net/read.php?</link>
<title><![CDATA[MemCached的PHP客户端操作类二]]></title> 
<author>ArthurXF &lt;arthurxf@gmail.com&gt;</author>
<category><![CDATA[PHP]]></category>
<pubDate>Thu, 25 Jan 2007 08:40:23 +0000</pubDate> 
<guid>http://www.bizeway.net/read.php?</guid> 
<description>
<![CDATA[ 
	<div class="code">&lt;?php <br/>/* <br/> * MemCached PHP client <br/> * Copyright (c) 2003 <br/> * Ryan Gilfether &lt;hotrodder@rocketmail.com&gt; <br/> * http://www.gilfether.com <br/> * <br/> * Originally translated from Brad Fitzpatrick&#039;s &lt;brad@danga.com&gt; MemCached Perl client <br/> * See the memcached website: <br/> * http://www.danga.com/memcached/ <br/> * <br/> * This module is Copyright (c) 2003 Ryan Gilfether. <br/> * All rights reserved. <br/> * You may distribute under the terms of the GNU General Public License <br/> * This is free software. IT COMES WITHOUT WARRANTY OF ANY KIND. <br/> * <br/> */ <br/><br/>/** <br/> * version string <br/> */ <br/>define(&quot;MC_VERSION&quot;, &quot;1.0.10&quot;); <br/>/** <br/> * int, buffer size used for sending and receiving <br/> * data from sockets <br/> */ <br/>define(&quot;MC_BUFFER_SZ&quot;, 1024); <br/>/** <br/> * MemCached error numbers <br/> */ <br/>define(&quot;MC_ERR_NOT_ACTIVE&quot;, 1001); &nbsp; &nbsp;// no active servers <br/>define(&quot;MC_ERR_SOCKET_WRITE&quot;, 1002); &nbsp; &nbsp;// socket_write() failed <br/>define(&quot;MC_ERR_SOCKET_READ&quot;, 1003); &nbsp; &nbsp;// socket_read() failed <br/>define(&quot;MC_ERR_SOCKET_CONNECT&quot;, 1004); &nbsp; &nbsp;// failed to connect to host <br/>define(&quot;MC_ERR_DELETE&quot;, 1005); &nbsp; &nbsp; &nbsp; &nbsp;// delete() did not recieve DELETED command <br/>define(&quot;MC_ERR_HOST_FORMAT&quot;, 1006); &nbsp; &nbsp;// sock_to_host() invalid host format <br/>define(&quot;MC_ERR_HOST_DEAD&quot;, 1007); &nbsp; &nbsp;// sock_to_host() host is dead <br/>define(&quot;MC_ERR_GET_SOCK&quot;, 1008); &nbsp; &nbsp;// get_sock() failed to find a valid socket <br/>define(&quot;MC_ERR_SET&quot;, 1009); &nbsp; &nbsp; &nbsp; &nbsp;// _set() failed to receive the STORED response <br/>define(&quot;MC_ERR_GET_KEY&quot;, 1010); &nbsp; &nbsp; &nbsp; &nbsp;// _load_items no values returned for key(s) <br/>define(&quot;MC_ERR_LOADITEM_END&quot;, 1011); &nbsp; &nbsp;// _load_items failed to receive END response <br/>define(&quot;MC_ERR_LOADITEM_BYTES&quot;, 1012); &nbsp; &nbsp;// _load_items bytes read larger than bytes available <br/><br/><br/>/** <br/> * MemCached PHP client Class. <br/> * <br/> * Communicates with the MemCached server, and executes the MemCached protocol <br/> * MemCached available at http://www.danga.com/memcached <br/> * <br/> * @author Ryan Gilfether &lt;ryan@gilfether.com&gt; <br/> * @package MemCachedClient <br/> * @access public <br/> * @version 1.0.10 <br/> */ <br/>class MemCachedClient <br/>{ <br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * array of servers no long available <br/> &nbsp; &nbsp; * @var array <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;var $host_dead; <br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * array of open sockets <br/> &nbsp; &nbsp; * @var array <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;var $cache_sock; <br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * determine if debugging is either on or off <br/> &nbsp; &nbsp; * @var bool <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;var $debug; <br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * array of servers to attempt to use, &quot;host:port&quot; string format <br/> &nbsp; &nbsp; * @var array <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;var $servers; <br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * count of currently active connections to servers <br/> &nbsp; &nbsp; * @var int <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;var $active; <br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * error code if one is set <br/> &nbsp; &nbsp; * @var int <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;var $errno; <br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * string describing error <br/> &nbsp; &nbsp; * @var string <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;var $errstr; <br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * size of val to force compression; 0 turns off; defaults 1 <br/> &nbsp; &nbsp; * @ var int <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;var $compress = 1; <br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * temp flag to turn compression on/off; defaults on <br/> &nbsp; &nbsp; * @ var int <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;var $comp_active = 1; <br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * array that contains parsed out buckets <br/> &nbsp; &nbsp; * @ var array <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;var $bucket; <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * Constructor <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * Creates a new MemCachedClient object <br/> &nbsp; &nbsp; * Takes one parameter, a array of options. &nbsp;The most important key is <br/> &nbsp; &nbsp; * $options&#91;&quot;servers&quot;&#93;, but that can also be set later with the set_servers() <br/> &nbsp; &nbsp; * method. &nbsp;The servers must be an array of hosts, each of which is <br/> &nbsp; &nbsp; * either a scalar of the form &lt;10.0.0.10:11211&gt; or an array of the <br/> &nbsp; &nbsp; * former and an integer weight value. &nbsp;(the default weight if <br/> &nbsp; &nbsp; * unspecified is 1.) &nbsp;It&#039;s recommended that weight values be kept as low <br/> &nbsp; &nbsp; * as possible, as this module currently allocates memory for bucket <br/> &nbsp; &nbsp; * distribution proportional to the total host weights. <br/> &nbsp; &nbsp; * $options&#91;&quot;debug&quot;&#93; turns the debugging on if set to true <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access public <br/> &nbsp; &nbsp; * @param array $option an array of servers and debug status <br/> &nbsp; &nbsp; * @return object MemCachedClient the new MemCachedClient object <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function MemCachedClient($options = 0) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;if(is_array($options)) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;set_servers($options&#91;&quot;servers&quot;&#93;); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;debug = $options&#91;&quot;debug&quot;&#93;; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;compress = $options&#91;&quot;compress&quot;&#93;; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;cache_sock = array(); <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = 0; <br/> &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;&quot;; <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * sets up the list of servers and the ports to connect to <br/> &nbsp; &nbsp; * takes an array of servers in the same format as in the constructor <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access public <br/> &nbsp; &nbsp; * @param array $servers array of servers in the format described in the constructor <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function set_servers($servers) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;servers = $servers; <br/> &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;active = count($this-&gt;servers); <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * if $do_debug is set to true, will print out <br/> &nbsp; &nbsp; * debugging info, else debug is turned off <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access public <br/> &nbsp; &nbsp; * @param bool $do_debug set to true to turn debugging on, false to turn off <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function set_debug($do_debug) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;debug = $do_debug; <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * remove all cached hosts that are no longer good <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access public <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function forget_dead_hosts() <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;unset($this-&gt;host_dead); <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * disconnects from all servers <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access public <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function disconnect_all() <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;foreach($this-&gt;cache_sock as $sock) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;socket_close($sock); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;unset($this-&gt;cache_sock); <br/> &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;active = 0; <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * removes the key from the MemCache <br/> &nbsp; &nbsp; * $time is the amount of time in seconds (or Unix time) until which <br/> &nbsp; &nbsp; * the client wishes the server to refuse &quot;add&quot; and &quot;replace&quot; commands <br/> &nbsp; &nbsp; * with this key. For this amount of item, the item is put into a <br/> &nbsp; &nbsp; * delete queue, which means that it won&#039;t possible to retrieve it by <br/> &nbsp; &nbsp; * the &quot;get&quot; command, but &quot;add&quot; and &quot;replace&quot; command with this key <br/> &nbsp; &nbsp; * will also fail (the &quot;set&quot; command will succeed, however). After the <br/> &nbsp; &nbsp; * time passes, the item is finally deleted from server memory. <br/> &nbsp; &nbsp; * The parameter $time is optional, and, if absent, defaults to 0 <br/> &nbsp; &nbsp; * (which means that the item will be deleted immediately and further <br/> &nbsp; &nbsp; * storage commands with this key will succeed). <br/> &nbsp; &nbsp; * Possible errors set are: <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_NOT_ACTIVE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_GET_SOCK <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_WRITE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_READ <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_DELETE <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access public <br/> &nbsp; &nbsp; * @param string $key the key to delete <br/> &nbsp; &nbsp; * @param timestamp $time optional, the amount of time server will refuse commands on key <br/> &nbsp; &nbsp; * @return bool TRUE on success, FALSE if key does not exist <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function delete($key, $time = 0) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;if(!$this-&gt;active) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_NOT_ACTIVE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;No active servers are available&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;delete(): There are no active servers available.&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;$sock = $this-&gt;get_sock($key); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;if(!is_resource($sock)) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_GET_SOCK; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Unable to retrieve a valid socket.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;delete(): get_sock() returned an invalid socket.&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;if(is_array($key)) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$key = $key&#91;1&#93;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;$cmd = &quot;delete $key $time&#92;r&#92;n&quot;; <br/> &nbsp; &nbsp; &nbsp; &nbsp;$cmd_len = strlen($cmd); <br/> &nbsp; &nbsp; &nbsp; &nbsp;$offset = 0; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// now send the command <br/> &nbsp; &nbsp; &nbsp; &nbsp;while($offset &lt; $cmd_len) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$result = socket_write($sock, substr($cmd, $offset, MC_BUFFER_SZ), MC_BUFFER_SZ); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($result !== FALSE) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$offset += $result; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else if($offset &lt; $cmd_len) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_SOCKET_WRITE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Failed to write to socket.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$sockerr = socket_last_error($sock); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;delete(): socket_write() returned FALSE. Socket Error $sockerr: &quot;.socket_strerror($sockerr)); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// now read the server&#039;s response <br/> &nbsp; &nbsp; &nbsp; &nbsp;if(($retval = socket_read($sock, MC_BUFFER_SZ, PHP_NORMAL_READ)) === FALSE) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_SOCKET_READ; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Failed to read from socket.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$sockerr = socket_last_error($sock); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;delete(): socket_read() returned FALSE. Socket Error $sockerr: &quot;.socket_strerror($sockerr)); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// remove the &#92;r&#92;n from the end <br/> &nbsp; &nbsp; &nbsp; &nbsp;$retval = rtrim($retval); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// now read the server&#039;s response <br/> &nbsp; &nbsp; &nbsp; &nbsp;if($retval == &quot;DELETED&quot;) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return TRUE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;else <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// something went wrong, create the error <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_DELETE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Failed to receive DELETED response from server.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;delete(): Failed to receive DELETED response from server. Received $retval instead.&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * Like set(), but only stores in memcache if the key doesn&#039;t already exist. <br/> &nbsp; &nbsp; * Possible errors set are: <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_NOT_ACTIVE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_GET_SOCK <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_WRITE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_READ <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SET <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access public <br/> &nbsp; &nbsp; * @param string $key the key to set <br/> &nbsp; &nbsp; * @param mixed $val the value of the key <br/> &nbsp; &nbsp; * @param timestamp $exptime optional, the to to live of the key <br/> &nbsp; &nbsp; * @return bool TRUE on success, else FALSE <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function add($key, $val, $exptime = 0) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;return $this-&gt;_set(&quot;add&quot;, $key, $val, $exptime); <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * Like set(), but only stores in memcache if the key already exists. <br/> &nbsp; &nbsp; * returns TRUE on success else FALSE <br/> &nbsp; &nbsp; * Possible errors set are: <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_NOT_ACTIVE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_GET_SOCK <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_WRITE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_READ <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SET <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access public <br/> &nbsp; &nbsp; * @param string $key the key to set <br/> &nbsp; &nbsp; * @param mixed $val the value of the key <br/> &nbsp; &nbsp; * @param timestamp $exptime optional, the to to live of the key <br/> &nbsp; &nbsp; * @return bool TRUE on success, else FALSE <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function replace($key, $val, $exptime = 0) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;return $this-&gt;_set(&quot;replace&quot;, $key, $val, $exptime); <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * Unconditionally sets a key to a given value in the memcache. &nbsp;Returns true <br/> &nbsp; &nbsp; * if it was stored successfully. <br/> &nbsp; &nbsp; * The $key can optionally be an arrayref, with the first element being the <br/> &nbsp; &nbsp; * hash value, as described above. <br/> &nbsp; &nbsp; * Possible errors set are: <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_NOT_ACTIVE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_GET_SOCK <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_WRITE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_READ <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SET <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access public <br/> &nbsp; &nbsp; * @param string $key the key to set <br/> &nbsp; &nbsp; * @param mixed $val the value of the key <br/> &nbsp; &nbsp; * @param timestamp $exptime optional, the to to live of the key <br/> &nbsp; &nbsp; * @return bool TRUE on success, else FALSE <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function set($key, $val, $exptime = 0) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;return $this-&gt;_set(&quot;set&quot;, $key, $val, $exptime); <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * Retrieves a key from the memcache. &nbsp;Returns the value (automatically <br/> &nbsp; &nbsp; * unserialized, if necessary) or FALSE if it fails. <br/> &nbsp; &nbsp; * The $key can optionally be an array, with the first element being the <br/> &nbsp; &nbsp; * hash value, if you want to avoid making this module calculate a hash <br/> &nbsp; &nbsp; * value. &nbsp;You may prefer, for example, to keep all of a given user&#039;s <br/> &nbsp; &nbsp; * objects on the same memcache server, so you could use the user&#039;s <br/> &nbsp; &nbsp; * unique id as the hash value. <br/> &nbsp; &nbsp; * Possible errors set are: <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_GET_KEY <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access public <br/> &nbsp; &nbsp; * @param string $key the key to retrieve <br/> &nbsp; &nbsp; * @return mixed the value of the key, FALSE on error <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function get($key) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;$val =&amp; $this-&gt;get_multi($key); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;if(!$val) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_GET_KEY; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;No value found for key $key&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;get(): No value found for key $key&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;return $val&#91;$key&#93;; <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * just like get(), but takes an array of keys, returns FALSE on error <br/> &nbsp; &nbsp; * Possible errors set are: <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_NOT_ACTIVE <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access public <br/> &nbsp; &nbsp; * @param array $keys the keys to retrieve <br/> &nbsp; &nbsp; * @return array the value of each key, FALSE on error <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function get_multi($keys) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;$sock_keys = array(); <br/> &nbsp; &nbsp; &nbsp; &nbsp;$socks = array(); <br/> &nbsp; &nbsp; &nbsp; &nbsp;$val = 0; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;if(!$this-&gt;active) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_NOT_ACTIVE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;No active servers are available&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;get_multi(): There are no active servers available.&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;if(!is_array($keys)) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$arr&#91;&#93; = $keys; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$keys = $arr; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;foreach($keys as $k) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$sock = $this-&gt;get_sock($k); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($sock) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$k = is_array($k) ? $k&#91;1&#93; : $k; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(@!is_array($sock_keys&#91;$sock&#93;)) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$sock_keys&#91;$sock&#93; = array(); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// if $sock_keys&#91;$sock&#93; doesn&#039;t exist, create it <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(!$sock_keys&#91;$sock&#93;) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$socks&#91;&#93; = $sock; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$sock_keys&#91;$sock&#93;&#91;&#93; = $k; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;if(!is_array($socks)) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$arr&#91;&#93; = $socks; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$socks = $arr; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;foreach($socks as $s) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_load_items($s, $val, $sock_keys&#91;$sock&#93;); <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while(list($k, $v) = @each($val)) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;MemCache: got $k = $v&#92;n&quot;); <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;return $val; <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * Sends a command to the server to atomically increment the value for <br/> &nbsp; &nbsp; * $key by $value, or by 1 if $value is undefined. &nbsp;Returns FALSE if $key <br/> &nbsp; &nbsp; * doesn&#039;t exist on server, otherwise it returns the new value after <br/> &nbsp; &nbsp; * incrementing. &nbsp;Value should be zero or greater. &nbsp;Overflow on server <br/> &nbsp; &nbsp; * is not checked. &nbsp;Be aware of values approaching 2**32. &nbsp;See decr. <br/> &nbsp; &nbsp; * ONLY WORKS WITH NUMERIC VALUES <br/> &nbsp; &nbsp; * Possible errors set are: <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_NOT_ACTIVE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_GET_SOCK <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_WRITE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_READ <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access public <br/> &nbsp; &nbsp; * @param string $key the keys to increment <br/> &nbsp; &nbsp; * @param int $value the amount to increment the key bye <br/> &nbsp; &nbsp; * @return int the new value of the key, else FALSE <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function incr($key, $value = 1) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;return $this-&gt;_incrdecr(&quot;incr&quot;, $key, $value); <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * Like incr, but decrements. &nbsp;Unlike incr, underflow is checked and new <br/> &nbsp; &nbsp; * values are capped at 0. &nbsp;If server value is 1, a decrement of 2 <br/> &nbsp; &nbsp; * returns 0, not -1. <br/> &nbsp; &nbsp; * ONLY WORKS WITH NUMERIC VALUES <br/> &nbsp; &nbsp; * Possible errors set are: <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_NOT_ACTIVE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_GET_SOCK <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_WRITE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_READ <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access public <br/> &nbsp; &nbsp; * @param string $key the keys to increment <br/> &nbsp; &nbsp; * @param int $value the amount to increment the key bye <br/> &nbsp; &nbsp; * @return int the new value of the key, else FALSE <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function decr($key, $value = 1) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;return $this-&gt;_incrdecr(&quot;decr&quot;, $key, $value); <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * When a function returns FALSE, an error code is set. <br/> &nbsp; &nbsp; * This funtion will return the error code. <br/> &nbsp; &nbsp; * See error_string() <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access public <br/> &nbsp; &nbsp; * @return int the value of the last error code <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function error() <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;return $this-&gt;errno; <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * Returns a string describing the error set in error() <br/> &nbsp; &nbsp; * See error() <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access public <br/> &nbsp; &nbsp; * @return int a string describing the error code given <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function error_string() <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;return $this-&gt;errstr; <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * Resets the error number and error string <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access public <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function error_clear() <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;// reset to no error <br/> &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = 0; <br/> &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;&quot;; <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * &nbsp; &nbsp;temporarily sets compression on or off <br/> &nbsp; &nbsp; * &nbsp; &nbsp;turning it off, and then back on will result in the compression threshold going <br/> &nbsp; &nbsp; * &nbsp; &nbsp;back to the original setting from $options <br/> &nbsp; &nbsp; * &nbsp; &nbsp;@param int $setting setting of compression (0=off&#124;1=on) <br/> &nbsp; &nbsp; */ <br/><br/> &nbsp; &nbsp; function set_compression($setting=1) { <br/> &nbsp; &nbsp; &nbsp; &nbsp; if ($setting != 0) { <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;comp_active = 1; <br/> &nbsp; &nbsp; &nbsp; &nbsp; } else { <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;comp_active = 0; <br/> &nbsp; &nbsp; &nbsp; &nbsp; } <br/> &nbsp; &nbsp; } <br/><br/><br/><br/> &nbsp; &nbsp;/* <br/> &nbsp; &nbsp; * PRIVATE FUNCTIONS <br/> &nbsp; &nbsp; */ <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * connects to a server <br/> &nbsp; &nbsp; * The $host may either a string int the form of host:port or an array of the <br/> &nbsp; &nbsp; * former and an integer weight value. &nbsp;(the default weight if <br/> &nbsp; &nbsp; * unspecified is 1.) See the constructor for details <br/> &nbsp; &nbsp; * Possible errors set are: <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_HOST_FORMAT <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_HOST_DEAD <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_CONNECT <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access private <br/> &nbsp; &nbsp; * @param mixed $host either an array or a string <br/> &nbsp; &nbsp; * @return resource the socket of the new connection, else FALSE <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function sock_to_host($host) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;if(is_array($host)) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$host = array_shift($host); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;$now = time(); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// seperate the ip from the port, index 0 = ip, index 1 = port <br/> &nbsp; &nbsp; &nbsp; &nbsp;$conn = explode(&quot;:&quot;, $host); <br/> &nbsp; &nbsp; &nbsp; &nbsp;if(count($conn) != 2) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_HOST_FORMAT; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Host address was not in the format of host:port&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;sock_to_host(): Host address was not in the format of host:port&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;if(@($this-&gt;host_dead&#91;$host&#93; &amp;&amp; $this-&gt;host_dead&#91;$host&#93; &gt; $now) &#124;&#124; <br/> &nbsp; &nbsp; &nbsp; &nbsp;@($this-&gt;host_dead&#91;$conn&#91;0&#93;&#93; &amp;&amp; $this-&gt;host_dead&#91;$conn&#91;0&#93;&#93; &gt; $now)) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_HOST_DEAD; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Host $host is not available.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;sock_to_host(): Host $host is not available.&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// connect to the server, if it fails, add it to the host_dead below <br/> &nbsp; &nbsp; &nbsp; &nbsp;$sock = socket_create (AF_INET, SOCK_STREAM, getprotobyname(&quot;TCP&quot;)); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// we need surpress the error message if a connection fails <br/> &nbsp; &nbsp; &nbsp; &nbsp;if(!@socket_connect($sock, $conn&#91;0&#93;, $conn&#91;1&#93;)) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;host_dead&#91;$host&#93;=$this-&gt;host_dead&#91;$conn&#91;0&#93;&#93;=$now+60+intval(rand(0, 10)); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_SOCKET_CONNECT; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Failed to connect to &quot;.$conn&#91;0&#93;.&quot;:&quot;.$conn&#91;1&#93;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;sock_to_host(): Failed to connect to &quot;.$conn&#91;0&#93;.&quot;:&quot;.$conn&#91;1&#93;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// success, add to the list of sockets <br/> &nbsp; &nbsp; &nbsp; &nbsp;$cache_sock&#91;$host&#93; = $sock; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;return $sock; <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * retrieves the socket associated with a key <br/> &nbsp; &nbsp; * Possible errors set are: <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_NOT_ACTIVE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_GET_SOCK <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access private <br/> &nbsp; &nbsp; * @param string $key the key to retrieve the socket from <br/> &nbsp; &nbsp; * @return resource the socket of the connection, else FALSE <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function get_sock($key) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;if(!$this-&gt;active) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_NOT_ACTIVE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;No active servers are available&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;get_sock(): There are no active servers available.&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;$hv = is_array($key) ? intval($key&#91;0&#93;) : $this-&gt;_hashfunc($key); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;if(!$this-&gt;buckets) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$bu = $this-&gt;buckets = array(); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;foreach($this-&gt;servers as $v) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(is_array($v)) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for($i = 1; &nbsp;$i &lt;= $v&#91;1&#93;; ++$i) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$bu&#91;&#93; = &nbsp;$v&#91;0&#93;; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$bu&#91;&#93; = $v; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;buckets = $bu; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;$real_key = is_array($key) ? $key&#91;1&#93; : $key; <br/> &nbsp; &nbsp; &nbsp; &nbsp;$tries = 0; <br/> &nbsp; &nbsp; &nbsp; &nbsp;while($tries &lt; 20) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$host = @$this-&gt;buckets&#91;$hv % count($this-&gt;buckets)&#93;; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$sock = $this-&gt;sock_to_host($host); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(is_resource($sock)) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return $sock; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$hv += $this-&gt;_hashfunc($tries.$real_key); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;++$tries; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_GET_SOCK; <br/> &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Unable to retrieve a valid socket.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;get_sock(): Unable to retrieve a valid socket.&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * increments or decrements a numerical value in memcached. this function is <br/> &nbsp; &nbsp; * called from incr() and decr() <br/> &nbsp; &nbsp; * ONLY WORKS WITH NUMERIC VALUES <br/> &nbsp; &nbsp; * Possible errors set are: <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_NOT_ACTIVE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_GET_SOCK <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_WRITE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_READ <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access private <br/> &nbsp; &nbsp; * @param string $cmdname the command to send, either incr or decr <br/> &nbsp; &nbsp; * @param string $key the key to perform the command on <br/> &nbsp; &nbsp; * @param mixed $value the value to incr or decr the key value by <br/> &nbsp; &nbsp; * @return int the new value of the key, FALSE if something went wrong <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function _incrdecr($cmdname, $key, $value) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;if(!$this-&gt;active) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_NOT_ACTIVE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;No active servers are available&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;_incrdecr(): There are no active servers available.&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;$sock = $this-&gt;get_sock($key); <br/> &nbsp; &nbsp; &nbsp; &nbsp;if(!is_resource($sock)) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_GET_SOCK; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Unable to retrieve a valid socket.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;_incrdecr(): Invalid socket returned by get_sock().&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;if($value == &quot;&quot;) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$value = 1; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;$cmd = &quot;$cmdname $key $value&#92;r&#92;n&quot;; <br/> &nbsp; &nbsp; &nbsp; &nbsp;$cmd_len = strlen($cmd); <br/> &nbsp; &nbsp; &nbsp; &nbsp;$offset = 0; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// write the command to the server <br/> &nbsp; &nbsp; &nbsp; &nbsp;while($offset &lt; $cmd_len) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$result = socket_write($sock, substr($cmd, $offset, MC_BUFFER_SZ), MC_BUFFER_SZ); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($result !== FALSE) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$offset += $result; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else if($offset &lt; $cmd_len) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_SOCKET_WRITE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Failed to write to socket.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$sockerr = socket_last_error($sock); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;_incrdecr(): socket_write() returned FALSE. Error $errno: &quot;.socket_strerror($sockerr)); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// now read the server&#039;s response <br/> &nbsp; &nbsp; &nbsp; &nbsp;if(($retval = socket_read($sock, MC_BUFFER_SZ, PHP_NORMAL_READ)) === FALSE) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_SOCKET_READ; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Failed to read from socket.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$sockerr = socket_last_error($sock); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;_incrdecr(): socket_read() returned FALSE. Socket Error $errno: &quot;.socket_strerror($sockerr)); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// strip the /r/n from the end and return value <br/> &nbsp; &nbsp; &nbsp; &nbsp;return trim($retval); <br/> &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * sends the command to the server <br/> &nbsp; &nbsp; * Possible errors set are: <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_NOT_ACTIVE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_GET_SOCK <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_WRITE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_READ <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SET <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access private <br/> &nbsp; &nbsp; * @param string $cmdname the command to send, either incr or decr <br/> &nbsp; &nbsp; * @param string $key the key to perform the command on <br/> &nbsp; &nbsp; * @param mixed $value the value to set the key to <br/> &nbsp; &nbsp; * @param timestamp $exptime expiration time of the key <br/> &nbsp; &nbsp; * @return bool TRUE on success, else FALSE <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function _set($cmdname, $key, $val, $exptime = 0) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;if(!$this-&gt;active) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_NOT_ACTIVE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;No active servers are available&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;_set(): No active servers are available.&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;$sock = $this-&gt;get_sock($key); <br/> &nbsp; &nbsp; &nbsp; &nbsp;if(!is_resource($sock)) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_GET_SOCK; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Unable to retrieve a valid socket.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;_set(): Invalid socket returned by get_sock().&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;$flags = 0; <br/> &nbsp; &nbsp; &nbsp; &nbsp;$key = is_array($key) ? $key&#91;1&#93; : $key; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;$raw_val = $val; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// if the value is not scalar, we need to serialize it <br/> &nbsp; &nbsp; &nbsp; &nbsp;if(!is_scalar($val)) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$val = serialize($val); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$flags &#124;= 1; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;if (($this-&gt;compress_active) &amp;&amp; ($this-&gt;compress &gt; 0) &amp;&amp; (strlen($val) &gt; $this-&gt;compress)) { <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;_set(): compressing data. size in:&quot;.strlen($val)); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$cval=gzcompress($val); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;_set(): done compressing data. size out:&quot;.strlen($cval)); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((strlen($cval) &lt; strlen($val)) &amp;&amp; (strlen($val) - strlen($cval) &gt; 2048)){ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$flags &#124;= 2; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$val=$cval; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;unset($cval); <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;$len = strlen($val); <br/> &nbsp; &nbsp; &nbsp; &nbsp;if (!is_int($exptime)) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$exptime = 0; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// send off the request <br/> &nbsp; &nbsp; &nbsp; &nbsp;$cmd = &quot;$cmdname $key $flags $exptime $len&#92;r&#92;n$val&#92;r&#92;n&quot;; <br/> &nbsp; &nbsp; &nbsp; &nbsp;$cmd_len = strlen($cmd); <br/> &nbsp; &nbsp; &nbsp; &nbsp;$offset = 0; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// write the command to the server <br/> &nbsp; &nbsp; &nbsp; &nbsp;while($offset &lt; $cmd_len) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$result = socket_write($sock, substr($cmd, $offset, MC_BUFFER_SZ), MC_BUFFER_SZ); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($result !== FALSE) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$offset += $result; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else if($offset &lt; $cmd_len) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_SOCKET_WRITE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Failed to write to socket.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$errno = socket_last_error($sock); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;_set(): socket_write() returned FALSE. Error $errno: &quot;.socket_strerror($errno)); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// now read the server&#039;s response <br/> &nbsp; &nbsp; &nbsp; &nbsp;if(($l_szResponse = socket_read($sock, 6, PHP_NORMAL_READ)) === FALSE) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_SOCKET_READ; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Failed to read from socket.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$errno = socket_last_error($sock); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;_set(): socket_read() returned FALSE. Error $errno: &quot;.socket_strerror($errno)); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;if($l_szResponse == &quot;STORED&quot;) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;MemCache: $cmdname $key = $raw_val&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return TRUE; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_SET; <br/> &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Failed to receive the STORED response from the server.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;_set(): Did not receive STORED as the server response! Received $l_szResponse instead.&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * retrieves the value, and returns it unserialized <br/> &nbsp; &nbsp; * Possible errors set are: <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_WRITE <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_SOCKET_READ <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_GET_KEY <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_LOADITEM_END <br/> &nbsp; &nbsp; * &nbsp; &nbsp; &nbsp; &nbsp;MC_ERR_LOADITEM_BYTES <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access private <br/> &nbsp; &nbsp; * @param resource $sock the socket to connection we are retriving from <br/> &nbsp; &nbsp; * @param array $val reference to the values retrieved <br/> &nbsp; &nbsp; * @param mixed $sock_keys either a string or an array of keys to retrieve <br/> &nbsp; &nbsp; * @return array TRUE on success, else FALSE <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function _load_items($sock, &amp;$val, $sock_keys) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;$val = array(); <br/> &nbsp; &nbsp; &nbsp; &nbsp;$cmd = &quot;get &quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;if(!is_array($sock_keys)) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$arr&#91;&#93; = $sock_keys; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$sock_keys = $arr; <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;foreach($sock_keys as $sk) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$cmd .= $sk.&quot; &quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;$cmd .=&quot;&#92;r&#92;n&quot;; <br/> &nbsp; &nbsp; &nbsp; &nbsp;$cmd_len = strlen($cmd); <br/> &nbsp; &nbsp; &nbsp; &nbsp;$offset = 0; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// write the command to the server <br/> &nbsp; &nbsp; &nbsp; &nbsp;while($offset &lt; $cmd_len) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$result = socket_write($sock, substr($cmd, $offset, MC_BUFFER_SZ), MC_BUFFER_SZ); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($result !== FALSE) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$offset += $result; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else if($offset &lt; $cmd_len) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_SOCKET_WRITE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Failed to write to socket.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$errno = socket_last_error($sock); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;_load_items(): socket_write() returned FALSE. Error $errno: &quot;.socket_strerror($errno)); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;$len = 0; <br/> &nbsp; &nbsp; &nbsp; &nbsp;$buf = &quot;&quot;; <br/> &nbsp; &nbsp; &nbsp; &nbsp;$flags_array = array(); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;// now read the response from the server <br/> &nbsp; &nbsp; &nbsp; &nbsp;while($line = socket_read($sock, MC_BUFFER_SZ, PHP_BINARY_READ)) <br/> &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// check for a socket_read error <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($line === FALSE) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_SOCKET_READ; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Failed to read from socket.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$errno = socket_last_error($sock); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;_load_items(): socket_read() returned FALSE. Error $errno: &quot;.socket_strerror($errno)); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($len == 0) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$header = substr($line, 0, strpos($line, &quot;&#92;r&#92;n&quot;)); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$matches = explode(&quot; &quot;, $header); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(is_string($matches&#91;1&#93;) &amp;&amp; is_numeric($matches&#91;2&#93;) &amp;&amp; is_numeric($matches&#91;3&#93;)) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$rk = $matches&#91;1&#93;; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$flags = $matches&#91;2&#93;; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$len = $matches&#91;3&#93;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($flags) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$flags_array&#91;$rk&#93; = $flags; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$len_array&#91;$rk&#93; = $len; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$bytes_read = 0; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// get the left over data after the header is read <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$line = substr($line, strpos($line, &quot;&#92;r&#92;n&quot;)+2, strlen($line)); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_GET_KEY; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Requested key(s) returned no values.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// something went wrong, we never recieved the header <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;_load_items(): Requested key(s) returned no values.&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// skip over the extra return or newline <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($line == &quot;&#92;r&quot; &#124;&#124; $line == &quot;&#92;n&quot;) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;continue; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$bytes_read += strlen($line); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$buf .= $line; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// we read the all of the data, take in account <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// for the /r/nEND/r/n <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($bytes_read == ($len + 7)) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$end = substr($buf, $len+2, 3); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($end == &quot;END&quot;) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$val&#91;$rk&#93; = substr($buf, 0, $len); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;foreach($sock_keys as $sk) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(!isset($val&#91;$sk&#93;)) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;continue; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(strlen($val&#91;$sk&#93;) != $len_array&#91;$sk&#93;) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;continue; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(@$flags_array&#91;$sk&#93; &amp; 2) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$val&#91;$sk&#93; = gzuncompress($val&#91;$sk&#93;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(@$flags_array&#91;$sk&#93; &amp; 1) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$val&#91;$sk&#93; = unserialize($val&#91;$sk&#93;); <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return TRUE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_LOADITEM_END; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Failed to receive END response from server.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;_load_items(): Failed to receive END. Received $end instead.&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// take in consideration for the &quot;&#92;r&#92;nEND&#92;r&#92;n&quot; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($bytes_read &gt; ($len + 7)) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errno = MC_ERR_LOADITEM_BYTES; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;errstr = &quot;Bytes read from server greater than size of data.&quot;; <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($this-&gt;debug) <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;_debug(&quot;_load_items(): Bytes read is greater than requested data size.&quot;); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return FALSE; <br/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;} <br/> &nbsp; &nbsp;} <br/><br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * creates our hash <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access private <br/> &nbsp; &nbsp; * @param int $num <br/> &nbsp; &nbsp; * @return hash <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function _hashfunc($num) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;$hash = sprintf(&quot;%u&quot;,crc32($num)); <br/><br/> &nbsp; &nbsp; &nbsp; &nbsp;return $hash; <br/> &nbsp; &nbsp;} <br/><br/> &nbsp; &nbsp;/** <br/> &nbsp; &nbsp; * function that can be overridden to handle debug output <br/> &nbsp; &nbsp; * by default debug info is print to the screen <br/> &nbsp; &nbsp; * <br/> &nbsp; &nbsp; * @access private <br/> &nbsp; &nbsp; * @param $text string to output debug info <br/> &nbsp; &nbsp; */ <br/> &nbsp; &nbsp;function _debug($text) <br/> &nbsp; &nbsp;{ <br/> &nbsp; &nbsp; &nbsp; &nbsp;print $text . &quot;&#92;r&#92;n&quot;; <br/> &nbsp; &nbsp;} <br/>} <br/>?&gt; </div><br/>Tags - <a href="tag.php?tag=php" rel="tag">php</a> , <a href="tag.php?tag=memcached" rel="tag">memcached</a>
]]>
</description>
</item><item>
<link>http://www.bizeway.net/read.php?&amp;guid=0#topreply</link>
<title><![CDATA[[评论] MemCached的PHP客户端操作类二]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.bizeway.net/read.php?&amp;guid=0#topreply</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>