IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

memcache-2.2.4 中的一点小知识

PHPor 的Blog 2010-07-26 23:44:37 累计浏览 2,624 次
本机暂存
在一次抓包的过程中,发现我的PHP在访问memcache的时候时不时的会多出一个“version”的操作,结果就是返回memcached的版本号;疑惑不解,我发誓自己没有写这部分代码的,为什么会凭空多出一个“version”操作呢?看看源代码吧!

    源码中发现这么一段:

    int mmc_open(mmc_t *mmc, int force_connect, char **error_string, int *errnum TSRMLS_DC) /* {{{ */

    {

     switch (mmc->status) {

    case MMC_STATUS_DISCONNECTED:

    return _mmc_open(mmc, error_string, errnum TSRMLS_CC);

    case MMC_STATUS_CONNECTED:

    return 1;

    case MMC_STATUS_UNKNOWN:

    /* check connection if needed */

    if (force_connect) {

      char *version;

      if ((version = mmc_get_version(mmc TSRMLS_CC)) == NULL && !_mmc_open(mmc, error_string, errnum TSRMLS_CC)) {

          break;

      }

      if (version) {

          efree(version);

      }

      mmc->status = MMC_STATUS_CONNECTED;

    }

    return 1;

    case MMC_STATUS_FAILED:

    if (mmc->retry_interval >= 0 && (long)time(NULL) >= mmc->failed + mmc->retry_interval) {

      if (_mmc_open(mmc, error_string, errnum TSRMLS_CC) /*&& mmc_flush(mmc, 0 TSRMLS_CC) > 0*/) {

          return 1;

      }

    }

    break;

     }

     return 0;

    }

    如果连接状态为MMC_STATUS_UNKNOWN 就会通过“version”操作来检查连接的状态。那么什么情况下连接的状态会是MMC_STATUS_UNKNOWN 呢?

    参看函数: mmc_find_persistent , 其逻辑大致为:

    1. 如果在hash表中没有查到该连接,则初始化一个连接句柄,并注册一个长连接

    2. 如果查到了,发现连接明显有一些问题,比如根本没有成功连接,则从hash表中删除,重新初始化、注册;

    3. 如果查到了,并且没有发现明显的错误标识,则将状态置为MMC_STATUS_UNKNOWN,如此则发送一个“version”命令检查连接的有效性。

    如此看来,如果长连接被重用,则一定会先有一个version命令的。

    由此也可以看出,长连接关闭被动关闭时,PHP是没有被通知的,(猜测一下,通常这种情况下,连接是半关闭状态的) 

同分类推荐文章

  1. Vibe新开源项目 - Vaala AI Gateway (2026-05-17 02:10:19)
  2. SmartPerfetto 架构文章 Q&A:8 个深度技术问答 (2026-04-10 11:00:00)
  3. 让 AI 把我的 PHP 博客重写成 Go (2026-03-27 18:33:54)

查看更多 后端 文章 →

建议继续学习

  1. 使用gettext来支持PHP的多语言 (累计阅读 39,190)
  2. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,091)
  3. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,347)
  4. 我的PHP,Python和Ruby之路 (累计阅读 13,068)
  5. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,728)
  6. 15个最好的免费开源电子商务平台 (累计阅读 12,464)
  7. Redis消息队列的若干实现方式 (累计阅读 12,006)
  8. 到底什么是MVC? (累计阅读 11,706)
  9. 整理了一份招PHP高级工程师的面试题 (累计阅读 11,470)
  10. Rolling cURL: PHP并发最佳实践 (累计阅读 11,428)