【php】用户关闭浏览器后服务器端会继续执行吗?
- 场景
有一个被请求的程序处理时间很长,比如需要60Sa.php
,所以我使用了 curl 的并发请求
关于curl 请求时常的问题,很多资料都是复制粘贴,人家解释的都没问题,但关键还是不是很透彻
1. curl_setopt($curl, CURLOPT_TIMEOUT, 1);
手册解释:允许 cURL 函数执行的最长秒数。
我个人感觉是请求程执行的最长时间。被请求的程序需要10S,则这里需要大于10
2. curl_setopt($curl, CURLOPT_CONNECTTIMEOUT , 1);
手册解释: 在尝试连接时等待的秒数。设置为0,则无限等待。
- curl 并发代码
function requestCurl()
{
$start_time = microtime(TRUE);
$webSiteUrl = 'http://xxx.com/api/test';
$arrUrl = [
$webSiteUrl . '?request_id=0',
$webSiteUrl . '?request_id=1',
$webSiteUrl . '?request_id=2',
$webSiteUrl . '?request_id=3',
$webSiteUrl . '?request_id=4',
$webSiteUrl . '?request_id=5',
$webSiteUrl . '?request_id=6',
$webSiteUrl . '?request_id=7',
$webSiteUrl . '?request_id=8',
$webSiteUrl . '?request_id=9',
];
//1 创建批处理cURL句柄
$chHandle = curl_multi_init();
$chArr = [];
//2.创建多个cURL资源
foreach ($arrUrl as $url) {
$chArr[$url] = curl_init();
curl_setopt($chArr[$url], CURLOPT_URL, $url);
curl_setopt($chArr[$url], CURLOPT_RETURNTRANSFER, 1);
curl_setopt($chArr[$url], CURLOPT_TIMEOUT, 1);
curl_multi_add_handle($chHandle, $chArr[$url]); //2 增加句柄
}
$active = null;
/**常量
* CURLM_CALL_MULTI_PERFORM==-1
* // CURLM_OK == 0
**/
do {
$mrc = curl_multi_exec($chHandle, $active); //3 执行批处理句柄
} while ($mrc == CURLM_CALL_MULTI_PERFORM); //4
//4 $active 为true,即$chHandle批处理之中还有$ch句柄正待处理,$mrc==CURLM_OK,即上一次$ch句柄的读取或写入已经执行完毕。
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($chHandle) != CURLM_CALL_MULTI_PERFORM) {//$chHandle批处理中还有可执行的$ch句柄,curl_multi_select($chHandle) != -1程序退出阻塞状态。
do {
$mrc = curl_multi_exec($chHandle, $active);//继续执行需要处理的$ch句柄。
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
foreach ($chArr as $k => $ch) {
// $result[$k] = curl_multi_getcontent($ch); //5 获取句柄的返回值,不需要
curl_multi_remove_handle($chHandle, $ch);//6 将$chHandle中的句柄移除
}
curl_multi_close($chHandle); //7 关闭全部句柄
$end_time = microtime(TRUE);
echo sprintf("use time:%.3f s", $end_time - $start_time);
}
- 被请求的程序
a.php
public function test()
{
$request_time = date('is');
sleep(10);
$str = isset($_GET['request_id']) ? $_GET['request_id'] : 'xxxx';
logToMe($str . ' ' . $request_time . ' ' . date('is'));
echo getTimeString();
}
但是上面的 curl 会在1S 后就结束,如果使用浏览器,关闭浏览器,让程序继续执行.
这个取决于 ignore_user_abort
参数的配置,在 php.ini 大概 336 行 ;ignore_user_abort = On
。但是我并没有开启这个,不知道为什么关闭浏览器,也是可以继续执行
网友评论