Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.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 需要关于cron作业的大型流程的建议吗_Php_Cron - Fatal编程技术网

Php 需要关于cron作业的大型流程的建议吗

Php 需要关于cron作业的大型流程的建议吗,php,cron,Php,Cron,我有一个PHP脚本,它从外部服务获取数据并将数据保存到我的数据库中。我需要这个脚本每分钟为系统中的每个用户运行一次,我希望这个系统中有数千名用户。我的问题是,每用户、每分钟运行此功能的最有效方式是什么?起初,我以为我会有一个从数据库中获取所有用户ID的函数,对ID进行迭代并为每个ID执行任务,但我认为随着用户数量的增加,这将需要更长的时间,并且不再在1分钟的时间间隔内完成。也许我应该将用户ID排队,并为每个ID分别执行任务?在这种情况下,我实际上不确定如何继续 提前谢谢你的建议 编辑 要回答Od

我有一个PHP脚本,它从外部服务获取数据并将数据保存到我的数据库中。我需要这个脚本每分钟为系统中的每个用户运行一次,我希望这个系统中有数千名用户。我的问题是,每用户、每分钟运行此功能的最有效方式是什么?起初,我以为我会有一个从数据库中获取所有用户ID的函数,对ID进行迭代并为每个ID执行任务,但我认为随着用户数量的增加,这将需要更长的时间,并且不再在1分钟的时间间隔内完成。也许我应该将用户ID排队,并为每个ID分别执行任务?在这种情况下,我实际上不确定如何继续

提前谢谢你的建议

编辑

要回答Oddthinking的问题:

我希望同时为每个用户启动流程。当每个用户的流程完成时,我想等待1分钟,然后再次开始流程。因此,我假设每个用户的每个进程都应该是异步的——用户1的进程不应该关心用户2的进程

回答西姆斯的问题:


我无法控制外部服务,并且外部服务的用户与数据库中的用户不同。恐怕我不懂任何其他脚本语言,所以我需要使用PHP来完成这项工作。

我的总结是否正确

你想每分钟完成数千项任务,但你不确定是否能按时完成

你需要决定当你开始超过你的时间表时该做什么

你会一直坚持到完成,然后立即重新开始吗? 你会一直坚持到完成,然后等一分钟,然后重新开始吗? 你是否会中止这个过程,不管它到哪里,然后重新开始? 是否降低频率(例如,从现在开始,每2分钟一次)? 您是否有两个进程同时运行,并希望下一次运行会更快如果您第一次清理积压工作,这可能会起作用,因此第二次运行会很快运行。
这些问题的答案取决于应用程序。根据答案,Cron可能不是适合您的工具。您最好让一个进程永久运行并自行安排时间。

我的总结是否正确

你想每分钟完成数千项任务,但你不确定是否能按时完成

你需要决定当你开始超过你的时间表时该做什么

你会一直坚持到完成,然后立即重新开始吗? 你会一直坚持到完成,然后等一分钟,然后重新开始吗? 你是否会中止这个过程,不管它到哪里,然后重新开始? 是否降低频率(例如,从现在开始,每2分钟一次)? 您是否有两个进程同时运行,并希望下一次运行会更快如果您第一次清理积压工作,这可能会起作用,因此第二次运行会很快运行。
这些问题的答案取决于应用程序。根据答案,Cron可能不是适合您的工具。让一个进程永久运行并自行调度可能会更好。

那么,让我直截了当地说:您在查询外部服务什么?肥皂MYSQL?数据库中每个用户每分钟一次,并将结果存储在同一数据库中。对吗

这似乎是一个设计问题

如果外部服务上的用户与数据库中的用户相同,那么可能应该更紧密地配置这两个用户。我不知道PHP是否是同步这些数据的方法。如果你提供更多细节,我们可以考虑另一种解决方案。如果您控制外部服务,您可能希望该服务转储其数据,甚至直接写入数据库。其他一些同步机制可能更好

编辑

似乎您正在制作一个应用程序,为用户存储数据,然后可以按时间顺序查看数据。否则,您也可以在用户请求时获取数据

获取go中的所有用户ID

假设所获取的数据对每个用户都是唯一的,则逐个迭代它们,在这里,您必须具有创造性,因为PHP线程不存在。请为每个请求调用一个进程,因为您希望所有请求都在同一时间执行,如果一个用户不返回数据,则不会延迟

该进程应在返回数据后立即将其插入数据库

至于cron是否适合这项工作:只要您有一个足够强大的服务器,可以同时处理数千个以上cron工作,您就可以了

您可以使用几个PHP脚本进行创作。我不确定,但如果对PHP的每个CLI调用都启动一个新的PHP进程,那么您可以这样做

foreach ($users as $user)
{
    shell_exec("php fetchdata.php $user");
}
这一切都非常繁重,您不应该期望用PHP快速完成。做一些测试。别相信我的话p> 那么,让我澄清一下:您正在查询外部服务什么?肥皂MYSQL?数据库中每个用户每分钟一次,并将结果存储在同一数据库中。对吗

这似乎是一个设计问题

如果外部服务上的用户与数据库中的用户相同,那么可能应该更紧密地配置这两个用户。我不知道PHP是否是同步这些数据的方法。如果你提供更多细节,我们可以考虑另一种解决方案。如果您控制外部服务,您可能希望该服务转储其数据,甚至直接写入数据库。其他一些同步机制可能更好

编辑

似乎您正在制作一个应用程序,为用户存储数据,然后可以按时间顺序查看数据。否则,您也可以在用户请求时获取数据

获取go中的所有用户ID

假设所获取的数据对每个用户都是唯一的,则逐个迭代它们,在这里,您必须具有创造性,因为PHP线程不存在。请为每个请求调用一个进程,因为您希望所有请求都在同一时间执行,如果一个用户不返回数据,则不会延迟

该进程应在返回数据后立即将其插入数据库

至于cron是否适合这项工作:只要您有一个足够强大的服务器,可以同时处理数千个以上cron工作,您就可以了

您可以使用几个PHP脚本进行创作。我不确定,但如果对PHP的每个CLI调用都启动一个新的PHP进程,那么您可以这样做

foreach ($users as $user)
{
    shell_exec("php fetchdata.php $user");
}

这一切都非常繁重,您不应该期望用PHP快速完成。做一些测试。不要相信我的话。

数据库是用来一次处理大量记录的。如果你一个接一个地处理它们,你就是在找麻烦。您需要找到一种方法来批量处理每一分钟的任务,以便通过执行单个复杂的查询,检索所有受影响用户的信息;然后,对结果进行PHP处理;然后,在另一个查询中,将结果推回到数据库中

数据库用于一次处理大量记录。如果你一个接一个地处理它们,你就是在找麻烦。您需要找到一种方法来批量处理每一分钟的任务,以便通过执行单个复杂的查询,检索所有受影响用户的信息;然后,对结果进行PHP处理;然后,在另一个查询中,将结果推回到数据库中

根据你的大局描述,听起来你有一个死胡同。如果你现在就可以让它工作,它很可能非常脆弱,根本无法扩展

我猜,如果您无法控制外部服务,那么外部服务可能不会因为受到您的脚本这样的重击而感到高兴。你有没有向他们提出你的总体计划


你真的需要每次都对所有用户进行测试吗?您是否可以使用任何类型的时间戳来更有选择性地选择哪些用户需要更新?如果你能更好地描述一下目标,我们可能会给出更具体的建议。

根据你的大局描述,听起来你的设计似乎没有出路。如果你现在就可以让它工作,它很可能非常脆弱,根本无法扩展

我猜,如果您无法控制外部服务,那么外部服务可能不会因为受到您的脚本这样的重击而感到高兴。你有没有向他们提出你的总体计划


你真的需要每次都对所有用户进行测试吗?您是否可以使用任何类型的时间戳来更有选择性地选择哪些用户需要更新?如果您能更好地描述一下目标,我们可能会给出更具体的建议。

鉴于您澄清希望同时运行用户处理

想到的最简单的解决方案是每个用户有一个线程。在Windows上,线程要比进程便宜得多

然而,无论您使用线程还是进程,让数千个线程同时运行几乎肯定是不可行的

相反,应该有一个线程池。池的大小取决于您的机器一次可以处理多少线程。我预计30-150这样的数字可能会达到你想要的程度,但这在很大程度上取决于硬件的容量,我可能会超出另一个数量级

每个线程将从共享队列中抓取下一个要处理的用户,对其进行处理,然后将其放回队列的末尾,可能还有一个不应处理的日期

根据处理的数量和类型,这可以在数据库的单独框中完成,以确保数据库不会因与数据库无关的处理而过载


此解决方案可确保始终处理尽可能多的用户,而不会使机器过载。随着用户数量的增加,处理用户的频率会降低,但总是以硬件允许的速度进行处理。

鉴于您希望同时运行用户处理的澄清

想到的最简单的解决方案是每个用户有一个线程。在Windows上,线程要比进程便宜得多

然而,无论您使用线程还是进程,让数千个线程同时运行几乎肯定是不可行的

相反,应该有一个线程池。池的大小取决于您的机器一次可以处理多少线程。我预计30-150这样的数字可能会达到你想要的程度,但这在很大程度上取决于硬件的容量,我可能会超出另一个数量级

每个线程将从共享队列中抓取下一个要处理的用户,对其进行处理,然后将其放回队列的末尾,可能还有一个不应处理的日期

根据处理的数量和类型,这可以在数据库的单独框中完成,以确保数据库不会因与数据库无关的处理而过载


此解决方案可确保始终处理尽可能多的用户,而不会使机器过载。随着用户数量的增加,处理用户的频率会降低,但总是尽可能快。

希望您有一台强大的DB服务器:P@Matt这让我们两个人:希望你有一个强壮的DB服务器:P@Matt这使我们两个:我不确定除了Cron之外,我还有什么选择可以拥有一个永久进程。实际上,这是一个计划任务,因为它是一台Windows机器。我还有哪些其他选项?其他一些选项包括:1首选:使其成为自动启动的Windows service=Unix守护程序,以便在机器启动时自动在后台运行-甚至在任何人登录之前,2仅运行执行作业的应用程序,并使其保持运行。3具有检查另一个副本是否已在运行的计划作业,如果已在运行,则自行关闭,以处理偶尔的崩溃。不管选择什么,进程都会完成它的工作,然后休眠直到它再次到期。我不确定除了Cron之外,我还有什么选择可以拥有一个永久进程。实际上,这是一个计划任务,因为它是一台Windows机器。我还有哪些其他选项?其他一些选项包括:1首选:使其成为自动启动的Windows service=Unix守护程序,以便在机器启动时自动在后台运行-甚至在任何人登录之前,2仅运行执行作业的应用程序,并使其保持运行。3具有检查另一个副本是否已在运行的计划作业,如果已在运行,则自行关闭,以处理偶尔的崩溃。无论选择什么,这个过程都会完成它的工作,然后睡眠直到它再次到期。