将长 运行 Cron 作业与 Prestashop 和 Cloudflare CDN 结合使用
Using long running Cron Jobs with Prestashop and Cloudflare CDN
所以我将 Cloudflare 和 Prestashop 运行 结合在一起以缩短加载时间,但是 CDN 的副作用是我的 cronjobs 最多只能 运行 90 秒。时间再长,Cloudflare 将发出 524 错误,cronjob 将无法正常启动。
根据 Cloudflare 的说法,有两种方法可以解决此问题。我可以减小 cronjob 进程的大小,使其适合 90 秒 window(这不是一个选项),或者我可以 运行 Cloudflare 对其没有影响的单独子域上的 cronjobs。然而,此选项的问题在于 Prestashop 内置了一些东西,因此无论您使用哪个子域访问该站点,它都只会重定向到主域。
有没有人遇到过此类问题?如果有,解决该问题的最佳方法是什么。谢谢!
所有主机都或多或少地存在这个问题。问题是 Web 服务器不能为单个线程提供未定义的处理时间,因为它可能会在某个时刻消耗所有服务器资源。
首先,您必须确保您的 cron 脚本能够从上次执行的位置继续执行。您可以在 cron 正在处理的地方定期保存,然后当进程停止并再次启动时,它可以从它离开的地方继续。例如:如果您正在处理产品,您可以保存最后处理的产品 ID(在您的数据库或文件中),然后当您再次执行脚本时,它可以从最后处理的产品 ID 继续。
第二个主题是您必须多次执行 cron 以确保该过程完全完成。您可以计算出脚本完成执行需要多少时间。例如:30 分钟 90 秒,那么你必须以 100 秒的间隔执行你的 cron 20 次。
要执行 cron,您有一些选择:
- 托管管理面板配置。
- 操作系统选项。
- Prestashop 免费的 cronjob 模块。
- 第三方服务。
希望对您有所帮助
祝你好运。
域重定向不是在管理上下文中完成的。 FrontOffice 上的每个控制器将检查当前 URL 并在需要时重定向到规范的控制器(例如,如果域不是默认域)。但是后台不存在这种机制。
然后,如果您有一个主域 www.example.com
和一个子域 cron.example.com
,如果您尝试访问 cron.example.com/
,您将被重定向到默认域,因为您尝试访问访问前台。但是,如果您尝试在后台访问 cronjobs 模块,它将在没有重定向的情况下工作 http://cron.example.com/admin-1f5zef1/index.php?controller=AdminCronJobs&token=7498b7d228cc3e630ee2fe6b34bd1638
.
在我的网站上进行了测试和工作。
经过一段时间后,我设法解决了这个问题。我不得不修改一些 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.
的情况下加载页面
所以我将 Cloudflare 和 Prestashop 运行 结合在一起以缩短加载时间,但是 CDN 的副作用是我的 cronjobs 最多只能 运行 90 秒。时间再长,Cloudflare 将发出 524 错误,cronjob 将无法正常启动。
根据 Cloudflare 的说法,有两种方法可以解决此问题。我可以减小 cronjob 进程的大小,使其适合 90 秒 window(这不是一个选项),或者我可以 运行 Cloudflare 对其没有影响的单独子域上的 cronjobs。然而,此选项的问题在于 Prestashop 内置了一些东西,因此无论您使用哪个子域访问该站点,它都只会重定向到主域。
有没有人遇到过此类问题?如果有,解决该问题的最佳方法是什么。谢谢!
所有主机都或多或少地存在这个问题。问题是 Web 服务器不能为单个线程提供未定义的处理时间,因为它可能会在某个时刻消耗所有服务器资源。
首先,您必须确保您的 cron 脚本能够从上次执行的位置继续执行。您可以在 cron 正在处理的地方定期保存,然后当进程停止并再次启动时,它可以从它离开的地方继续。例如:如果您正在处理产品,您可以保存最后处理的产品 ID(在您的数据库或文件中),然后当您再次执行脚本时,它可以从最后处理的产品 ID 继续。
第二个主题是您必须多次执行 cron 以确保该过程完全完成。您可以计算出脚本完成执行需要多少时间。例如:30 分钟 90 秒,那么你必须以 100 秒的间隔执行你的 cron 20 次。
要执行 cron,您有一些选择: - 托管管理面板配置。 - 操作系统选项。 - Prestashop 免费的 cronjob 模块。 - 第三方服务。
希望对您有所帮助
祝你好运。
域重定向不是在管理上下文中完成的。 FrontOffice 上的每个控制器将检查当前 URL 并在需要时重定向到规范的控制器(例如,如果域不是默认域)。但是后台不存在这种机制。
然后,如果您有一个主域 www.example.com
和一个子域 cron.example.com
,如果您尝试访问 cron.example.com/
,您将被重定向到默认域,因为您尝试访问访问前台。但是,如果您尝试在后台访问 cronjobs 模块,它将在没有重定向的情况下工作 http://cron.example.com/admin-1f5zef1/index.php?controller=AdminCronJobs&token=7498b7d228cc3e630ee2fe6b34bd1638
.
在我的网站上进行了测试和工作。
经过一段时间后,我设法解决了这个问题。我不得不修改一些 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.
的情况下加载页面