ignore_user_abort和用户体验有关?深入浅出给你解释!

吉云

今天在公司摸鱼的时候,发生一件比较有意思的事儿,让我对一个以前没太注意过的 PHP 函数产生兴趣,那就是 ignore_user_abort。说起来,这事儿还得从我那不太靠谱的项目经理说起。

事情是这样的,项目经理丢给我一个任务,让我写一个 PHP 脚本,用来处理一大堆数据。这数据量可真不小,处理起来挺费时间的。我一看,这脚本跑起来估计得个把小时,于是我就把脚本挂在服务器上跑,自己该干啥干啥去。结果没过多久,项目经理就急匆匆地跑过来跟我说:“你那个脚本怎么停?我这边断开连接,是不是脚本也跟着停?”

我当时一愣,心想:“不会?我断开连接,脚本还能停?”我赶紧查看一下服务器,果不其然,脚本在我断开 SSH 连接后没多久就自动终止。这可把我坑坏,白白浪费那么多时间。遇到问题就喜欢刨根问底。于是我就开始琢磨,有没有什么办法能让 PHP 脚本在客户端断开连接后依然能在服务器上继续运行?

ignore_user_abort和用户体验有关?深入浅出给你解释!

探索阶段

  • 我先是查阅下我的 PHP 学习笔记,发现一个可能相关的函数叫 ignore_user_abort。看名字好像是“忽略用户中止”的意思。
  • 我赶紧找到这个函数的详细资料,看到它的作用是“设置与客户机断开是否会终止脚本的执行”。看到这里,我心里就有底,看来这个函数就是解决问题的关键!
  • 然后我看到资料里还提到一个 set_time_limit(0),说是可以取消脚本运行时间的超时上限。我想想,既然要让脚本长时间运行,那这个设置也是必不可少的。

ignore_user_abort和用户体验有关?深入浅出给你解释!

实践出真知

就是验证猜想的时刻。我写一个简单的 PHP 脚本,在脚本开头加上这么两行代码:

这回php

ignore_user_abort(true);

set_time_limit(0);

ignore_user_abort和用户体验有关?深入浅出给你解释!

// 后面的代码就是我需要执行的数据处理逻辑...

// 为模拟长时间运行,我这里加个循环,让它跑个几十分钟

for ($i = 0; $i < 1000000000; $i++) {

// 这里写点啥都行,我就简单地输出一个数字

echo $i . "\n";

// 为避免输出太多,我稍微加点延迟

ignore_user_abort和用户体验有关?深入浅出给你解释!

usleep(1000);

这回

我把这个脚本上传到服务器,然后通过 SSH 执行。我故意断开 SSH 连接。然后我就去忙别的事儿,过一会儿,我再重新连接到服务器,查看脚本的运行情况。

大功告成

ignore_user_abort和用户体验有关?深入浅出给你解释!

结果让我非常满意!即使我中途断开连接,脚本依然在服务器上默默地运行着,并没有受到影响。看来,ignore_user_abort(true) 这一招果然管用!加上 set_time_limit(0),简直是完美搭档,再也不用担心脚本因为客户端连接断开或者超时而中断。这下好,以后再遇到这种需要长时间运行的脚本,我就知道该怎么处理。真是一次有意义的摸鱼经历!

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]