我正在开发一个通过 cookie 或 PHP 会话为用户(即使他们没有登录)持续存在的购物车。users
因此,每当未登录的用户访问该站点时,我都会在表中创建一条新记录,carts
当carts_items
该用户将商品添加到购物车时,我会创建新记录,等等。
这些用户中的许多将永远不会返回,cookie 将过期并且生活还在继续,但这些表将填充无用的记录。
问题是:如何摆脱这些过期的 cookie 数据?
我正在开发一个通过 cookie 或 PHP 会话为用户(即使他们没有登录)持续存在的购物车。users
因此,每当未登录的用户访问该站点时,我都会在表中创建一条新记录,carts
当carts_items
该用户将商品添加到购物车时,我会创建新记录,等等。
这些用户中的许多将永远不会返回,cookie 将过期并且生活还在继续,但这些表将填充无用的记录。
问题是:如何摆脱这些过期的 cookie 数据?
听起来您正在重新发明 PHP 会话。我建议只将购物车项目保留在数据库之外,而是保留在会话数组中。您可以根据需要将会话配置为持续多久。
长时间保留购物车物品有一些缺点 - 产品更改/被删除等,您需要在某个地方定期检查所有购物车物品仍然有效。
如果您必须将购物车项目存储在数据库中,那么您需要在每个页面视图上更新用户记录,并带有时间戳。使用它,您可以拥有一个 cron 作业/计划任务,该任务会删除时间戳为 X 天的用户和关联的购物车项目。
Cron 是 Linux/Unix 的一项功能,它允许您在设定的时间点安排任务。例如,如果您想每天凌晨 2 点调用清理脚本,那么您的 cronjob 可能如下所示:
* 2 * * * /path/to/php -q /path/to/script.php >/dev/null
来自维基百科:
* * * * * command to be executed
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ │
│ │ │ │ └───── day of week (0 - 7) (0 or 7 are Sunday, or use names)
│ │ │ └────────── month (1 - 12)
│ │ └─────────────── day of month (1 - 31)
│ └──────────────────── hour (0 - 23)
└───────────────────────── min (0 - 59)
使用 cron 作业,您可以删除过期和不必要的记录。例如:
$lastWeekStart = strtotime('-1 week');
和 sql 查询可能是这样的:
DELETE FROM users WHERE is_not_login = 1 AND updated_at < $lastWeekStart
您每周运行一次此脚本。