今天在公司摸鱼的时候,发生一件比较有意思的事儿,让我对一个以前没太注意过的 PHP 函数产生兴趣,那就是 ignore_user_abort。说起来,这事儿还得从我那不太靠谱的项目经理说起。
事情是这样的,项目经理丢给我一个任务,让我写一个 PHP 脚本,用来处理一大堆数据。这数据量可真不小,处理起来挺费时间的。我一看,这脚本跑起来估计得个把小时,于是我就把脚本挂在服务器上跑,自己该干啥干啥去。结果没过多久,项目经理就急匆匆地跑过来跟我说:“你那个脚本怎么停?我这边断开连接,是不是脚本也跟着停?”
我当时一愣,心想:“不会?我断开连接,脚本还能停?”我赶紧查看一下服务器,果不其然,脚本在我断开 SSH 连接后没多久就自动终止。这可把我坑坏,白白浪费那么多时间。遇到问题就喜欢刨根问底。于是我就开始琢磨,有没有什么办法能让 PHP 脚本在客户端断开连接后依然能在服务器上继续运行?
探索阶段
- 我先是查阅下我的 PHP 学习笔记,发现一个可能相关的函数叫 ignore_user_abort。看名字好像是“忽略用户中止”的意思。
- 我赶紧找到这个函数的详细资料,看到它的作用是“设置与客户机断开是否会终止脚本的执行”。看到这里,我心里就有底,看来这个函数就是解决问题的关键!
- 然后我看到资料里还提到一个 set_time_limit(0),说是可以取消脚本运行时间的超时上限。我想想,既然要让脚本长时间运行,那这个设置也是必不可少的。
实践出真知
就是验证猜想的时刻。我写一个简单的 PHP 脚本,在脚本开头加上这么两行代码:
这回php
ignore_user_abort(true);
set_time_limit(0);
// 后面的代码就是我需要执行的数据处理逻辑...
// 为模拟长时间运行,我这里加个循环,让它跑个几十分钟
for ($i = 0; $i < 1000000000; $i++) {
// 这里写点啥都行,我就简单地输出一个数字
echo $i . "\n";
// 为避免输出太多,我稍微加点延迟
usleep(1000);
这回
我把这个脚本上传到服务器,然后通过 SSH 执行。我故意断开 SSH 连接。然后我就去忙别的事儿,过一会儿,我再重新连接到服务器,查看脚本的运行情况。
大功告成
结果让我非常满意!即使我中途断开连接,脚本依然在服务器上默默地运行着,并没有受到影响。看来,ignore_user_abort(true) 这一招果然管用!加上 set_time_limit(0),简直是完美搭档,再也不用担心脚本因为客户端连接断开或者超时而中断。这下好,以后再遇到这种需要长时间运行的脚本,我就知道该怎么处理。真是一次有意义的摸鱼经历!