<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Beyond TTL: user-defined storage</title> </head> <body><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="mysqlnd-qc.cache-efficiency.html">Measuring cache efficiency</a></div> <div class="next" style="text-align: right; float: right;"><a href="mysqlnd-qc.setup.html">Installing/Configuring</a></div> <div class="up"><a href="mysqlnd-qc.quickstart.html">Quickstart and Examples</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div><hr /><div id="mysqlnd-qc.set-user-handlers" class="section"> <h2 class="title">Beyond TTL: user-defined storage</h2> <p class="para"> The query cache plugin supports the use of user-defined storage handler. User-defined storage handler can use arbitrarily complex invalidation algorithms and support arbitrary storage media. </p> <p class="para"> All user-defined storage handlers have to provide a certain interface. The functions of the user-defined storage handler will be called by the core of the cache plugin. The necessary interface consists of seven public functions. Both procedural and object oriented user-defined storage handler must implement the same set of functions. </p> <p class="para"> <div class="example" id="example-1859"> <p><strong>Example #1 Using a user-defined storage handler</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">/* Enable default caching of all statements */<br /></span><span style="color: #0000BB">ini_set</span><span style="color: #007700">(</span><span style="color: #DD0000">"mysqlnd_qc.cache_by_default"</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">/* Procedural user defined storage handler functions */<br /><br /></span><span style="color: #0000BB">$__cache </span><span style="color: #007700">= array();<br /><br />function </span><span style="color: #0000BB">get_hash</span><span style="color: #007700">(</span><span style="color: #0000BB">$host_info</span><span style="color: #007700">, </span><span style="color: #0000BB">$port</span><span style="color: #007700">, </span><span style="color: #0000BB">$user</span><span style="color: #007700">, </span><span style="color: #0000BB">$db</span><span style="color: #007700">, </span><span style="color: #0000BB">$query</span><span style="color: #007700">) {<br /> global </span><span style="color: #0000BB">$__cache</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"\t%s(%d)\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">__FUNCTION__</span><span style="color: #007700">, </span><span style="color: #0000BB">func_num_args</span><span style="color: #007700">());<br /><br /> return </span><span style="color: #0000BB">md5</span><span style="color: #007700">(</span><span style="color: #0000BB">sprintf</span><span style="color: #007700">(</span><span style="color: #DD0000">"%s%s%s%s%s"</span><span style="color: #007700">, </span><span style="color: #0000BB">$host_info</span><span style="color: #007700">, </span><span style="color: #0000BB">$port</span><span style="color: #007700">, </span><span style="color: #0000BB">$user</span><span style="color: #007700">, </span><span style="color: #0000BB">$db</span><span style="color: #007700">, </span><span style="color: #0000BB">$query</span><span style="color: #007700">));<br />}<br /><br />function </span><span style="color: #0000BB">find_query_in_cache</span><span style="color: #007700">(</span><span style="color: #0000BB">$key</span><span style="color: #007700">) {<br /> global </span><span style="color: #0000BB">$__cache</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"\t%s(%d)\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">__FUNCTION__</span><span style="color: #007700">, </span><span style="color: #0000BB">func_num_args</span><span style="color: #007700">());<br /><br /> if (isset(</span><span style="color: #0000BB">$__cache</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">])) {<br /> </span><span style="color: #0000BB">$tmp </span><span style="color: #007700">= </span><span style="color: #0000BB">$__cache</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">];<br /> if (</span><span style="color: #0000BB">$tmp</span><span style="color: #007700">[</span><span style="color: #DD0000">"valid_until"</span><span style="color: #007700">] < </span><span style="color: #0000BB">time</span><span style="color: #007700">()) {<br /> unset(</span><span style="color: #0000BB">$__cache</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">]);<br /> </span><span style="color: #0000BB">$ret </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;<br /> } else {<br /> </span><span style="color: #0000BB">$ret </span><span style="color: #007700">= </span><span style="color: #0000BB">$__cache</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">][</span><span style="color: #DD0000">"data"</span><span style="color: #007700">];<br /> }<br /> } else {<br /> </span><span style="color: #0000BB">$ret </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">;<br /> }<br /><br /> return </span><span style="color: #0000BB">$ret</span><span style="color: #007700">;<br />}<br /><br />function </span><span style="color: #0000BB">return_to_cache</span><span style="color: #007700">(</span><span style="color: #0000BB">$key</span><span style="color: #007700">) {<br /> </span><span style="color: #FF8000">/*<br /> Called on cache hit after cached data has been processed,<br /> may be used for reference counting<br /> */<br /> </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"\t%s(%d)\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">__FUNCTION__</span><span style="color: #007700">, </span><span style="color: #0000BB">func_num_args</span><span style="color: #007700">());<br />}<br /><br />function </span><span style="color: #0000BB">add_query_to_cache_if_not_exists</span><span style="color: #007700">(</span><span style="color: #0000BB">$key</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">$ttl</span><span style="color: #007700">, </span><span style="color: #0000BB">$run_time</span><span style="color: #007700">, </span><span style="color: #0000BB">$store_time</span><span style="color: #007700">, </span><span style="color: #0000BB">$row_count</span><span style="color: #007700">) {<br /> global </span><span style="color: #0000BB">$__cache</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"\t%s(%d)\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">__FUNCTION__</span><span style="color: #007700">, </span><span style="color: #0000BB">func_num_args</span><span style="color: #007700">());<br /><br /> </span><span style="color: #0000BB">$__cache</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">] = array(<br /> </span><span style="color: #DD0000">"data" </span><span style="color: #007700">=> </span><span style="color: #0000BB">$data</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"row_count" </span><span style="color: #007700">=> </span><span style="color: #0000BB">$row_count</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"valid_until" </span><span style="color: #007700">=> </span><span style="color: #0000BB">time</span><span style="color: #007700">() + </span><span style="color: #0000BB">$ttl</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"hits" </span><span style="color: #007700">=> </span><span style="color: #0000BB">0</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"run_time" </span><span style="color: #007700">=> </span><span style="color: #0000BB">$run_time</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"store_time" </span><span style="color: #007700">=> </span><span style="color: #0000BB">$store_time</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"cached_run_times" </span><span style="color: #007700">=> array(),<br /> </span><span style="color: #DD0000">"cached_store_times" </span><span style="color: #007700">=> array(),<br /> );<br /><br /> return </span><span style="color: #0000BB">TRUE</span><span style="color: #007700">;<br />}<br /><br />function </span><span style="color: #0000BB">query_is_select</span><span style="color: #007700">(</span><span style="color: #0000BB">$query</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"\t%s('%s'): "</span><span style="color: #007700">, </span><span style="color: #0000BB">__FUNCTION__</span><span style="color: #007700">, </span><span style="color: #0000BB">$query</span><span style="color: #007700">);<br /><br /> </span><span style="color: #0000BB">$ret </span><span style="color: #007700">= </span><span style="color: #0000BB">FALSE</span><span style="color: #007700">;<br /> if (</span><span style="color: #0000BB">stristr</span><span style="color: #007700">(</span><span style="color: #0000BB">$query</span><span style="color: #007700">, </span><span style="color: #DD0000">"SELECT"</span><span style="color: #007700">) !== </span><span style="color: #0000BB">FALSE</span><span style="color: #007700">) {<br /> </span><span style="color: #FF8000">/* cache for 5 seconds */<br /> </span><span style="color: #0000BB">$ret </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">;<br /> }<br /><br /> </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"%s\n"</span><span style="color: #007700">, (</span><span style="color: #0000BB">FALSE </span><span style="color: #007700">=== </span><span style="color: #0000BB">$ret</span><span style="color: #007700">) ? </span><span style="color: #DD0000">"FALSE" </span><span style="color: #007700">: </span><span style="color: #0000BB">$ret</span><span style="color: #007700">);<br /> return </span><span style="color: #0000BB">$ret</span><span style="color: #007700">;<br />}<br /><br />function </span><span style="color: #0000BB">update_query_run_time_stats</span><span style="color: #007700">(</span><span style="color: #0000BB">$key</span><span style="color: #007700">, </span><span style="color: #0000BB">$run_time</span><span style="color: #007700">, </span><span style="color: #0000BB">$store_time</span><span style="color: #007700">) {<br /> global </span><span style="color: #0000BB">$__cache</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"\t%s(%d)\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">__FUNCTION__</span><span style="color: #007700">, </span><span style="color: #0000BB">func_num_args</span><span style="color: #007700">());<br /><br /> if (isset(</span><span style="color: #0000BB">$__cache</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">])) {<br /> </span><span style="color: #0000BB">$__cache</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">][</span><span style="color: #DD0000">'hits'</span><span style="color: #007700">]++;<br /> </span><span style="color: #0000BB">$__cache</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">][</span><span style="color: #DD0000">"cached_run_times"</span><span style="color: #007700">][] = </span><span style="color: #0000BB">$run_time</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">$__cache</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">][</span><span style="color: #DD0000">"cached_store_times"</span><span style="color: #007700">][] = </span><span style="color: #0000BB">$store_time</span><span style="color: #007700">;<br /> }<br />}<br /><br />function </span><span style="color: #0000BB">get_stats</span><span style="color: #007700">(</span><span style="color: #0000BB">$key </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">) {<br /> global </span><span style="color: #0000BB">$__cache</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"\t%s(%d)\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">__FUNCTION__</span><span style="color: #007700">, </span><span style="color: #0000BB">func_num_args</span><span style="color: #007700">());<br /><br /> if (</span><span style="color: #0000BB">$key </span><span style="color: #007700">&& isset(</span><span style="color: #0000BB">$__cache</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">])) {<br /> </span><span style="color: #0000BB">$stats </span><span style="color: #007700">= </span><span style="color: #0000BB">$__cache</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">];<br /> } else {<br /> </span><span style="color: #0000BB">$stats </span><span style="color: #007700">= array();<br /> foreach (</span><span style="color: #0000BB">$__cache </span><span style="color: #007700">as </span><span style="color: #0000BB">$key </span><span style="color: #007700">=> </span><span style="color: #0000BB">$details</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$stats</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">] = array(<br /> </span><span style="color: #DD0000">'hits' </span><span style="color: #007700">=> </span><span style="color: #0000BB">$details</span><span style="color: #007700">[</span><span style="color: #DD0000">'hits'</span><span style="color: #007700">],<br /> </span><span style="color: #DD0000">'bytes' </span><span style="color: #007700">=> </span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$details</span><span style="color: #007700">[</span><span style="color: #DD0000">'data'</span><span style="color: #007700">]),<br /> </span><span style="color: #DD0000">'uncached_run_time' </span><span style="color: #007700">=> </span><span style="color: #0000BB">$details</span><span style="color: #007700">[</span><span style="color: #DD0000">'run_time'</span><span style="color: #007700">],<br /> </span><span style="color: #DD0000">'cached_run_time' </span><span style="color: #007700">=> (</span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$details</span><span style="color: #007700">[</span><span style="color: #DD0000">'cached_run_times'</span><span style="color: #007700">]))<br /> ? </span><span style="color: #0000BB">array_sum</span><span style="color: #007700">(</span><span style="color: #0000BB">$details</span><span style="color: #007700">[</span><span style="color: #DD0000">'cached_run_times'</span><span style="color: #007700">]) / </span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$details</span><span style="color: #007700">[</span><span style="color: #DD0000">'cached_run_times'</span><span style="color: #007700">])<br /> : </span><span style="color: #0000BB">0</span><span style="color: #007700">,<br /> );<br /> }<br /> }<br /><br /> return </span><span style="color: #0000BB">$stats</span><span style="color: #007700">;<br />}<br /><br />function </span><span style="color: #0000BB">clear_cache</span><span style="color: #007700">() {<br /> global </span><span style="color: #0000BB">$__cache</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"\t%s(%d)\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">__FUNCTION__</span><span style="color: #007700">, </span><span style="color: #0000BB">func_num_args</span><span style="color: #007700">());<br /><br /> </span><span style="color: #0000BB">$__cache </span><span style="color: #007700">= array();<br /> return </span><span style="color: #0000BB">TRUE</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">/* Install procedural user-defined storage handler */<br /></span><span style="color: #007700">if (!</span><span style="color: #0000BB">mysqlnd_qc_set_user_handlers</span><span style="color: #007700">(</span><span style="color: #DD0000">"get_hash"</span><span style="color: #007700">, </span><span style="color: #DD0000">"find_query_in_cache"</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"return_to_cache"</span><span style="color: #007700">, </span><span style="color: #DD0000">"add_query_to_cache_if_not_exists"</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"query_is_select"</span><span style="color: #007700">, </span><span style="color: #DD0000">"update_query_run_time_stats"</span><span style="color: #007700">, </span><span style="color: #DD0000">"get_stats"</span><span style="color: #007700">, </span><span style="color: #DD0000">"clear_cache"</span><span style="color: #007700">)) {<br /> <br /> </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"Failed to install user-defined storage handler\n"</span><span style="color: #007700">);<br />}<br /><br /><br /></span><span style="color: #FF8000">/* Connect, create and populate test table */<br /></span><span style="color: #0000BB">$mysqli </span><span style="color: #007700">= new </span><span style="color: #0000BB">mysqli</span><span style="color: #007700">(</span><span style="color: #DD0000">"host"</span><span style="color: #007700">, </span><span style="color: #DD0000">"user"</span><span style="color: #007700">, </span><span style="color: #DD0000">"password"</span><span style="color: #007700">, </span><span style="color: #DD0000">"schema"</span><span style="color: #007700">, </span><span style="color: #DD0000">"port"</span><span style="color: #007700">, </span><span style="color: #DD0000">"socket"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-></span><span style="color: #0000BB">query</span><span style="color: #007700">(</span><span style="color: #DD0000">"DROP TABLE IF EXISTS test"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-></span><span style="color: #0000BB">query</span><span style="color: #007700">(</span><span style="color: #DD0000">"CREATE TABLE test(id INT)"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-></span><span style="color: #0000BB">query</span><span style="color: #007700">(</span><span style="color: #DD0000">"INSERT INTO test(id) VALUES (1), (2)"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"\nCache put/cache miss\n"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-></span><span style="color: #0000BB">query</span><span style="color: #007700">(</span><span style="color: #DD0000">"SELECT id FROM test WHERE id = 1"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">-></span><span style="color: #0000BB">fetch_assoc</span><span style="color: #007700">());<br /></span><span style="color: #0000BB">$res</span><span style="color: #007700">-></span><span style="color: #0000BB">free</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">/* Delete record to verify we get our data from the cache */<br /></span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-></span><span style="color: #0000BB">query</span><span style="color: #007700">(</span><span style="color: #DD0000">"DELETE FROM test WHERE id = 1"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"\nCache hit\n"</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-></span><span style="color: #0000BB">query</span><span style="color: #007700">(</span><span style="color: #DD0000">"SELECT id FROM test WHERE id = 1"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">-></span><span style="color: #0000BB">fetch_assoc</span><span style="color: #007700">());<br /></span><span style="color: #0000BB">$res</span><span style="color: #007700">-></span><span style="color: #0000BB">free</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"\nDisplay cache statistics\n"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">mysqlnd_qc_get_cache_info</span><span style="color: #007700">());<br /><br /></span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"\nFlushing cache, cache put/cache miss"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">mysqlnd_qc_clear_cache</span><span style="color: #007700">());<br /><br /></span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-></span><span style="color: #0000BB">query</span><span style="color: #007700">(</span><span style="color: #DD0000">"SELECT id FROM test WHERE id = 1"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">-></span><span style="color: #0000BB">fetch_assoc</span><span style="color: #007700">());<br /></span><span style="color: #0000BB">$res</span><span style="color: #007700">-></span><span style="color: #0000BB">free</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above examples will output something similar to:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> query_is_select('DROP TABLE IF EXISTS test'): FALSE query_is_select('CREATE TABLE test(id INT)'): FALSE query_is_select('INSERT INTO test(id) VALUES (1), (2)'): FALSE Cache put/cache miss query_is_select('SELECT id FROM test WHERE id = 1'): 5 get_hash(5) find_query_in_cache(1) add_query_to_cache_if_not_exists(6) array(1) { ["id"]=> string(1) "1" } query_is_select('DELETE FROM test WHERE id = 1'): FALSE Cache hit query_is_select('SELECT id FROM test WHERE id = 1'): 5 get_hash(5) find_query_in_cache(1) return_to_cache(1) update_query_run_time_stats(3) array(1) { ["id"]=> string(1) "1" } Display cache statistics get_stats(0) array(4) { ["num_entries"]=> int(1) ["handler"]=> string(4) "user" ["handler_version"]=> string(5) "1.0.0" ["data"]=> array(1) { ["18683c177dc89bb352b29965d112fdaa"]=> array(4) { ["hits"]=> int(1) ["bytes"]=> int(71) ["uncached_run_time"]=> int(398) ["cached_run_time"]=> int(4) } } } Flushing cache, cache put/cache miss clear_cache(0) bool(true) query_is_select('SELECT id FROM test WHERE id = 1'): 5 get_hash(5) find_query_in_cache(1) add_query_to_cache_if_not_exists(6) NULL </pre></div> </div> </div> </p> </div><hr /><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="mysqlnd-qc.cache-efficiency.html">Measuring cache efficiency</a></div> <div class="next" style="text-align: right; float: right;"><a href="mysqlnd-qc.setup.html">Installing/Configuring</a></div> <div class="up"><a href="mysqlnd-qc.quickstart.html">Quickstart and Examples</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div></body></html>