PHP - 用于同步外部API数据的Cron Jobs。我的方法怎么样?

时间:2011-05-08 10:42:39

标签: php mysql cron queue sync

我正在对基于PHP / MySQL的网络应用程序进行一些反馈,我正在开发中。该应用程序是一个基于成员的站点,它使用本地数据库按天存储每个用户的数据。此数据来自外部API,需要每天自动同步,以便我的本地数据库具有最新数据。这是我想到的方法:

我有2个Cron Jobs:

  1. 队列生成器

  2. 队列工作者

  3. ..和3个数据库表:

    1. 用户数据(存储我目前所拥有的任何用户数据,如果有的话)。

    2. 用户详细信息(包含我尚未拥有数据的用户的所有成员列表,也称为新注册)。

    3. 处理队列
    4. Queue Builder 是一个PHP脚本,它将定期通过Cron运行。它会:

      • 比较用户详细信息用户数据表,以确定哪些新用户尚未拥有任何数据。对于这些用户,它将构建一个从1/1/11开始到当天的URL列表,并将它们插入到处理队列表中(这是因为我希望从一开始就有数据)我所有用户的一年)。

      • 分析用户数据表,查找上次同步每个用户数据的时间,并构建从上次同步日期到当天的网址列表。这些也将插入处理队列表。

      这样处理队列表将包含需要查询的所有网址的列表。

      队列工作者 也是一个PHP Cron脚本,它将:

      • 选择处理队列表中的前20个项目,使用CURL multi获取其内容,进行错误检查,然后从表中删除前20行。我一次将它分成20个网址,因为如果我处理的网址太多,脚本可能会挂起,或者我的主人可能会敲我的门上配备霰弹枪。

      这也将通过Cron作业定期运行,因此我们的想法是数据同步应该是自动化的,用户应该拥有最新的数据。我的问题是:

      1. 我的方法有哪些一般性的想法?这样做会有副作用吗?我是一个没有CS背景的业余爱好者,所以总是热衷于批评和学习最佳实践! =)

      2. 当一个新用户注册时,我打算给他们一个“你的数据需要xx分钟才能同步”,同时将它们重定向到Getting Started资源等。这对我的初始版本可能没问题,但是进一步下来该曲目我想对其进行优化,以便用户在同步准备就绪时收到电子邮件通知,或者可以看到%进度。我目前的解决方案是否容易适应这种情况?或者我会在赛道上头痛吗?

      3. 意见表示赞赏!很多,非常感谢提前 - 我希望我已经清楚地解释了这一点!

1 个答案:

答案 0 :(得分:0)

我能给你的最佳建议可能是:亲吻!不,我不是过分亲热,这代表“保持简单,愚蠢!”并且可以说是一个非常重要的工程原理。考虑到这一点,我要问的第一个问题是“为什么要用cron?”当用户注册时,是否可以实时运行所有这些任务?如果是的话,我现在就说现在就这样做,不要打扰cron。如果您决定使用cron模块,我建议您使用以下内容:

  • 考虑使用锁定文件来防止脚本的多个实例同时运行。例如,如果您每5分钟运行一次脚本,并且每次运行脚本需要10分钟才能完成,那么多个实例可能会相互干扰。
  • 使用curl multi可能会给目标服务器带来比在循环中发出单个请求更多的压力,如果你想对目标服务器有礼貌,那么最好使用单个请求并在循环中进行短暂睡眠。
  • 如果您一次只处理20个作业并且您的服务非常受欢迎,那么最终可能会有一个永久扩展的工作队列。例如,如果您每小时获取40个任务并且每小时仅处理20个任务,那么您将永远不会到达队列的末尾,并且队列永远不会完成。

HTH。