用户中止后在后台运行 PHP + Curl
Posted
技术标签:
【中文标题】用户中止后在后台运行 PHP + Curl【英文标题】:Run PHP + Curl in background after user abort 【发布时间】:2019-12-12 13:11:43 【问题描述】:我有一个在线商店,我使用在线会计软件手动发布订单。在线会计软件有一个非常大的api,我想在客户下订单时自动发送订单。
一旦订单完成,客户就会进入成功页面,即successpage.php
在此页面中,我有以下内容:
$sendOrder = file_get_contents("https://myonlinestore.com/sendorder.php?order=1234");
在sendorder.php上,我收到$_GET
参数“order”,它是订单号,我处理了几个SQL请求从数据库中检索订单数据。
获得所有这些数据后,我会启动 CURL 帖子以使用会计系统的 API 发送数据。
这是我的代码的简化版本,其中包含基本部分:
$orderNum = htmlspecialchars($_GET["order"]) // SENT OVER FILE_GET_CONTENTS
// bOf process SQL here and get order info stored in various variables
// EXECUTE SQL HERE
// eOf process SQL here and get order info stored in various variables
$invoice = array(
'customer_id' => $custaccount,
'estimate_number' => $orderRef,
'reference_number' => $orderNum
// MANY OTHER VARIABLES ENTERED HERE, BUT LEFT OUT TO KEEP THINGS SHORT
);
$jsonInvoice = json_encode($invoice);
$url = 'https://ACCOUTINGAPP.com/api/v2/orders';
$data = array(
'authtoken' => '***********',
'JSONString' => $jsonInvoice,
'company_id' => '***********'
);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded") );
$response = false;
$response = curl_exec($ch);
curl_close($ch);
// TEST RESPONSE
if($response !== false)
var_dump($response);
else
echo "oops error hehehe";
我的主要担忧:
我希望用户在进入 successpage.php 后立即关闭选项卡或页面。
但我想确保 successpage.php 的 $sendOrder = file_get_contents() 以及它在 sendorder.php 上执行的代码继续运行,无论用户连接如何。
所以我的问题是,我应该放在哪里:
ignore_user_abort(TRUE);
另外,我应该使用输出缓冲吗?我之所以这么问,是因为我在其他网站上读过一篇关于此的帖子,并建议这样做。
最后,我应该包括:
set_time_limit(0);
【问题讨论】:
【参考方案1】:尽快致电ignore_user_abort(TRUE);
。而且您不需要输出缓冲,因为一旦关闭浏览器选项卡就没有人会看到您的输出,因此您只需要确保脚本在它已经在执行任何操作时继续运行。
【讨论】:
好的,为了确定,我可以添加 ignore_user_abort(TRUE);在 sendorder.php 的最顶部(当然是在打开标签之后),它将适用于我位于 sendorder.php 中的所有 php 和 CURL? 是的,顾名思义,这个函数告诉 PHP “即使用户离开也要继续”。您越早告知用户可以在不影响您的脚本的情况下越早离开以上是关于用户中止后在后台运行 PHP + Curl的主要内容,如果未能解决你的问题,请参考以下文章