【问题标题】:Heroku PHP background workerHeroku PHP 后台工作者
【发布时间】:2017-05-01 09:32:17
【问题描述】:

在我的 heroku 应用程序中,我有一个需要超过 30 秒才能执行的任务,我无法增加执行时间,因为 heroku 不允许这样做。 我从前端的 API 获取数据,然后使用 AJAX 将其发送到服务器以将这些数据插入数据库。服务器中的这个过程需要 30 多秒才能完成,它给了我一个超时错误。

我创建了 Procfile 如下: worker: cd ~/www/ && ~/php/bin/php worker.php

worker.php 文件获取使用 AJAX 发送的数据,然后将其插入数据库。

我在 heroku 仪表板中启用了工作人员

我想要实现的是仅当我单击启动 ajax 调用的按钮时才启动此工作程序。我不想使用 heroku 调度程序,因为这个脚本每个月只会运行一次,或者在客户想要添加新产品时运行。 此外,如果我使用调度程序,我不知道如何将数据从 API 发送到服务器。

如果这不可能,有没有办法强制 heroku 增加执行时间?

谢谢

【问题讨论】:

  • ...为什么您需要它作为后台工作人员,而实际上它仅在 Ajax POST 进入时才被执行...就像通常的虚拟主机一样?
  • @Nick Li 因为整个应用程序冻结,直到插入数据库完成。我认为作为后台工作者不会发生这种情况
  • 我怀疑这是问题所在,即使您插入 100k 行也不应该花费 30 秒。从单个 Ajax 执行超过 30 秒,您的脚本规模可能证明有一个私有服务器是合理的。除了插入数据,你还用你的脚本做什么?
  • 好吧,我夸大了一点……但您可能需要优化插入 MySQL 的方式以减少执行时间,请查看其他帖子 stackoverflow.com/questions/19682414/…
  • @NickLi 这是脚本的确切活动。我将一个包含大约 7000 个对象的数组发送到服务器。然后我在这个数组中循环,对于每个对象 id,我检查该值是否已经存在于数据库中,如果它更新了,我用新值更新整行,如果没有,我将它作为新行插入。所以它不仅仅是插入

标签: php ajax heroku background-process worker


【解决方案1】:

您需要的是优化您的 sql 查询以减少执行时间。

根据您的评论描述,您尝试执行的操作是“UPSERT” - 更新现有行或如果不存在则插入。

试试 google sql upsert,你会发现更多信息。注意: upsert 可能意味着几种不同的情况,每种情况都需要以不同的方式处理。 read this article which helped me much on sql upsert

其他考虑因素是删除表的不必要索引,这会使插入变得更慢,因为如果没有捆绑,它会为每次插入重新索引。如果您仍在开发中,也适用于不必要的外键。

另一个旁注,在另一篇文章中它说通常 sql 可以处理 ~40k 插入/分钟,所以如果您插入超过 15-20k,大约 30 秒,您可能应该考虑使用私有服务器或者升级 heroku 允许更多可能适合您需要的资源或执行时间。

【讨论】:

    猜你喜欢
    • 2012-05-23
    • 1970-01-01
    • 2013-05-06
    • 2011-07-29
    • 1970-01-01
    • 2011-10-30
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多