Module 电子商务插件开发-如何定期检查平台数据库并调用外部API

Module 电子商务插件开发-如何定期检查平台数据库并调用外部API,module,content-management-system,prestashop,cron-task,Module,Content Management System,Prestashop,Cron Task,我正在为Prestashop开发一个模块,我将为Prestashop开发环境提供一个有效的前提:模块/插件可以通过一些钩子完成它的工作,比如Header、leftBar或BackOffice Header加载,所以显然没有办法完成我想做的事情: 我想定期(比如说每天)检查Prestashop数据库中的废弃购物车,并将其信息发送到外部API 我想到了一个我不太喜欢的解决方法,但对我来说似乎效率不高:插件安装了一个自定义数据库,该数据库将始终包含一行:在该行中将有当前日期。 每当用户访问网站时,插件

我正在为Prestashop开发一个模块,我将为Prestashop开发环境提供一个有效的前提:模块/插件可以通过一些钩子完成它的工作,比如Header、leftBar或BackOffice Header加载,所以显然没有办法完成我想做的事情: 我想定期(比如说每天)检查Prestashop数据库中的废弃购物车,并将其信息发送到外部API

我想到了一个我不太喜欢的解决方法,但对我来说似乎效率不高:插件安装了一个自定义数据库,该数据库将始终包含一行:在该行中将有当前日期。 每当用户访问网站时,插件都会在DB上检查该值:如果日期早于今天,则会将其更新为今天的日期。如果模块刚刚更新了该值,那么我将对DB和API调用进行检查,否则我将什么也不做(在一天的剩余时间内,因为该日期的所有其他检查都将失败,因为它已经更新)

有更好的方法吗

**********更新**********


因此存在一种方法:cron任务。现在我的疑问是:是否有可能在我的插件中集成cron计划?我需要的是,当有人安装我的插件时,他无事可做:我不想通过集成在Prestahsop后台的cron tasks manager将配置委托给他。Prestashop的问题似乎是,与Wordpress不同的是,Wordpress有一个独特的解决方案来实现这一点(),对于一般的网站目标来说,没有办法做到这一点,因此如果你想在自定义模块中实现这一点,你必须选择一个cron()

,我认为最好的方法是使用cron或webcron

您可以在模块上创建一个前端控制器来完成这项工作,并创建一个cron来每天执行一次控制器

如何创建前端控制器:

如果调用控制器cron,则可以调用它

  • 通过http for webcron:
  • 按crontab的shell:

    php -f [shop-folder]index.php "fc=module&module=[module-name]&controller=cron"
    
您也可以基于用户访问使用类似cron的系统,但我不建议在以下情况下使用此解决方案:

  • 您的任务可能很长:它可能会减慢访客的购物速度,并且您依赖于web服务器的时间限制
  • 时间安排很重要:您的任务将在您访问站点时运行
  • 独特性很重要:如果您同时有两次访问,您的任务可以被调用两次
没有内置的解决方案,也有相应的模块,但它无法解决您的问题,客户必须安装它们

我的解决办法是勾住页脚

public function hookFooter()
{
    // run cron every 12 hours
    $limit = time() - 12 * 60 * 60;
    $lastrun = Configuration::get('[module-name]-lastrun');
    if ($lastrun < $limit) {
        return '<script src="http://your.shop/module/[module-name]/cron" async></script>';
    }
}
公共函数hookFooter()
{
//每12小时运行一次cron
$limit=time()-12*60*60;
$lastrun=Configuration::get('[module name]-lastrun');
如果($lastrun<$limit){
返回“”;
}
}
在你的cron控制器中

$limit = time() - 12 * 60 * 60;
$lastrun = Configuration::get('[module-name]-lastrun');
if ($lastrun < $limit) {
    Configuration::updateValue('[module-name]-lastrun', time());
    // do stuff
}    
$limit=time()-12*60*60;
$lastrun=Configuration::get('[module name]-lastrun');
如果($lastrun<$limit){
配置::updateValue('[module name]-lastrun',time());
//做事
}    

是的,我在这里发帖后看到了这一点。我更新了这个问题,如果你能回答,那就太好了!好吧,我不推荐像WordPress那样的伪cron(零访问=零cron运行)。我将在PrestaShop中解释解决方案。感谢您提供的解决方案。还有两个问题:1)服务器IP是我可以从模块访问的信息吗?2) 可以将第二个代码片段放在控制器的init()函数中吗?1)$\u服务器['SERVER\u ADDR']在任何地方都可用2)是的,$\u服务器['SERVER\u ADDR']为什么没有返回真正的IP(我连接到Prestashop backoffice时在url中看到的IP)?我看到另一个IP,但该IP无法正常工作