当前位置:首页 > PHP > 正文内容

php关闭浏览器继续执行踩坑记录

高老师6年前 (2020-11-14)PHP1592

最近在项目中需要批量刷数据,但是由于项目的框架太老无法简单的使用命令行,而且项目比较急,所以想到之前的php关闭浏览器继续执行的路子,我记得php客户端断开继续执行需要配置nginx和fpm和php的配置,当时既修改php又修改fpm,但是找不到当时记录的配置信息了,后来想到自己之前测试过一个方法可行,于是翻出来了,代码如下:

//设置客户端断开依然运行
ignore_user_abort(true);

//设置脚本不超时
set_time_limit(0);

//死循环每隔1秒访问一次网址
while (true)
{
    sleep(1);

    @file_get_contents('http://xingxinghan.cn/?id=5');
}

当时在windows下apache/nginx都测试过,linux下在本机测试过fpm和fast-cgi,于是直接用了上面的方法。

在测试环境和预发布环境都正常,但是到线上直接超时后脚本不再运行。害的产品和测试一直等我刷数据等到半夜。虽然我想到了fpm的配置项,但是当时脑子一片乱,没有想到。

也就是说上面的代码是在普通的cgi/fast-cgi下面是正常的,因为没有fpm的参与,脚本的执行时间受限于set_time_limit配置。

fpm环境中则由request_terminate_timeout配置时间决定,request_terminate_timeout 适用于当max_execution_time由于某种原因无法终止脚本的时候,会把这个php-fpm请求干掉。

但是还得找运维去修改配置的确麻烦,能不能自己在代码层参与。想了半天想到鸟哥科普的fastcgi_finish_request函数,这是一个fpm函数,开启了fpm才有。功能是提前向nginx响应请求,然后再去处理剩下的脚本代码。鸟哥文章原始链接https://www.laruence.com/2011/04/13/1991.html

于是我简单修改下代码,兼容下fpm的方法:

function execute($func)
{
    $fpm_func = 'fastcgi_finish_request';
    if (function_exists($fpm_func))
    {
        //fpm
        fastcgi_finish_request();
    }
    else
    {
        //cgi/fast-cgi
        set_time_limit(0);
        ignore_user_abort(true);
    }
    $func();
}

测试代码如下:

//执行任务内容
$func = function () {
    $pid = getmypid();
    $file = '1.txt';
    while (true)
    {
        $date = date('Y-m-d H:i:s');
        $text = "pid:{$pid},date:$date" . PHP_EOL;
        file_put_contents($file, $text);
        sleep(1);
    }
};

//正式执行任务
execute($func);

以上代码已经在win下apache/nginx的cgi/fast-cgi、linux下apache/nginx的cgi/fast-cgi/fpm下测试通过。phpenv集成环境中包含了fpm,貌似在windows中没看成有多大作用,fpm系列函数不可用,不过不影响执行。

切记!这是一个踩坑记录,不要偷懒,不要盲目自信,耗时的任务都走cli,如果要用这种方式最好加上日志记录,并且记录进程id,如果异常可以干掉相关进程,只限于刷数据,正式环境业务功能这么写就是猪!另外这种操作如果遇到不讲武德的web服务器,比如kangle/iis还可以不遵守这种规则,或者其他web服务器特殊配置超过就干掉你,也很无奈。

net5正式版发布了,推荐下还不错,优雅的c#语法、全面跨平台、原生二进制编译、更强的正则解析能力、保姆式开发工具人人都能简单入手。

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/190.html

分享给朋友:

“php关闭浏览器继续执行踩坑记录” 的相关文章

PHP计算两个字符串的相似度

PHP计算两个字符串的相似度

<?php echo similar_text("Hello World","Hello Shanghai"); ?> 2.计算两个字符串的相似度,并返回百分比 <?php similar_text("...

php soap 捕获异常,使用try catch 捕获Soap 异常

php soap 捕获异常,使用try catch 捕获Soap 异常

项目中使用服务来执行webservice,由于对方系统api不稳定,经常导致服务崩溃,只能重启,一个月差不多要重启一次。初期的解决办法是捕获异常,然后continue掉。<?php try {     $url = 'http...

php arrayaccess的应用场景:配置管理器

php arrayaccess的应用场景:配置管理器

上篇文章已经讲解arrayacces的原理,现在来讲解下arrayaccess的实际应用。一个大型的互联网项目中必然会存在各种配置信息,例如多种数据库信息:mysql,tidb,mongodb,redis,某个业务模块单独的配置信息如比例,额度等等,那么该如何治理配置信息?PHP项目中大部分的框架都...

php elasticsearch基础使用

php elasticsearch基础使用

elasticsearch的操作都是基于http协议的,已经有现成的php类库,composer安装即可。{     "require": {        &...

php爬虫执行js,php执行js

php爬虫执行js,php执行js

当我们使用php爬虫采集网站时经常会遇到内容使用ajax异步加载。一般采取的方案是PHP模拟再请求api接口获取数据,但是有时候前端js加密非常麻烦,我们需要将js的加密方法转换为php方法方便curl请求。当然通过了解我们可以通过3种方案解决。第一种:使用phpv8js扩展执行js代码。(pecl...

php生成器的send方法详解,php yield send

php生成器的send方法详解,php yield send

【一】.基本用法首先看看官方对send方法的解释:Sets the return value of the yield expression and resumes the generato...