CodeIgniter REST库调用$this->response后脚本终止,如何执行后续函数
问题根源
CodeIgniter REST 库的 $this->response() 方法默认在输出HTTP响应内容后会直接终止脚本执行,所以后续的sendSMS()逻辑不会被触发。
解决方案
方案1:调整逻辑顺序(最推荐)
把返回响应的操作放到所有业务逻辑执行完成之后,符合常规HTTP请求处理规范,没有环境依赖:
function post_rayz(){ $one = $this->testone(); if($one == 1){ $this->sendSMS(); } // 所有业务执行完成后再返回响应 $this->response(['status' => 1, 'message' => 'success 4'], 200); } // testone 仅做逻辑判断,不提前返回响应 function testone(){ return 1; } function sendSMS(){ echo "two"; }
方案2:关闭response方法的自动终止逻辑
如果你的REST库版本支持response方法的第三个参数(控制执行后是否终止脚本),可以直接传false禁用自动终止:
function testone(){ // 第三个参数为false:输出响应后不终止脚本 $this->response(['status' => 1, 'message' => 'success 4'], 200, false); return 1; }
方案3:手动输出响应+提前断开客户端连接(适用于需要先返回响应再执行耗时逻辑的场景)
仅Nginx+FastCGI环境可用,通过fastcgi_finish_request()函数提前把响应返回给客户端,后续脚本继续在后台执行:
function testone(){ // 手动设置响应状态码和头部 http_response_code(200); header('Content-Type: application/json'); // 输出响应内容 echo json_encode(['status' => 1, 'message' => 'success 4']); // 断开客户端连接,返回响应 fastcgi_finish_request(); return 1; }
注意事项
- 采用先返回响应再执行业务逻辑的方案时,后续逻辑不能再输出任何内容,否则会导致响应异常
- 耗时较长的后台任务建议存入消息队列处理,避免长期占用PHP进程资源
- Apache环境无
fastcgi_finish_request()函数,优先选择方案1调整逻辑顺序
内容的提问来源于stack exchange,提问作者Anil Joshi
相关产品推荐
相关产品推荐

