首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在REST-API被击中后立即运行函数。

在REST-API被击中后立即运行函数。
EN

Stack Overflow用户
提问于 2021-06-05 13:20:19
回答 4查看 254关注 0票数 0

有以下两项申请:

  • WordPress-站点与REST-API。让我们称其为Brandon
  • 另一个系统,使用REST-API。让我们称其为Jeremy

我知道WordPress堆栈交换,但这更多地是一个WordPress问题,而不是一个WordPress问题(我认为)。

问题所在

杰里米创建并更新布兰登的“原子”。

每当杰里米更新布兰登上的一个原子,然后紧接着,一个叫做BuildMolecules()的操作运行,它将原子膨胀成团,并更新关于布兰登上分子的电子、中子和质子信息。

但目前,这是在杰里米的线程上进行的。这意味着,如果杰里米更新了一个原子,那么它必须等待BuildMolecules()完成,才能返回其响应。更糟糕的是,如果BuildMolecules()运行时出了问题,那么Jeremy会收到一个错误,这是错误的(因为原子按它应该更新的方式更新)。最后一件事可以也应该用try/catch语句来解决,但是.

如何使一个函数在Jeremy更新一个原子之后立即运行,而不用在Jeremy的线程上执行呢?

解决方案尝试和注意事项

CRON-作业

我考虑每5-10秒运行一次cron作业,检查一个原子是否被更新。如果是,那么运行一个update操作。这感觉有点顽皮,因为我必须经常运行,以实现杰里米和布兰登之间的顺利融合。但这应该管用。如果运行时间超过5-10秒,那么我必须说明这一点,设置状态或其他什么,停止BuildMolecules()运行两次,而应该只运行一次。

一种新的线程

即使我可以设置一个新的线程(我从来没有做过这样的事情),我也可以在这里读到:创建新线程(?)在PHP中,我不应该尝试这样做。

如果 WordPress为它提供了一个函数,

我查看了WordPress的REST文档,但是找不到任何可以帮助我的东西。

EN

回答 4

Stack Overflow用户

发布于 2021-06-14 19:44:05

一套简单的触发机制会有帮助吗?

杰里米更新一个原子-> --这将触发一个请求被发送到Brandon到BuildMolecule(),发送到一个不需要等待响应的卷曲请求中。该请求有一个callback参数

代码语言:javascript
复制
$url = 'https://brandon.com/buildMolecule.php';
$curl = curl_init();                
$post['callback'] = 'https://jeremy.com/onBuiltMolecule.php'; 
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt ($curl, CURLOPT_POST, TRUE);
curl_setopt ($curl, CURLOPT_POSTFIELDS, $post); 
curl_setopt($curl, CURLOPT_TIMEOUT, 1); 
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FORBID_REUSE, true);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 1);
curl_setopt($curl, CURLOPT_DNS_CACHE_TIMEOUT, 10); 
curl_setopt($curl, CURLOPT_FRESH_CONNECT, true);
curl_exec($curl);   
curl_close($curl); 

布兰登的机器运行BuildMolecule(),但知道如何获取$_POST['callback']

代码语言:javascript
复制
function onCompleteBuildMolecule($moleculeDataArray) {
    $url = $_POST['callback'];
    $curl = curl_init();                
    $post['data'] = $moleculeDataArray; 
    // the rest same as above's cURL 

如果整个设置太初级,您也可以利用亚马逊的SNS服务 (它为相同类型的交互提供了更健壮的包装)

票数 3
EN

Stack Overflow用户

发布于 2021-06-12 10:08:22

如果这是使用像Laravel这样的MVC框架,那么我就会使用消息队列。如果您需要在WordPress的上下文中这样做,这是一个更困难的问题,但也不是不可克服的。

PHP中有一些独立的消息队列实现,例如Bernard和php-enqueue,它们可以满足您的需要,但实际上您可能希望使用Composer来安装这些消息队列,这在WordPress上下文中可能很困难(尽管可能--基本模块是使用Composer的WordPress样板的一个例子)。或者这可能太过了--您可以使用Redis或RabbitMQ在较低级别上实现它,或者只是一个排队作业的数据库表。

无论您选择如何实现它,原则都是相同的--在WordPress中,当接收到请求时,只需将所需数据的最小值推送到队列后端。您有一个单独的工作进程正在运行,这将获取数据并进行处理。如果不方便的话,工作人员不一定要在PHP中工作,它只需要能够与后端进行通信,如果没有将其用作队列后端,则可能需要使用主应用程序数据库。

票数 1
EN

Stack Overflow用户

发布于 2021-06-16 12:20:21

这取决于您如何调用其他API。

JavaScript也参与了吗?如果是这样的话,您可以发送原子修改请求,而不是在完成时调用构建分子,而只是响应ok。在收到这个"ok“后,您可以发送一个背景ajax请求来重建分子。

如果这是JavaScript不可用的服务器与服务器之间的关系,则可以在数据库中设置分子需要重建的设置,并在常规cron作业上执行该设置。

最后,您可以通过系统函数使用PHP。

代码语言:javascript
复制
<?php 
system("nohup php -f /path/to/rebuild_molecules.php >/dev/null 2>&1 &");

PHP将开始执行rebuild_molecules脚本,但它不会等待完成。

https://linux.die.net/man/1/nohup

编辑:如果使用PHPFPM,也可以使用fastcgi_finish_request

代码语言:javascript
复制
echo 'ok';
fastcgi_finish_request();
do_build_molecules();

https://www.php.net/manual/en/function.fastcgi-finish-request.php

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67849986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档