Home >Backend Development >PHP Tutorial >How to use Memcached in PHP, use Memcached in PHP_PHP tutorial
1. Introduction to memcached
Memcached is a high-performance distributed memory cache server. The general purpose of use is to increase the speed and scalability of dynamic web applications by caching database query results and reducing the number of database accesses. It can handle any number of connections and uses non-blocking network IO. Since its working mechanism is to open up a space in the memory and then create a HashTable, Memcached manages these HashTables by itself.
2. Memcached installation
The first thing is to download memcached. The latest version is 1.1.12. You can download memcached-1.1.12.tar.gz directly from the official website. In addition, memcached uses libevent, and I downloaded libevent-1.1a.tar.gz.
The next step is to unpack, compile and install libevent-1.1a.tar.gz and memcached-1.1.12.tar.gz respectively:
# tar -xzf libevent-1.1a.tar.gz # cd libevent-1.1a# ./configure --prefix=/usr# make# make install# cd .. # tar -xzf memcached-1.1.12.tar.gz# cd memcached-1.1.12 # ./configure --prefix=/usr# make# make install
After the installation is complete, memcached should be in /usr/bin/memcached.
3. Run the memcached daemon
Running the memcached daemon is very simple. It only requires a command line. There is no need to modify any configuration files (there are no configuration files for you to modify):
/usr/bin/memcached -d -m 128 -l 192.168.1.1 -p 11211 -u httpd
Parameter explanation:
-d runs memcached in daemon mode; -m sets the memory size that memcached can use, in M; -l sets the listening IP address. If it is the local machine, this parameter usually does not need to be set; -p sets the listening port, the default is 11211, so this parameter does not need to be set; -u specifies the user, if you are currently root, you need to use this parameter to specify the user.
Of course, there are other parameters that can be used. You can see them by running man memcached.
4. How memcached works
First of all, memcached runs as a daemon in one or more servers and accepts client connection operations at any time. Clients can be written in various languages. Currently known client APIs include Perl/PHP/Python/Ruby /Java/C#/C etc. After clients such as PHP establish a connection with the memcached service, the next thing is to access objects. Each accessed object has a unique identifier key. Access operations are performed through this key and saved to memcached. The objects in are actually placed in memory, not stored in cache files, which is why memcached can be so efficient and fast. Note that these objects are not persistent, and the data inside will be lost after the service is stopped.
5. How to use PHP as a memcached client
There are two ways to use PHP as a memcached client to call memcached services for object access operations.
First, PHP has an extension called memcache. When compiling under Linux, you need to bring the –enable-memcache[=DIR] option. Under Windows, remove the comment in front of php_memcache.dll in php.ini, so that its available.
In addition, there is another way to avoid the trouble caused by expansion and recompilation, and that is to use php-memcached-client directly.
This article uses the second method. Although the efficiency is slightly worse than the extension library, it is not a big problem.
6. PHP memcached application example
First download memcached-client.php. After downloading memcached-client.php, you can operate the memcached service through the class "memcached" in this file. In fact, the code call is very simple. The main methods used are add(), get(), replace() and delete(). The method description is as follows:
Copy code The code is as follows:
add ($key, $val, $exp = 0)
Write objects into memcached. $key is the unique identifier of the object. $val is the written object data. $exp is the expiration time in seconds. The default is unlimited time;
get ($key)
Get object data from memcached through the unique identifier $key of the object;
Copy code The code is as follows:
replace ($key, $value, $exp=0)
Use $value to replace the object content with the identifier $key in memcached. The parameters are the same as the add() method. It will only work if the $key object exists;
Copy code The code is as follows:
delete ($key, $time = 0)
Delete the object with the identifier $key in memcached. $time is an optional parameter, indicating how long to wait before deleting.
The following is a simple test code that accesses object data with the identifier 'mykey':
<?php // 包含 memcached 类文件 require_once('memcached-client.php'); // 选项设置 $options = array( 'servers' => array('192.168.1.1:11211'), //memcached 服务的地址、端口,可用多个数组元素表示多个 memcached 服务 'debug' => true, //是否打开 debug 'compress_threshold' => 10240, //超过多少字节的数据时进行压缩 'persistant' => false //是否使用持久连接 ); // 创建 memcached 对象实例 $mc = new memcached($options); // 设置此脚本使用的唯一标识符 $key = 'mykey'; // 往 memcached 中写入对象 $mc->add($key, 'some random strings'); $val = $mc->get($key); echo "n".str_pad('$mc->add() ', 60, '_')."n"; var_dump($val); // 替换已写入的对象数据值 $mc->replace($key, array('some'=>'haha', 'array'=>'xxx')); $val = $mc->get($key); echo "n".str_pad('$mc->replace() ', 60, '_')."n"; var_dump($val); // 删除 memcached 中的对象 $mc->delete($key); $val = $mc->get($key); echo "n".str_pad('$mc->delete() ', 60, '_')."n"; var_dump($val); ?>
Isn’t it very simple? In actual applications, the result set of the database query is usually saved in memcached, and the next time it is accessed, it is obtained directly from memcached instead of doing the database query operation. This can be done to a large extent. Reduce the burden on the database. Usually the value after the SQL statement md5() is used as the unique identifier key. Below is an example of using memcached to cache a database query result set (this code snippet follows the example code above):
<?php $sql = 'SELECT * FROM users'; $key = md5($sql); //memcached 对象标识符 if ( !($datas = $mc->get($key)) ) { // 在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。 echo "n".str_pad('Read datas from MySQL.', 60, '_')."n"; $conn = mysql_connect('localhost', 'test', 'test'); mysql_select_db('test'); $result = mysql_query($sql); while ($row = mysql_fetch_object($result)) $datas[] = $row; // 将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。 $mc->add($key, $datas); } else { echo "n".str_pad('Read datas from memcached.', 60, '_')."n"; } var_dump($datas); ?>
It can be seen that after using memcached, database connections and query operations can be reduced, the database load is reduced, and the running speed of the script is also improved.
I have written an article before called "PHP implements multi-server sharing of SESSION data". The SESSION in the article is saved in a database. When the number of concurrent visits is large, the load on the server will be very large, and it will often exceed the limit. The maximum number of MySQL connections. Using memcached, we can solve this problem very well. The working principle is as follows:
When a user accesses a web page, check whether there is the current user's SESSION data in memcached, and use session_id() as the unique identifier; if the data exists, it will be returned directly. If it does not exist, then connect to the database to obtain the SESSION data, and Save this data to memcached for next use; when the current PHP operation ends (or session_write_close() is used), the My_Sess::write() method will be called to write the data to the database. In this case, it will still be There will be database operations, and this method also needs to be optimized. Use a global variable to record the SESSION data when the user enters the page, and then compare this data in the write() method to see if it is the same as the SESSION data you want to write. If they are different, connect to the database and write it to the database, and at the same time, add the corresponding data in memcached. If the objects are deleted, if they are the same, it means that the SESSION data has not changed, so you can return it directly without doing any operation; So how to solve the user SESSION expiration time? Remember that memcached’s add() method has an expiration time parameter $exp? Just set this parameter value to be less than the maximum survival time of SESSION. In addition, don’t forget to extend the SESSION duration for those users who are always online. This can be solved in the write() method. By judging the time, the database data will be updated if the conditions are met.
The above content is the editor’s introduction to how to use Memcached in PHP. I hope it will be helpful to you!