如何强制删除Ubuntu VPS中PHP setcookie创建的所有Cookie并解决服务器卡顿
问题背景
每当新用户登录我的网站时,系统会创建有效期为10天的Cookie,现在VPS中已有近百万个此类文件,导致CPU处理新请求时查找Cookie耗时过长,服务器濒临崩溃。
相关代码(来自Kahuk CMS的libs/login.php)
function SetIDCookie($what, $remember) { global $db; $domain = preg_replace('/^www/','',$_SERVER['HTTP_HOST']); // 移除端口信息 $port = strpos($domain, ':'); if ($port !== false) $domain = substr($domain, 0, $port); if (!strstr($domain,'.') || strpos($domain,'localhost:')===0) $domain=''; switch ($what) { case 0: // 清除Cookie,退出登录 setcookie ("mnm_user", "", time()-3600, "/",$domain); // 使Cookie过期 setcookie ("mnm_key", "", time()-3600, "/",$domain); // 使Cookie过期 setcookie ("mnm_data", "", time()-3600, "/",$domain); // 使Cookie过期 setcookie ("mnm_user", "", time()-3600, "/"); // 使Cookie过期 setcookie ("mnm_key", "", time()-3600, "/"); // 使Cookie过期 setcookie ("mnm_data", "", time()-3600, "/"); // 使Cookie过期 break; case 1: // 用户登录,更新Cookie // 注意:当数据库密码改为MD5时需修改此处 $strCookie=base64_encode(join(':', array( $this->user_login, crypt($this->user_login, 22), $this->md5_pass) ) ); if($remember){ $time = time() + (60 * 60 * 24 * 10); // 若登录时勾选记住我,Cookie10天后过期(86400=1天) } else { $time = 0; // Cookie在浏览器会话结束时过期。注意:这可能取决于浏览器设置,例如Chrome勾选“继续上次会话”时Cookie不会过期。 } // 设置httponly和secure为true,增强Cookie安全性 if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') { setcookie('mnm_user', $this->user_login, $time, '/',$domain, TRUE, TRUE); setcookie('mnm_key', $strCookie, $time, '/',$domain, TRUE, TRUE); setcookie('mnm_data', md5(sha1($this->ip.':'.$this->user_agent)), $time, '/', $domain, TRUE, TRUE); } else { setcookie('mnm_user', $this->user_login, $time, '/',$domain, FALSE, TRUE); setcookie('mnm_key', $strCookie, $time, '/',$domain, FALSE, TRUE); setcookie('mnm_data', md5(sha1($this->ip.':'.$this->user_agent)), $time, '/', $domain, FALSE, TRUE); } break; } }
补充说明
服务器中的会话文件截图:
解决方法
1. 批量删除服务器上的会话文件
首先确认会话文件的存储路径:
- 执行命令查看当前PHP会话存储目录:
php -i | grep session.save_path - 批量删除过期文件(保留最近7天的,可根据Cookie有效期调整):
find /var/lib/php/sessions/ -type f -mtime +7 -delete - 若需强制删除所有会话文件(会让所有在线用户强制登出,谨慎操作):
rm -rf /var/lib/php/sessions/*
2. 配置PHP自动清理过期会话
修改php.ini中的以下参数,让PHP自动回收过期会话:
session.gc_probability = 1:设置垃圾回收触发概率(默认1,即1%的请求会触发回收)session.gc_divisor = 100:配合上一参数,触发概率为gc_probability/gc_divisor,请求量大时可调小该值提高回收频率session.gc_maxlifetime = 864000:设置会话过期时间,与Cookie有效期保持一致(10天,单位秒)
修改后重启PHP服务(示例:systemctl restart php8.2-fpm,根据实际PHP版本调整)。
3. 优化CMS的Cookie处理逻辑
从现有代码看,退出登录时重复执行了两次Cookie清除操作(带domain和不带domain),可优化这部分逻辑确保Cookie能正确过期;同时检查是否存在会话文件未被正常回收的场景,比如用户未主动退出时,过期会话是否能被PHP自动清理。
4. 改用内存型存储介质存储会话
将会话存储从文件系统改为Redis或Memcached,可大幅提升会话查找和管理效率,避免大量文件导致的IO瓶颈。
内容的提问来源于stack exchange,提问作者Shah Alom
相关产品推荐
相关产品推荐

