有没有后台进程可以从插件运行,而不依赖于网站上的页面命中率,而不影响页面加载速度?

时间:2018-02-25 作者:beginner

我正在开发一个WordPress插件,希望运行一个后台任务来调用API并更新数据库表。现在,API只能一次性给出5个DB条目的结果,对于我表中的500个条目,我必须进行100个API调用。API允许TPS配额为1,并且每40分钟,它的旧响应就会过期,这意味着如果有任何条目超过40分钟,我需要通过进行新的API调用来更新我的表。而且,所有这些DB条目都必须以最新数据显示给页面查看器。

我提出的解决方案是安排一个cron任务,该任务每分钟运行一次,API一个接一个地调用25秒,然后终止,这样就不会超过PHP的最大执行时间限制。当客户到来时,他不必等待API调用或被API限制

但问题是我不能依赖wp-cron,因为它只有在页面命中时才会被调用(不像实际的cron,因为我是插件开发人员,所以我不能在客户的WordPress托管环境中安排系统cron)。此外,如果该用户在3小时内仅收到一个页面点击,则3小时内的第一个用户必须等待这些API调用完成(完全不理想,或者更好地说是可行的),否则他将无法显示数据。

有没有其他方法可以解决这个问题,即通过某种后台进程更新DB条目,既不会减慢客户端的速度,也不会依赖于页面加载。所以,即使一天有4个客户来,他们都会得到最新的数据(在过去40分钟内更新的数据),因为它已经在后台更新了?

2 个回复
SO网友:Mark Kaplun

您的设计没有任何理由,但您的问题的核心是(我假设)人们试图使用API的免费层,而不是为其使用支付适当的费用,并取消荒谬的限制。

无论如何,解决方案相当简单,每半小时运行一次cron,为导入过程分配无限的时间(并且您可能需要指示用户增加内存限制),然后循环,直到第二次延迟获得所有请求的数据http://php.net/manual/en/function.sleep.php 在每个请求之间。

即使最坏的情况是每个请求需要5秒钟才能完成,整个过程也应该在5分钟内完成。

至于用户视图,在获得所有信息之前,应该将新信息保持在某种不确定的状态,只有这样才能使其呈现出来。

SO网友:James John

禁止WP Cron在用户流量上运行。然后通过cron或其他地方的定时作业运行cron。您可以通过将此添加到wp-config.php

define(\'DISABLE_WP_CRON\', true);
然后设置cron作业以点击此URL-https://domain.com/wp-cron.php?doing_wp_cron 在您想要的时间间隔。快速wget 代码如下:

wget -q -O - https://domain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
我建议每一分钟,因为WordPress安装中的所有其他cron作业都将依赖于它

结束

相关推荐

自定义循环不起作用/WP Cron事件

我创建了一个wp cron事件,自定义间隔为5分钟,但它只每小时执行一次,而不是每5分钟执行一次。(回调已正确执行。)DISABLE\\u WP\\u CRON常量设置为true,WP CRON。php每5分钟通过crontab调用一次。(https://developer.wordpress.org/plugins/cron/hooking-into-the-system-task-scheduler/)调试中没有错误。日志(WP\\u DEBUG设置为true)。我用wordpress插件boilde