当我们想到存储在 Web 应用程序我们首先想到的通常是一个传统的数据库如 MySQL。这是伟大的长期存储和数据分析,但有许多短期需要一个更好的选择 Memcached 的。这对于节约的页面请求之间的信息比特和提高性能的绝佳选择。在此介绍我们将向你展示如何开始使用 Memcached 和 PHP。
Memcached 的是简单地让你存储的东西在内存接口的服务器。这可以在同一台机器上运行,您的 Web 服务器,但可扩展性来自于跨多个服务器分布情况。所有你需要的是 Memcached 的守护进程运行和 PHP 提供了一个简单的接口与 PECL 库。在基于 Debian 的 Linux 系统,这是一样简单:
$ sudo apt-get install memcached
$ sudo service memcached start
$ sudo pecl install memcached
$ sudo service httpd restart
现在我们应该提到有技术上可与 Memcached 的工作,两个 PHP 库。旧的库称为 memcache,是缺乏某些功能的。较新的 memcached 库使用libmemcached 通常首选。
PHP 中的第一步是要连接到服务器。连接可以跨请求被持久化,这是很好的表现。然后添加到服务器列表中根据需要。在这种情况下,我们会在默认端口使用本地运行的实例:
function get_memcached() {
// Set a persistent connection ID
$mc = new Memcached('webapp');
// Set a short timeout (in milliseconds) so if the server goes down
// it doesn't take down our site with it
$mc->setOption(Memcached::OPT_CONNECT_TIMEOUT, 1000);
if ( !$mc->getServerList() ) {
if ( !$mc->addServer('localhost', 11211) ) {
error_log('Could not add memcached server.');
return false;
}
}
return $mc;
}
现在您可以读取和写入 PHP 变量来 Memcached 的基于您定义按键功能简单。他们将被序列化和反序列化自动。你可以不写资源,如数据库连接或结果集,但你可以把这些结果集到阵列和存储这些。
$mc->set('list', array(1, 2, 3));
$list = $mc->get('list');
比方说我们要存储的每个登录的用户最近访问过的 URL 列表。我们可以使用会话但不会跨设备工作,它会尽快会话被清除消失。我们可以使用一个数据库,但是这是缓慢的对这种数据的最有可能并不重要,以我们的系统。使用 Memcached 这很容易:
$user_id = 123; // The current user's ID
$recents = array();
if ($mc = get_memcached()) {
// Get any stored in memcached
$recents = $mc->get("recents-$user_id");
if (!$recents) {
$recents = array();
}
$recents[] = $_SERVER['REQUEST_URI'];
$recents = array_unique($recents);
$recents->set("recents-$user_id", $recents);
}
print_r($recents);
现在让我们真正提高你的通过缓存 Web 应用程序库的结果。数据库查询通常是在服务器处理的最大瓶颈,从而避免了缓存的结果在内存中重复的查询可以提供巨大的性能增益。最简单的方法是查询,只和主键存储。通常情况下这是最好的时候,数据库记录被更新,以便用户不会看到任何外的日期值的缓存值被删除。
function store_product($id, $name, $price) {
// Create or update the product in the database
$db = get_db();
$qry = $db->prepare('REPLACE INTO product (id, name, price) VALUES (:id, :name, :price)');
$qry->bindParam(':id', $id);
$qry->bindParam(':name', $name);
$qry->bindParam(':price', $price);
$qry->execute();
// Remove outdated values from cache if it's there
if ($mc = get_memcached()) {
$mc->delete("product-$id");
}
}
function get_product($id) {
$product = null;
// First check the cache
if ($mc = get_memcached()) {
$product = $mc->get("product-$id");
}
if (!$product) {
// Not in the cache; check the db
$qry = $db->prepare('SELECT * FROM product WHERE id = $id');
$qry->bindParam(':id', $id);
if ($qry->execute()) {
$product = $qry->fetch();
// Cache for future use
if ($mc) {
$mc->set("product-$id", $product);
}
}
}
return $product;
}
如同任何技术的选择也有局限性和活动注意:
还有更多你可以用 Memcached 的事:
给 Memcached 的一个尝试。在正确的情况下这是一个非常简单而有效的解决方案,以最大限度地提高您的 Web 应用程序的性能。