避免其他PHP缓存(APC)并发问题

避免其他PHP缓存(APC)并发问题,php,concurrency,apc,Php,Concurrency,Apc,我每秒在APC中存储很多变量。同时,我有一个CRON任务,它连续执行一个php进程,从APC读取变量,从APC删除变量,并将其存储在数据库中。php脚本获取由前缀标识的所有变量。 问题是,当一个PHP进程访问APC、读取所有变量、从APC中删除它们并将其插入数据库时,另一个进程(也是由CRON启动的)可能会读取相同的数据,因为它还没有被删除,我将复制数据库中的数据。有什么解决办法吗?可能是APC限制 提前谢谢 Mark首先,出于好奇,我想知道这个解决方案背后的原因!非常感兴趣 但这是定时作业的常

我每秒在APC中存储很多变量。同时,我有一个CRON任务,它连续执行一个php进程,从APC读取变量,从APC删除变量,并将其存储在数据库中。php脚本获取由前缀标识的所有变量。 问题是,当一个PHP进程访问APC、读取所有变量、从APC中删除它们并将其插入数据库时,另一个进程(也是由CRON启动的)可能会读取相同的数据,因为它还没有被删除,我将复制数据库中的数据。有什么解决办法吗?可能是APC限制

提前谢谢


Mark

首先,出于好奇,我想知道这个解决方案背后的原因!非常感兴趣

但这是定时作业的常见问题。您更严重的担忧是,如果您的一个cron作业需要很长时间才能完成,而另一个作业需要启动,那么它可能会使服务器上的负载增加一倍,完成时间会增加一倍,然后您可能会陷入一个循环,最终导致服务器停机。这是一个有趣的问题


我以前通过设置一个开关来解决这个问题,该开关通知代码上一个作业正在运行。作业完成后,卸下交换机,下次cron将再次运行。您可以将该开关置于APC中。

您首先不应该使用缓存。直接使用数据库。如果MySQL无法处理负载,可以切换到Postgres。有很多解决方案,从创建一个守护进程php进程,该进程有一个保存到APC的线程和一个保存数据到DB的线程。设置具有唯一约束的db将处理重复项。此外,上面我的评论中的建议是您应该忽略的,您应该首先关注并发工作。尽管消息队列听起来确实是正确的方法,只是为了简单和跟踪您当前的实现:当您说“另一个”cron时,你是说一个完全不同的作业,还是说同一个作业只是稍后(重叠)运行?#Denis,谢谢你的回答,但我们希望出现这样一种情况,即数据库无法管理所有这些负载。因此,我们希望使用APC创建一个缓冲区,并通过大数据块插入(而不是对每个请求进行插入)来存储一个进程。谢谢你的回答。#N.B谢谢你的回答,创建守护进程听起来不错,但我在守护进程和数据库方面有过不好的经历,因为在这么长的时间内保持打开的连接,因此,数据库内存负载会大大增加。不过,我会考虑的。您还提到了“唯一约束”。我的数据不会是唯一的。假设我正在收集数据以便以后分析。若我收集数据,可能会有重复的数据,但我不想分散数据,因为在数据库中插入数据时会出现并发问题。谢谢你的回答。你好,德肯,谢谢你的回答。我会记住你关于转换的想法。推理非常简单,我们希望收集大量数据并将其存储在数据库中。我们已经考虑过创建一个接收者:php,它负责处理请求并将其存储在APC中,而不是将其保存在数据库中,因为我们预计会有大量的流量,并且为每个请求执行一次插入操作会破坏我们的数据库。另一方面,我们有另一个php从APC读取大数据块,并将其以独特的插入方式存储到数据库中。谢谢你的回答!没问题,祝你好运。也许值得考虑对数据库进行一些负载测试和其他尽职调查,以证明您需要构建这样的解决方案。我只是担心你的解决方案可能会更加复杂,这会给你带来更多的麻烦。数据库开销非常小,我发现几乎总是代码和编写方式比数据库本身慢。30分钟的负载测试可以为您节省数天的开发时间和痛苦,您可以在之后添加APC解决方案,但祝您好运:)