PECL / Memcache和PECL / Memcached

时间:2012-12-20 14:55:19

标签: php mysql memcached pecl

我在PHP设置中安装了两个PECL,当我php -V时,我看到两个都在运行。在我的/etc/php5/conf.d/文件夹中,这两个PECL都已启用。当我选中phpinfo时,我才知道PECL/Memcache已被使用,因为它已分配了端口号11211。两个PECL在.ini个文件中都有自己的配置,但只使用了一个。我知道我们不能同时使用两者,但我想一次测试两个PECL。我的问题是如何通过更改设置来测试这些PECL而不删除任何人。我想测试Memcache并禁用它并测试Memcached,然后再决定使用什么。有什么方法可以在不必删除的情况下完成它吗?

目前我正在使用PhpMemcachedAdmin来检查Memcached,它仍处于测试版和错误状态。如果有人可以向我推荐一些其他更好的工具那么它真的很有帮助。

3 个答案:

答案 0 :(得分:2)

您可以同时激活这两个扩展程序。 PECL MemcachePECL Memcached都是连接到Memcached 服务器的PHP 客户端

关于利弊

如前所述,Memcached构建在libmemcached上,由memcached服务器团队维护。人们说它更好,但到那天我无法验证这一点。

PECL内存缓存仍然有更好的PHP会话支持。

我发现(有点旧,但大部分仍然有效)比较图表here

修改

PHP正在使用其中一个扩展来连接到Memcached服务器。 以下是一些使用示例

PHP中的PECL Memcached使用示例

PECL Memcached class reference

// create PECL memcached Object
$m = new Memcached();

// add a server, connection is established lazily as far as I know
$m->addServer( 'localhost', 11211 );

// set values, those are written into your server's memory using the memcached server
$m->set( 'integer', 1 );
$m->set( 'intIncrement', 1 );
$m->set( 'intDecrement', 1 );
$m->set( 'string', 'I am a string' );
$m->set( 'array', array( 'a', 'b', 'c' ) );

// increment
$m->increment( 'intIncrement' );

// decrement
$m->decrement( 'intDecrement' );

// get values again
var_dump ( $m->get( 'integer' ) );
var_dump ( $m->get( 'intIncrement' ) );
var_dump ( $m->get( 'intDecrement' ) );
var_dump ( $m->get( 'string' ) );
var_dump ( $m->get( 'array' ) );

// delete values
$m->delete( 'integer' );
$m->delete( 'intIncrement' );
$m->delete( 'intDecrement' );
$m->delete( 'string' );
$m->delete( 'array' );

// close connection
$m->close();

PHP中的PECL Memcache用法示例

PECL Memcache class reference

这可以在同一个PHP脚本中!

// create PECL memcache object
$m = new Memcache;

// connect to the memcached server
$m->connect('localhost', 11211);

// set values
$m->set( 'integer', 1 );
$m->set( 'intIncrement', 1 );
$m->set( 'intDecrement', 1 );
$m->set( 'string', 'I am a string' );
$m->set( 'array', array( 'a', 'b', 'c' ) );

// increment
$m->increment( 'intIncrement' );

// decrement
$m->decrement( 'intDecrement' );

// get values again
var_dump ( $m->get( 'integer' ) );
var_dump ( $m->get( 'intIncrement' ) );
var_dump ( $m->get( 'intDecrement' ) );
var_dump ( $m->get( 'string' ) );
var_dump ( $m->get( 'array' ) );

// delete values
$m->delete( 'integer' );
$m->delete( 'intIncrement' );
$m->delete( 'intDecrement' );
$m->delete( 'string' );
$m->delete( 'array' );

// close connection
$m->close();

您还可以将对象存储到memcached中,查看有关object serialization以及PHP中magic class methods __sleep__wakeup()的文章

您可以很容易地看到,两个客户端的基本用法,PECL Memcached和Memcache非常相同。

答案 1 :(得分:1)

没有任何具体方法可以做到这一点。我不得不删除其中一个配置的符号链接以使用其他。只删除符号链接听起来可行的选项,而不是删除整个.ini文件,因为删除符号链接pecl变为非活动状态。

答案 2 :(得分:0)

我一定错过了“不能同时使用两者”的部分。谁给了你这个主意?它们是两个独立的扩展,具有单独的功能/对象。

跳过上面的内容,memcached使用起来要好得多,因为它实现了比memcache扩展更多的功能(cas是我最近使用过的其中一个并且浮现在脑海中)。

第二件事:持久连接?为什么要这么做? Memcache可以支持很多连接,它是为此而构建的。不需要持久连接。我们在同一个memcached服务器上点击量超过2k,在生产应用程序中没有问题。

PS:“当我检查phpinfo时,我开始知道PECL / Memcache被使用,因为它已经分配了端口号11211”是错误的。没有与扩展程序相关联的端口。 php扩展本身不是守护进程/服务(尽管你绝对可以在php中构建一个)。实际上,11211是内存缓存服务器的默认端口,而不是实际端口。