首页 > 编程语言 >php返回数据后如何让程序继续执行其它操作

php返回数据后如何让程序继续执行其它操作

时间:2024-06-14 11:43:28浏览次数:13  
标签:function 其它 继续执行 register ob echo shutdown test php

最近遇到一个需求,异步请求对一个慢查询的结果进行缓存,先返回缓存的结果,然后继续获取数据缓存下来。写个demo记录下

使用register_shutdown_function函数

register_shutdown_function — 注册在关闭时执行的函数

register_shutdown_function(callable $callbackmixed ...$args): void

注册一个 callback ,它会在脚本执行完成或者 exit() 后被调用。

<?php

class Test
{
    public function test1($a, $b)
    {
        sleep(4);
        echo 'test-1<br/>';
        file_put_contents('E:/code/files/test.txt', json_encode(compact('a', 'b')) . 'aaaaaa');
    }

    function test()
    {
        echo 'test<br/>';

        register_shutdown_function([$this, 'test1'], 2, 3);
        echo 'test end<br/>';
        return 2;
    }
}

$t = new Test();
$res = $t->test();
var_dump($res);

 期望数据立即返回,而程序继续执行,然而实际上数据等全部程序执行完才返回

使用ob系列函数

<?php

class Test
{
    public function test1($a, $b)
    {
        sleep(4);
        echo 'test-1<br/>';
        file_put_contents('E:/code/files/test.txt', json_encode(compact('a', 'b')) . 'aaaaaa');
    }

    function test()
    {
        echo 'test<br/>';

        ob_end_clean();
        header("Connection: close");
        header("HTTP/1.1 200 OK");
        header("Content-Type: application/json;charset=utf-8");
        ob_start();
        echo json_encode(['a' => 1]);
        $size = ob_get_length();
        header("Content-Length: $size");
        ob_end_flush();
        flush();
        if (function_exists("fastcgi_finish_request")) {
            fastcgi_finish_request();
        }
        sleep(2);
        set_time_limit(0);

        $this->test1(2, 3);

        // register_shutdown_function([$this, 'test1'], 2, 3);
         echo 'test end<br/>';
         return 2;
    }
}

$t = new Test();
$res = $t->test();
var_dump($res);

此时数据即刻返回,而程序仍然执行

标签:function,其它,继续执行,register,ob,echo,shutdown,test,php
From: https://www.cnblogs.com/caroline2016/p/18247497

相关文章

  • php反序列化个人笔记
    反序列化什么是反序列化?格式转换序列化:对象转换为字符串或者数组等格式反序列化:将数组或字符串转换成对象为什么会出现安全漏洞?魔术方法如何利用漏洞?通过构造pop链,找到代码的逻辑漏洞,进行getshell,rce等操作反序列化利用分为三类魔术方法的调用逻辑语言原生类的调用逻......
  • PHP正则表达式
    PHP正则表达式函数PHP正则表达式介绍正则表达式允许您搜索和替换字符串中的模式。安装PHP正则表达式函数是PHP核心的一部分。无需安装即可使用这些功能。运行时配置php.ini中的这些设置可用于限制计算正则表达式时使用的时间或资源量。名称默认值描述Changea......
  • php基础语法_面向对象
    PHPphp代码标记多种标记来区分php脚本ASP标记:<%php代码%>短标记:脚本标记:标准标记(常用):简写风格:ASP风格:<%php代码%>注意:简写风格和ASP风格需要在php.ini配置文件中修改以下配置为on,移植性差short_open_tag=onasp_tags=on<html><body> <b> <?php //脚......
  • [强网杯 2019]Upload php反序列化代码审计
    进入页面发现有登录,随便注册一个用户登录试试。文件上传?传个试试,结果发现不论怎么上传都没用,还发现了cookie像是反序列化的东西。扫目录看看,发现源码。发现主要文件,做做审计吧。index.php<?phpnamespaceapp\web\controller;usethink\Controller;classIndexextend......
  • 深入了解Laravel:PHP面试宝典
    Laravel是目前最受欢迎的PHP框架之一,它以其优雅的语法和强大的功能深受开发者喜爱。在PHP开发的面试中,Laravel的知识点往往是重点考察的内容。本文将为你详细解析Laravel的核心知识点,帮助你在面试中脱颖而出。一、Laravel简介Laravel是一个基于MVC(模型-视图-控制器)架构的PHP......
  • php中curl返回错误码60是什么原因?怎样处理?
    PHP中cURL返回错误码60通常与SSL证书验证有关。错误码60代表"SSLcertificateproblem:unabletogetlocalissuercertificate",意味着cURL无法验证远程服务器的SSL证书,可能是因为证书本身存在问题,或者是因为cURL的配置没有正确设置以识别有效的证书。处理cURL错误码60的方法......
  • 【毕设源码含论文】基于PHP的校园代取快递小程序
    本项目含论文、开题报告完整截图:【源码】基于php的校园代取快递小程序_哔哩哔哩_bilibili源码购买:基于PHP的校园代取快递小程序【代码+开题报告+论文】功能1.登录:采用微信一键授权登录的形式2.个人信息:包括姓名学号和手机号3.发布任务:发布一个代取快递的任务,包括单号......
  • 基于phpstudy的Pikachu靶场搭建(有手就会)
    目录一、phpstudy和pikachu源码下载地址二、phpstudy创建网站,网站根目录设置为pikachu的源码文件夹1、将pikachu_master(pikachu源码文件夹)放到phpstudy的WWW目录下2、打开phpstudy,创建pikachu靶场网站三、配置pikachu靶场四、用phpstudy的mysql连接pikachu靶场的数据库......
  • c语言开发 php扩展 sm4
    首先php可以直接调用openssl直接进行sm4sm3的加密如:openssl_encrypt($plaintext,'sm4-cbc',$key,OPENSSL_RAW_DATA,$iv);openssl_digest('123','sm3')php如果直接调用sm2需要统一使用openssl的evp接口openssl1.1的源码在sm2_crypt文件里面此处只是学习/*gmteste......
  • SSM-小区物业管理系统-48954(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP、爬虫、
    基于SSM小区物业管理系统摘要随着计算机科学技术日渐成熟,人们已经深刻认识到了计算机功能的强大,计算机已经进入到了人类社会发展的各个领域,并且发挥着十分重要的作用。每个社区的物业管理是一项系统而复杂的工作,它需要一个团队互相配合、分工协作。在该领域,传统的手工存取......