Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-从外部API同步数据的Cron作业。我的方法如何?_Php_Mysql_Cron_Queue_Sync - Fatal编程技术网

PHP-从外部API同步数据的Cron作业。我的方法如何?

PHP-从外部API同步数据的Cron作业。我的方法如何?,php,mysql,cron,queue,sync,Php,Mysql,Cron,Queue,Sync,我正在开发一个基于PHP/MySQL的web应用程序,希望得到一些反馈。该应用程序是一个基于会员的网站,它使用本地数据库按天存储每个用户的数据。此数据来自外部API,需要每天自动同步,以便本地数据库具有最新数据。这就是我心目中的方法: 我有两个Cron工作: 队列生成器 排队工人 ..和3个数据库表: 用户数据存储到目前为止我拥有的任何用户数据(如果有的话) 用户详细信息所有成员的列表,其中包括我还没有数据的用户,也称为新注册 处理队列 队列生成器是一个PHP脚本,将通过Cron定期运行。它将:

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

我有两个Cron工作: 队列生成器

排队工人

..和3个数据库表: 用户数据存储到目前为止我拥有的任何用户数据(如果有的话)

用户详细信息所有成员的列表,其中包括我还没有数据的用户,也称为新注册

处理队列 队列生成器是一个PHP脚本,将通过Cron定期运行。它将:

比较用户详细信息和用户数据表,以确定哪些新用户我还没有任何数据。对于这些用户,它将建立一个从11月1日到现在的URL列表,并将它们插入到处理队列表中。这是因为我希望从年初开始为所有用户提供数据

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

这样,处理队列表将包含需要查询的所有URL的列表

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

选择处理队列表中的前20个项目,使用CURL multi、error check获取其内容,然后从表中删除前20行。我一次将其拆分为20个URL,因为如果我处理太多URL,脚本可能会挂起,或者我的主机可能会用猎枪敲我的门。 这也将通过Cron作业定期运行,因此我们的想法是数据同步应该是自动化的,用户应该拥有最新的数据。我的问题是:

我的方法论的总体思路是什么?这样做有副作用吗?我是一个没有CS背景的业余开发人员,所以总是热衷于获得批评和学习最佳实践=

当一个新用户注册时,我计划给他们一个电子邮件通知,你的数据可能需要xx分钟才能同步,同时将他们重定向到入门资源等。这对于我的初始版本来说可能没什么问题,但进一步说,我想改进它,以便用户在同步准备就绪或可以看到%的进度时收到电子邮件通知。我当前的解决方案是否能够轻松适应这种情况?或者我会头疼吗


感谢您的意见!非常非常感谢——我希望我已经解释清楚了

也许我能给你的最好建议是:吻!!不,我不是太深情,这代表着保持简单,愚蠢!这可以说是一个非常重要的工程原理。考虑到这一点,我要问的第一个问题是为什么是cron?当用户注册时,是否有可能让所有这些任务实时运行?如果是的话,我会说现在就这么做,不要再为cron操心了。如果您决定使用cron模块,我建议您:

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

嘿,罗宾,非常感谢你的回复。我当然可以在用户注册时启动该过程,但是我希望在前一天的每天早上12点获取新数据,因此我倾向于使用Cron作业。是否有更好/更容易的替代方案?感谢您提供的锁定文件提示-我一定会这样做,以防止启动多个作业:你提出了一个关于永久延长工作队列的重要观点!我的过程基本上就是从一堆不同的URL获取一个文本字符串,所以我应该没问题,尽管知道潜在的陷阱很好。好吧,看起来需要一个cron作业,我认为这可能是最简单的解决方案。我唯一的其他建议和我以前给你的一样——吻!感谢Robin,一旦用户注册,最简单的合并电子邮件通知的方法是什么?我想在用户详细信息表中添加一个状态列并跟踪它
也许这是一条路——尽管它看起来确实很复杂!您如何处理API故障?如果您的cron启动了,但API关闭了,现在有一天的数据没有导入,该怎么办?脚本是否检查前一天是否成功运行?