【问题标题】:How to check if memcache or memcached is installed for PHP?如何检查是否为 PHP 安装了 memcache 或 memcached?
【发布时间】:2010-11-30 14:58:45
【问题描述】:

如何测试我的 Apache 网络服务器上是否安装了 memcachememcached(用于 PHP)?

Memcache 是一个缓存守护进程,专为 动态 Web 应用程序以减少数据库负载 将对象存储在内存中。

【问题讨论】:

    标签: php apache scripting webserver


    【解决方案1】:

    您可以查看 phpinfo() 或检查 memcache 的任何功能是否可用。最后,检查Memcache类是否存在。

    例如

    if(class_exists('Memcache')){
      // Memcache is enabled.
    }
    

    【讨论】:

    • 好消息,但请记住,所有 class_exists 函数都在告诉您在定义的包含/需要层次结构中是否有任何名为 Memcache 的类。
    • 其他类名本身是否会是“memcache”?有没有框架或库可以做到这一点?
    • @Jeremy 我从来没有见过其他叫 memcache 的东西,所以你很可能是安全的,尤其是你在页面上只有 class_exists()
    • 替代方案将检查扩展版本? phpversion('memcache')
    • 更好的是:if(class_exists('Memcache',false)) 与 autoload() 配合得很好
    【解决方案2】:

    为什么不使用extension_loaded() 函数?

    【讨论】:

    • 这比使用class_exists好多了!
    • 仅仅因为加载了扩展并不意味着它会真正起作用。
    【解决方案3】:

    使用此代码不仅可以检查是否启用了 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
    • +1 用于发布实际测试有效内存缓存守护进程的唯一答案,而不仅仅是检查 PHP 扩展是否存在。
    • 提醒 Memcache != Memcached,所以如果你想测试 Memcached,除了使用 class_exists('Memcached'),你还必须 $memcache->addServer($server , 11211, 1);而不是 ->connect(),并执行 ->set('data', $aData, 300);而不是上面的 ->set()。
    【解决方案4】:

    我知道这是一个旧线程,但我发现另一种方法对任何扩展都很有用。

    运行

    php -m | grep &lt;module_name&gt;

    在这种特殊情况下:

    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在这个列表中。

    【讨论】:

    • 我不认为这会告诉你 memcached 守护进程是否真的在运行... :-(
    • @Simon,这是正确的。如果要检查 memcache 是否正在运行,可以运行:ps -ef | grep memcache 只要您拥有正确的权限(我以 root 身份运行),这将在 Linux 上运行。
    【解决方案5】:

    请注意,所有class_existsextensions_loadedfunction_exists检查PHPmemcache 包之间的链接

    要真正检查是否安装了 memcache,您必须:

    • 了解操作系统平台,使用shell命令查看是否安装了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
    }
    

    【讨论】:

      【解决方案6】:

      你有几个选择;)

      $memcache_enabled = class_exists('Memcache');
      $memcache_enabled = extension_loaded('memcache');
      $memcache_enabled = function_exists('memcache_connect');
      

      【讨论】:

        【解决方案7】:

        通过命令行查看它是否也在 PHP 中运行可能是相关的-

        <path-to-php-binary>php -i | grep memcache
        

        【讨论】:

          【解决方案8】:

          我合并、缩小和扩展(更多检查)来自@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');
          

          【讨论】:

            【解决方案9】:

            在这种情况下,最好的方法是使用 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

            希望这会有所帮助。

            【讨论】:

            • 当然 extension_loaded("memcached") 是“正确”的方式。
            • 我不认为这会告诉你 memcache 守护进程是否真的在运行... :-(
            • if(extension_loaded('memcached')) { echo 'Memcached 加载'; }
            【解决方案10】:

            这是我用来检查服务器上的 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) }
            

            表示一切正常

            干杯!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-07-25
              • 2023-02-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-04-19
              相关资源
              最近更新 更多