php - 神秘的 GC 缓存条目是什么意思

标签 php warnings apc

有时,我会收到这条奇怪的警告信息。它通常在页面重新加载时消失。这意味着什么。我用谷歌搜索但无济于事。

Warning: include(): GC cache entry '/.../...class.php' (dev=2049 ino=37120489) was on gc-list for 3840 seconds in /.../...class.php on line 111

最佳答案

这个问题肯定来自 APC,源代码来自 package apc-3.1.6-r1。当项目被插入到用户缓存或文件缓存中时,这个函数被调用。

static void process_pending_removals(apc_cache_t* cache TSRMLS_DC)
{
slot_t** slot;
time_t now;

/* This function scans the list of removed cache entries and deletes any
 * entry whose reference count is zero (indicating that it is no longer
 * being executed) or that has been on the pending list for more than
 * cache->gc_ttl seconds (we issue a warning in the latter case).
 */

if (!cache->header->deleted_list)
    return;

slot = &cache->header->deleted_list;
now = time(0);

while (*slot != NULL) {
    int gc_sec = cache->gc_ttl ? (now - (*slot)->deletion_time) : 0;

    if ((*slot)->value->ref_count <= 0 || gc_sec > cache->gc_ttl) {
        slot_t* dead = *slot;

        if (dead->value->ref_count > 0) {
            switch(dead->value->type) {
                case APC_CACHE_ENTRY_FILE:
                    apc_warning("GC cache entry '%s' (dev=%d ino=%d) was on gc-list for %d seconds" TSRMLS_CC,
                        dead->value->data.file.filename, dead->key.data.file.device, dead->key.data.file.inode, gc_sec);
                    break;
                case APC_CACHE_ENTRY_USER:
                    apc_warning("GC cache entry '%s'was on gc-list for %d seconds" TSRMLS_CC, dead->value->data.user.info, gc_sec);
                    break;
            }
        }
        *slot = dead->next;
        free_slot(dead TSRMLS_CC);
    }
    else {
        slot = &(*slot)->next;
    }
} 
}

来自 APC 配置 ( http://cz.php.net/manual/en/apc.configuration.php#ini.apc.gc-ttl )

apc.gc_ttl 整数

缓存条目可能保留在垃圾收集列表中的秒数。如果服务器进程在执行缓存的源文件时死机,此值提供故障保护;如果该源文件被修改,分配给旧版本的内存将不会被回收,直到达到此 TTL。设置为零以禁用此功能。

我们收到消息“GC 缓存条目 '%s' (dev=%d ino=%d) 在 gc-list 上持续 %d 秒”或“GC 缓存条目'%s'在 gc-list 上持续 % d 秒”在这种情况下:

(gc_sec > cache->gc_ttl) && (dead->value->ref_count > 0)

第一个条件意味着,项目在 apc.gc_ttl 秒前被删除,并且它仍在垃圾收集器列表中。秒条件意味着,项目仍然被引用。

例如当进程意外死亡时,引用不会减少。首先 apc.ttl 秒在 APC 缓存中处于事件状态,然后被删除(没有下一次命中此项目)。现在项目在垃圾收集器列表 (GC) 上并且 apc.gc_ttl 超时正在运行。当 apc.gc_ttl 小于(现在 - item_deletion_time)时,将写入警告并完全刷新项目。

尝试检查您的日志(网络服务器、php、系统/内核)是否存在严重错误,例如php,网络服务器段错误。

关于php - 神秘的 GC 缓存条目是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4656874/

相关文章:

c++ - 如果尝试使用功能,则会收到警告 C6385

php - apcu 和 suPHP - 可能吗?

macos - 升级 APC 以在 Zend Server 和 OSX 上使用 Symfony 2

c++ - 禁用关于在派生类的复制构造函数中显式初始化基构造函数的警告

xml - 如何在R中打开文件格式和文件扩展名不同的excel文件?

php - APC 可以替代什么?

php - TYPO3:如何在 Extbase 扩展中使用外部 PHP 库(不安装 composer)

php - mysql 全文搜索不起作用

php - 为什么我的 xdebug 没有样式?

php - PHP 中 HTML head 的最佳实践