PHP控制循环操作的时间


Posted in PHP onApril 01, 2021

循环执行某个程序,但循环执行过程中,可能会超时导致程序死掉,因此需要限制每个循环操作的最长时间。如果超时,则直接断开改进程,并继续下一层循环操作。携程,多线程都可以完成该操作,但在没有了解这些高深技术的时候,可以用这个简便的方法替代。

TaskAsync.php

namespace TaskAsync;
use Workerman\MySQL\Connection;
class TaskAsync {
    /**
     * 异步任务
     * @params $func 要异步执行的主要函数
     * @params $func 要异步执行超时后的函数
     * @params $maxTime 异步执行超时的时间 单位:秒 s
     * @params $params 要传递给$func的参数
     */
    public static function asyncTask(callable $func, $params = array(), $maxTime = 0, callable $func2 = null, $params2 = array()){
        pcntl_signal(SIGCHLD, SIG_IGN); //安装监听信号
        $pid = pcntl_fork(); //生成一个线程
        if ($pid == -1) {
            exit();//创建子进程失败
        } else if ($pid == 0) {
            //逻辑
            try {
                //执行用户函数
                call_user_func_array($func, $params);
            } finally {
                //执行完后杀死进程
                posix_kill(posix_getpid(), SIGKILL);
                exit(0);//结束子进程的操作
            }
        } else if ($pid > 0) {
            $t = time();
            while (true) {
                $nPid= pcntl_wait($s, WNOHANG);
                if ($nPid > 0) {
                    break;
                } else if ($nPid < 0) {
                    break;
                } else if ($maxTime && time() - $t > $maxTime) {
                    //默认超时时间为0 ,即 不限制超时时间 
                    posix_kill($pid, SIGKILL);
                    if (!empty($func2)) {
                        call_user_func_array($func2, $params2);
                    }
                    break;
                } else {
                    sleep(1);//每秒轮询检查
                }
            }
        }
    }

    public static function getMysqlConn() {
        $dbConfig = require(APP_PATH . '/database.php');
        return new Connection($dbConfig['hostname'], $dbConfig['hostport'], $dbConfig['username'], $dbConfig['password'], $dbConfig['database']);
    }
}

index.php

use TaskAsync\TaskAsync;
//使用
while(true) {
	$db = TaskAsync::getMysqlConn();
	//数据库操作
	$db->closeConnection();
	$data = [] ;//传入的数据
	TaskAsync::asyncTask(array(new Download(),'downLoadExcel'),
                        array($data),
                        60 * 60 * 10 ,
                        function($data){
                            echo '执行超时' ;
                        },
                        array($data)
                    );
}

pcntl_fork 之前,不能有数据库连接操作,所以,如果涉及到数据库的操作,在每次循环的时候,一定要重新连接数据库,执行完操作,要记得断开数据库连接,否则这样会提示 MySQL server has gone away !

PHP 相关文章推荐
实例(Smarty+FCKeditor新闻系统)
Jan 02 PHP
PHP用mysql数据库存储session的代码
Mar 05 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
Jun 08 PHP
PHP统计二维数组元素个数的方法
Nov 12 PHP
跟我学Laravel之安装Laravel
Oct 15 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
Jan 26 PHP
解读PHP中的垃圾回收机制
Aug 10 PHP
CodeIgniter辅助之第三方类库third_party用法分析
Jan 20 PHP
thinkPHP的表达式查询用法详解
Sep 14 PHP
PHP微信红包生成代码分享
Oct 06 PHP
PHP+Ajax无刷新带进度条图片上传示例
Feb 08 PHP
RSA实现JS前端加密与PHP后端解密功能示例
Aug 05 PHP
php字符串倒叙
Apr 01 #PHP
Memcached介绍及php-memcache扩展安装
PHP策略模式写法
Apr 01 #PHP
php中pcntl_fork详解
Apr 01 #PHP
php 解析非标准json、非规范json
Apr 01 #PHP
php 原生分页
Apr 01 #PHP
php远程请求CURL案例(爬虫、保存登录状态)
Apr 01 #PHP
You might like
php下实现折线图效果的代码
2007/04/28 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
PHP定时任务获取微信access_token的方法
2016/10/10 PHP
jquery实现搜索框常见效果的方法
2015/01/22 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
javascript实现数组去重的多种方法
2016/03/14 Javascript
Bootstrap进度条组件知识详解
2016/05/01 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
2016/08/24 Javascript
jQuery源码分析之init的详细介绍
2017/02/13 Javascript
JavaScript制作简单的框选图表
2017/05/15 Javascript
用React实现一个完整的TodoList的示例代码
2017/10/30 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
2018/08/24 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
2018/09/26 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
vue学习之Vue-Router用法实例分析
2020/01/06 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
用Python生成器实现微线程编程的教程
2015/04/13 Python
Python使用面向对象方式创建线程实现12306售票系统
2015/12/24 Python
python中多个装饰器的执行顺序详解
2018/10/08 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
Django实现单用户登录的方法示例
2019/03/28 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
2019/06/17 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
windows系统Tensorflow2.x简单安装记录(图文)
2021/01/18 Python
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
英国最大的百货公司:Harrods
2016/08/18 全球购物
绝对经典成功的大学生推荐信
2013/11/08 职场文书
护理专业毕业生自荐信范文
2014/01/05 职场文书
2019消防宣传标语!
2019/07/10 职场文书
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js
python周期任务调度工具Schedule使用详解
2021/11/23 Python
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers