多次调用一个函数而不等待它完成

Posted

技术标签:

【中文标题】多次调用一个函数而不等待它完成【英文标题】:Call a function multiple times without waiting for it to complete 【发布时间】:2014-06-21 10:55:07 【问题描述】:

我有一个 cron 作业,它调用一个脚本,该脚本迭代一些项目并每分钟将它们作为帖子提交给 Facebook Graph API。问题是,每次通话都需要几秒钟。如果在一分钟内发送到 API 的帖子超过 10 个,则脚本运行时间超过一分钟,然后在脚本在下一分钟再次开始运行时开始导致问题。

一般流程是这样的: 1.每个facebook个人资料每小时发布一次 2. 这些个人资料中的每一个都有一个“发布分钟”,即他们发布的小时中的分钟 3. cron 作业每分钟运行一次,以查看应该发布哪些配置文件,任何给定的分钟,然后发布给他们

我的问题:是否可以在调用下面的 $facebook->api(...) 方法后立即继续脚本,而不是等待它完成后再继续?这样它就可以确保在给定的分钟内发布到所有配置文件,而不是潜在地冒着发布太多配置文件和脚本超过 60 秒的风险。

$profilesThatNeedToBePostedTo = getProfilesToPostTo(date(i));
foreach($profilesThatNeedToBePostedTo as $profile)

    $facebook->api($endPoint, 'POST', $postData); // $postData and $endPoint omitted for brevity

【问题讨论】:

【参考方案1】:

您要问的是是否可以在 php 中进行异步调用。这里有一些解决方案:Asynchronous PHP calls

只是指出没有最可靠的选择。

不限制每次发帖次数为 9 次,减少超过 60 秒的次数。但是如果 Facebook Graph 很慢,会发生什么?你做什么工作?

或者运行你的代码 60 秒,一旦达到 60 秒,关闭函数。并让它下次再次运行。

【讨论】:

我需要他们都在他们应该发布的那一刻发布。数据库存储一个 posting_minute 字段(0 到 59),每分钟检索当前分钟的配置文件,然后发布。因此,例如,如果现在是上午 10:15,脚本运行并发布了 9 个 posting_minute 为 15 的项目,并且还有 5 个要发布,这将不起作用,因为下一分钟只会拉取已经发布的帖子上午 10:16 发布。 我会将发布所需的所有帖子放入队列中。而另一个 cron 将负责将数据发布到 Facebook Graph。这是采用此类解决方案的安全方法。因此,如果出现问题,或者 Facebook 不会回答。根据队列中的内容,您知道需要发布的内容。【参考方案2】:

我不确定我是否清楚地理解了你的问题。你的意思是你想每分钟运行一次 cronjob。但是,调用 facebook API 需要超过 1 分钟。您的意思是 foreach 循环可能会延迟您的 cronjob 吗? 如果是这样,我想知道你是否做了一个正确的 cronjob 脚本,最好展示你的 cronjob 脚本。因为我认为 php 脚本不应该影响你的 sh 脚本(cronjob)

【讨论】:

以上是关于多次调用一个函数而不等待它完成的主要内容,如果未能解决你的问题,请参考以下文章

承诺等待得到解决而不返回

如何在.NET中调用异步函数而不等待它[重复]

如何从同步方法调用中回调而不等待它?

等待所有 firebase 调用使用 map 函数完成

如何在 Jquery 中多次调用一个函数来添加一个事件监听器而不只是监听最后一个?

量角器 - 等待异步完成