【发布时间】:2010-11-30 14:58:45
【问题描述】:
如何测试我的 Apache 网络服务器上是否安装了 memcache 或 memcached(用于 PHP)?
Memcache 是一个缓存守护进程,专为 动态 Web 应用程序以减少数据库负载 将对象存储在内存中。
【问题讨论】:
标签: php apache scripting webserver
如何测试我的 Apache 网络服务器上是否安装了 memcache 或 memcached(用于 PHP)?
Memcache 是一个缓存守护进程,专为 动态 Web 应用程序以减少数据库负载 将对象存储在内存中。
【问题讨论】:
标签: php apache scripting webserver
您可以查看 phpinfo() 或检查 memcache 的任何功能是否可用。最后,检查Memcache类是否存在。
例如
if(class_exists('Memcache')){
// Memcache is enabled.
}
【讨论】:
class_exists 函数都在告诉您在定义的包含/需要层次结构中是否有任何名为 Memcache 的类。
if(class_exists('Memcache',false)) 与 autoload() 配合得很好
为什么不使用extension_loaded() 函数?
【讨论】:
class_exists好多了!
使用此代码不仅可以检查是否启用了 memcache 扩展,还可以检查守护程序是否正在运行并能够成功存储和检索数据:
<?php
if (class_exists('Memcache')) {
$server = 'localhost';
if (!empty($_REQUEST['server'])) {
$server = $_REQUEST['server'];
}
$memcache = new Memcache;
$isMemcacheAvailable = @$memcache->connect($server);
if ($isMemcacheAvailable) {
$aData = $memcache->get('data');
echo '<pre>';
if ($aData) {
echo '<h2>Data from Cache:</h2>';
print_r($aData);
} else {
$aData = array(
'me' => 'you',
'us' => 'them',
);
echo '<h2>Fresh Data:</h2>';
print_r($aData);
$memcache->set('data', $aData, 0, 300);
}
$aData = $memcache->get('data');
if ($aData) {
echo '<h3>Memcache seem to be working fine!</h3>';
} else {
echo '<h3>Memcache DOES NOT seem to be working!</h3>';
}
echo '</pre>';
}
}
if (!$isMemcacheAvailable) {
echo 'Memcache not available';
}
?>
【讨论】:
php5-memcache PHP 库来检查这个而不是php5-memcached 代码片段也发布在gist.github.com/rungss/5185410
我知道这是一个旧线程,但我发现另一种方法对任何扩展都很有用。
运行
php -m | grep <module_name>
在这种特殊情况下:
php -m | grep memcache
如果你想列出所有 PHP 模块,那么:
php -m
根据您的系统,您会得到类似以下的输出:
[PHP Modules]
apc
bcmath
bz2
... lots of other modules ...
mbstring
memcache
... and still more modules ...
zip
zlib
[Zend Modules]
你可以看到memcache在这个列表中。
【讨论】:
请注意,所有class_exists、extensions_loaded 和function_exists仅检查PHP 和memcache 包之间的链接。
要真正检查是否安装了 memcache,您必须:
编辑 2:好的,实际上这是一个更简单的完整解决方案:
if (class_exists('Memcache')) {
$memcache = new Memcache;
$isMemcacheAvailable = @$memcache->connect('localhost');
}
if ($isMemcacheAvailable) {
//...
}
编辑:实际上你必须先强制 PHP 在警告中抛出错误。看看这个SO question 答案。
然后您可以通过以下方式测试连接:
try {
$memcache->connect('localhost');
} catch (Exception $e) {
// well it's not here
}
【讨论】:
你有几个选择;)
$memcache_enabled = class_exists('Memcache');
$memcache_enabled = extension_loaded('memcache');
$memcache_enabled = function_exists('memcache_connect');
【讨论】:
通过命令行查看它是否也在 PHP 中运行可能是相关的-
<path-to-php-binary>php -i | grep memcache
【讨论】:
我合并、缩小和扩展(更多检查)来自@Bijay Rungta 和@J.C. 的答案。伊纳西奥
<?php
if(!extension_loaded('Memcache'))
{
die("Memcache extension is not loaded");
}
if (!class_exists('Memcache'))
{
die('Memcache class not available');
}
$memcacheObj = new Memcache;
if(!$memcacheObj)
{
die('Could not create memcache object');
}
if (!$memcacheObj->connect('localhost'))
{
die('Could not connect to memcache server');
}
// testdata to store in memcache
$testData = array(
'the' => 'cake',
'is' => 'a lie',
);
// set data (if not present)
$aData = $memcacheObj->get('data');
if (!$aData)
{
if(!$memcacheObj->set('data', $testData, 0, 300))
{
die('Memcache could not set the data');
}
}
// try to fetch data
$aData = $memcacheObj->get('data');
if (!$aData)
{
die('Memcache is not responding with data');
}
if($aData !== $testData)
{
die('Memcache is responding but with wrong data');
}
die('Memcache is working fine');
【讨论】:
在这种情况下,最好的方法是使用 extension_loaded() 或 function_exists(),它们同样快。
您可以在此处查看证据:
https://github.com/dragoonis/ppi-framework/blob/master/Cache/Memcached.php#L140
请记住,某些 PHP 扩展(例如 APC)具有 php.ini 设置,即使扩展可能已加载,也可以禁用它们。 下面是一个如何检查的示例:
https://github.com/dragoonis/ppi-framework/blob/master/Cache/Apc.php#L79
希望这会有所帮助。
【讨论】:
这是我用来检查服务器上的 Memcache 的测试函数
<?php
public function test()
{
// memcache test - make sure you have memcache extension installed and the deamon is up and running
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$version = $memcache->getVersion();
echo "Server's version: ".$version."<br/>\n";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");
echo "Store data in the cache (data will expire in 10 seconds)<br/>\n";
$get_result = $memcache->get('key');
echo "Data from the cache:<br/>\n";
var_dump($get_result);
}
如果你看到这样的东西
Server's version: 1.4.5_4_gaa7839e
Store data in the cache (data will expire in 10 seconds)
Data from the cache:
object(stdClass)#3 (2) { ["str_attr"]=> string(4) "test" ["int_attr"]=> int(123) }
表示一切正常
干杯!
【讨论】: