用户中止后在后台运行 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的主要内容,如果未能解决你的问题,请参考以下文章

结束 ssh 会话后在后台运行 python/matplotlib 的问题

在后台运行 NSTimer 方法

Linux信号

让PHP程序永远在后台运行

如何在后台启动另一个PHP脚本?

windows的窗口最小化是在后台运行?