【问题标题】:Using long running Cron Jobs with Prestashop and Cloudflare CDN通过 Prestashop 和 Cloudflare CDN 使用长时间运行的 Cron 作业
【发布时间】:2017-01-12 10:15:38
【问题描述】:

所以我让 Cloudflare 和 Prestashop 一起运行以缩短加载时间,但是 CDN 的副作用是我的 cronjob 最多只能运行 90 秒。再长一点,Cloudflare 将发出 524 错误,并且无法正确启动 cronjob。

根据 Cloudflare 的说法,有两种方法可以解决此问题。我可以减小 cronjob 进程的大小,使其适合 90 秒的窗口(这不是一个选项),或者我可以在 Cloudflare 没有影响的单独子域上运行 cronjobs。然而,这个选项的问题在于 Prestashop 内置了一些东西,因此无论您使用哪个子域访问该站点,它都会简单地重定向到主域。

有没有人遇到过此类问题,如果有,解决问题的最佳方法是什么。谢谢!

【问题讨论】:

  • 你能把cron调用的文件的代码贴出来吗?
  • 我有几个不同的。一种获取客户数据库并将电子邮件导入 mailchimp,一种处理废弃的购物车电子邮件,另一种检查通过 DHL 和 UPS 的交付进度并相应地更新 prestashop 中的订单状态。

标签: cron timeout prestashop cdn cloudflare


【解决方案1】:

所有主机都以主要或次要的方式存在此问题。问题是 Web 服务器不能给单个线程一个未定义的进程时间,因为它可以在某个时候消耗所有服务器资源。

首先,您必须确保您的 cron 脚本能够从上次执行的地方继续。您可以定期保存 cron 正在处理的位置,然后当进程停止并重新启动时,它可以从它离开的地方继续。例如:如果您正在处理产品,您可以保存上次处理的产品 ID(在您的数据库或文件中),然后当您再次执行脚本时,它可以从上次处理的产品 ID 继续。

第二个主题是您必须多次执行 cron 以确保该过程完全完成。您可以进行计算,了解脚本完成执行所需的完整时间。例如:以 90 秒为周期的 30 分钟,那么您必须以 100 秒的间隔执行 cron 20 次。

要执行 cron,您有一些选择: - 托管管理面板配置。 - 操作系统选项。 - Prestashop 免费的 cronjob 模块。 - 第三方服务。

希望对你有帮助。

祝你好运。

【讨论】:

  • 这是一个有趣的概念,我一定会研究的,但我不确定如何去做。我使用的大多数 cron 作业都包含在各种 prestashop 模块中,因此理想情况下,我想找到一个不需要我修改模块即可使其正常工作的解决方案。
  • 你好。使用第三方服务计算您拥有的每个 cron 的频率和延迟。或者只是使用 Prestashop cronjob 模块。如果可以的话,增加您的托管超时。大多数 crons 不应该花费很长时间来完成。如果你能检测到哪个具体需要很长时间,它应该能够在中断后不总是从头开始。如果没有,你应该修改它。祝你好运。
【解决方案2】:

域重定向不在管理上下文中完成。 FrontOffice 上的每个控制器都会检查当前 URL 并在需要时重定向到规范的 URL(例如,如果域不是默认域)。但是 BackOffice 不存在这种机制。

然后,例如,如果您有一个主域www.example.com 和一个子域cron.example.com,如果您尝试访问cron.example.com/,您将被重定向到默认域,因为您尝试访问 FrontOffice。但是,如果您尝试访问后台的 cronjobs 模块,它将无需重定向 http://cron.example.com/admin-1f5zef1/index.php?controller=AdminCronJobs&token=7498b7d228cc3e630ee2fe6b34bd1638 即可工作。

在我的网站上测试并运行。

【讨论】:

  • 在这种情况下,我将如何通过管理区域运行我的 cronjobs,因为它们都有指向管理区域之外的模块的链接?
【解决方案3】:

所以经过一段时间后,我设法解决了这个问题。我不得不修改一些 prestashop 的控制器来为我的特定子域添加一个例外。我需要修改 shop.php (classes/shop/Shop.php) 第 370 行的 if 语句,使其看起来像这样(确保使用子域更新“exemption.myshop.com”:

 if ((!$id_shop && defined('_PS_ADMIN_DIR_')) || Tools::isPHPCLI() || in_array($http_host, $all_media) || $http_host == 'exemption.myshop.com') {

然后我不得不修改 frontController.php (classes/controllers/frontController.php) 中的两个函数。我需要将以下代码添加到 sslRedirection 和 canonicalRedirection 函数的顶部,高于每个函数内的所有其他内容。

        if (Tools::getHttpHost() == 'exemption.myshop.com'){
      return;
  }

然后我从主目录的缓存文件夹中删除了 class_index.php 并进行了更改。您可以通过访问子域来测试它是否有效,它应该在不更改url的情况下加载页面。

【讨论】:

    猜你喜欢
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2018-05-13
    • 1970-01-01
    相关资源
    最近更新 更多