Module 电子商务插件开发-如何定期检查平台数据库并调用外部API
我正在为Prestashop开发一个模块,我将为Prestashop开发环境提供一个有效的前提:模块/插件可以通过一些钩子完成它的工作,比如Header、leftBar或BackOffice Header加载,所以显然没有办法完成我想做的事情: 我想定期(比如说每天)检查Prestashop数据库中的废弃购物车,并将其信息发送到外部API 我想到了一个我不太喜欢的解决方法,但对我来说似乎效率不高:插件安装了一个自定义数据库,该数据库将始终包含一行:在该行中将有当前日期。 每当用户访问网站时,插件都会在DB上检查该值:如果日期早于今天,则会将其更新为今天的日期。如果模块刚刚更新了该值,那么我将对DB和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 我想到了一个我不太喜欢的解决方法,但对我来说似乎效率不高:插件安装了一个自定义数据库,该数据库将始终包含一行:在该行中将有当前日期。 每当用户访问网站时,插件
因此存在一种方法: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"
- 您的任务可能很长:它可能会减慢访客的购物速度,并且您依赖于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无法正常工作