PHP 实现请求结束之后,后台静默执行部分代码

这一篇其实是由上一篇引申出来的。之前说到,勉勉强强实现了 PDF 和 PPT 文件转图片,但是转换需要一定的时间,而我这里是用户发起请求进行转换的,这部分时间不应该让用户一直等着,应该结束请求,把数据返回给用户,然后后台再慢慢执行这些转换操作。

最开始我是有两种想法的,第一种是比较传统的,做一个进度条给用户看,虽然一个文件稍微要几秒钟的等待时间,但是有了进度条之后也勉强能够接受;第二种就是我现在在实现的办法,即结束请求,把数据返回给前端,然后后台再默默地进行转换操作。这里我综合考虑了一下,选择了第二种实现方法。

有了想法的雏形之后,就开始疯狂搜索寻找可行的解决方法了。之前敲代码的时候偶尔也有这种需求,之前的解决方法是利用 crontab,定时执行某些操作,但是放在这里就不合适了,因为这里的任务是实时生成的,且只需要执行一次,而不是定时执行。不过顺着之前的思路,我发现了有一个东西说不定能够满足我的需求——crontab 的好朋友,at。at 和 crontab 的区别基本上就是,crontab 是周期性的,而 at 是一次性的。

本来喜气洋洋的,以为这么快就找到解决方法了,没想到用着用着发现了一个很致命的问题:at 只支持两种生成方式,一是先写一个 bash 脚本,然后添加到临时任务里去,大概像这样:

at -f commandFile now + 10 minutes

第二种方式是,在命令行中输入 at now + 10 minutes,然后再输入具体的指令,形成临时任务。

我寻寻觅觅了好久,仍然找不到能够通过 PHP 生成 at 临时任务的办法,奈何时间有限,只能放弃这个方法,另寻他径了。

我找到的第二个方法是 ThinkPHP5(我使用 PHP 框架)使用官方的插件 think-queue,在稍微了解了一下之后,觉这个东西非常不错,功能好像还蛮强大的,而且挺符合我目前的需求的,但是万万没想到,当我真正跑去用它的时候,出现了那么多的问题。第一,它的安装还挺麻烦的,一开始以为直接用 composer require 一下就可以了,结果还有版本问题,支持 TP5 的之有比较老的一些版本。第二,使用起来还是有点迷的,一方面是既没有找到官方的文档手册,没有找到合适的使用教程,另一方面是但是时间比较着急,没能静下心来研究。不过感觉这东西好像还是不错的,等这段时间期末考完了,打算再去认真研究研究。

上面两种方法皆宣告失败之后,我只能使用最最原始的办法了。话不多说,直接上代码吧:

//清除之前的缓冲内容ob_end_clean();//设置响应头连接状态为关闭header("Connection: close");//设置HTTP请求状态为200 OKheader("HTTP/1.1 200 OK");//返回数据格式header("Content-Type: application/json;charset=utf-8");//打开输出控制缓冲ob_start();//返回数据给前端echojson_encode($array);//下面输出http的一些头信息$size =ob_get_length();//返回输出缓冲区内容的长度header("Content-Length: $size");//输出当前缓冲,并关闭缓冲ob_end_flush();//输出PHP缓冲flush();//前端接收到数据,请求到此结束,之后的代码都在后台静默执行,前端也无法知道执行情况if (function_exists("fastcgi_finish_request")) { // yii或yaf默认不会立即输出,加上此句即可(前提是用的fpm)    fastcgi_finish_request(); // 响应完成, 立即返回到前端,关闭连接}//设置客户端断开连接时是否中断脚本的执行ignore_user_abort(true);//设置请求时间为不限时set_time_limit(0);...这里写需要后台执行的代码//冲刷(flush)所有响应的数据给客户端,请求完全结束fastcgi_finish_request();

还是原始的办法好使,没遇到啥困难就把问题给解决了,但是总感觉这样子实现起来太丑了,等有空了还是再去找找更好的办法吧,暂时就这样应付一下好了。

另外,如果你有兴趣,或者是有问题想要与我探讨,欢迎来访问我的博客:https:mu-mu.cn/blog

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • PHP是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用。PHP的语法借鉴吸收C语言、Jav...
    smart_yang阅读 642评论 1 4
  • PHP的输出缓冲区 什么是缓冲区?简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至...
    桖辶殇阅读 1,993评论 3 12
  • php.ini设置,上传大文件: post_max_size = 128Mupload_max_filesize ...
    bycall阅读 6,721评论 3 64
  • 一、字符串的定义方式和各自区别 单引号单引号不能解析变量不能解析转义字符,只能解析单引号和反斜线本身效率高 双引号...
    皮蛋馅儿阅读 223评论 0 1
  • 问题 开发中经常会遇到这种情况:当用户触发某个请求后,需要PHP做一些处理,但是不需要用户等待处理完成,也就是请求...
    易点互联阅读 1,222评论 0 1