有以下两项申请:
我知道WordPress堆栈交换,但这更多地是一个WordPress问题,而不是一个WordPress问题(我认为)。
问题所在
杰里米创建并更新布兰登的“原子”。
每当杰里米更新布兰登上的一个原子,然后紧接着,一个叫做BuildMolecules()的操作运行,它将原子膨胀成团,并更新关于布兰登上分子的电子、中子和质子信息。
但目前,这是在杰里米的线程上进行的。这意味着,如果杰里米更新了一个原子,那么它必须等待BuildMolecules()完成,才能返回其响应。更糟糕的是,如果BuildMolecules()运行时出了问题,那么Jeremy会收到一个错误,这是错误的(因为原子按它应该更新的方式更新)。最后一件事可以也应该用try/catch语句来解决,但是.
如何使一个函数在Jeremy更新一个原子之后立即运行,而不用在Jeremy的线程上执行呢?
解决方案尝试和注意事项
CRON-作业
我考虑每5-10秒运行一次cron作业,检查一个原子是否被更新。如果是,那么运行一个update操作。这感觉有点顽皮,因为我必须经常运行,以实现杰里米和布兰登之间的顺利融合。但这应该管用。如果运行时间超过5-10秒,那么我必须说明这一点,设置状态或其他什么,停止BuildMolecules()运行两次,而应该只运行一次。
一种新的线程
即使我可以设置一个新的线程(我从来没有做过这样的事情),我也可以在这里读到:创建新线程(?)在PHP中,我不应该尝试这样做。
如果 WordPress为它提供了一个函数,
我查看了WordPress的REST文档,但是找不到任何可以帮助我的东西。
发布于 2021-06-14 19:44:05
一套简单的触发机制会有帮助吗?
杰里米更新一个原子-> --这将触发一个请求被发送到Brandon到BuildMolecule(),发送到一个不需要等待响应的卷曲请求中。该请求有一个callback参数
$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']
function onCompleteBuildMolecule($moleculeDataArray) {
$url = $_POST['callback'];
$curl = curl_init();
$post['data'] = $moleculeDataArray;
// the rest same as above's cURL 如果整个设置太初级,您也可以利用亚马逊的SNS服务 (它为相同类型的交互提供了更健壮的包装)
发布于 2021-06-12 10:08:22
如果这是使用像Laravel这样的MVC框架,那么我就会使用消息队列。如果您需要在WordPress的上下文中这样做,这是一个更困难的问题,但也不是不可克服的。
PHP中有一些独立的消息队列实现,例如Bernard和php-enqueue,它们可以满足您的需要,但实际上您可能希望使用Composer来安装这些消息队列,这在WordPress上下文中可能很困难(尽管可能--基本模块是使用Composer的WordPress样板的一个例子)。或者这可能太过了--您可以使用Redis或RabbitMQ在较低级别上实现它,或者只是一个排队作业的数据库表。
无论您选择如何实现它,原则都是相同的--在WordPress中,当接收到请求时,只需将所需数据的最小值推送到队列后端。您有一个单独的工作进程正在运行,这将获取数据并进行处理。如果不方便的话,工作人员不一定要在PHP中工作,它只需要能够与后端进行通信,如果没有将其用作队列后端,则可能需要使用主应用程序数据库。
发布于 2021-06-16 12:20:21
这取决于您如何调用其他API。
JavaScript也参与了吗?如果是这样的话,您可以发送原子修改请求,而不是在完成时调用构建分子,而只是响应ok。在收到这个"ok“后,您可以发送一个背景ajax请求来重建分子。
如果这是JavaScript不可用的服务器与服务器之间的关系,则可以在数据库中设置分子需要重建的设置,并在常规cron作业上执行该设置。
最后,您可以通过系统函数使用PHP。
<?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
echo 'ok';
fastcgi_finish_request();
do_build_molecules();https://www.php.net/manual/en/function.fastcgi-finish-request.php
https://stackoverflow.com/questions/67849986
复制相似问题