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 相关文章推荐
php中文字母数字验证码实现代码
Apr 25 PHP
php 什么是PEAR?(第二篇)
Mar 19 PHP
php 面向对象的一个例子
Apr 12 PHP
PHP session有效期session.gc_maxlifetime
Apr 20 PHP
PHP的博客ping服务代码
Feb 04 PHP
php curl选项列表(超详细)
Jul 01 PHP
php实例分享之html转为rtf格式
Jun 02 PHP
php验证session无效的解决方法
Nov 04 PHP
php中cookie实现二级域名可访问操作的方法
Nov 11 PHP
PHP制作万年历
Jan 07 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
Oct 23 PHP
php生成mysql的数据字典
Jul 07 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静态文件生成类实例分析
2015/01/03 PHP
Ext.FormPanel 提交和 Ext.Ajax.request 异步提交函数的区别
2009/11/12 Javascript
图像替换新技术 状态域方法
2010/01/28 Javascript
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
js+jquery实现图片裁剪功能
2015/01/02 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
2015/11/24 Javascript
如何利用AngularJS打造一款简单Web应用
2015/12/05 Javascript
JavaScript脚本库编写的方法
2015/12/09 Javascript
浅谈JavaScript函数的四种存在形态
2016/06/08 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
在JavaScript中使用严格模式(Strict Mode)
2019/06/13 Javascript
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
微信小程序跨页面传递data数据方法解析
2019/12/13 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
javascript实现简单页面倒计时
2021/03/02 Javascript
理解python多线程(python多线程简明教程)
2014/06/09 Python
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
Python简明入门教程
2015/08/04 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
python安装pil库方法及代码
2019/06/25 Python
Python连接SQLite数据库并进行增册改查操作方法详解
2020/02/18 Python
jupyter notebook读取/导出文件/图片实例
2020/04/16 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
matplotlib 范围选区(SpanSelector)的使用
2021/02/24 Python
了解AppleShare protocol(AppleShare协议)吗
2015/08/28 面试题
制药工程专业个人求职自荐信
2014/01/25 职场文书
体育教学随笔感言
2014/02/24 职场文书
团队经理竞聘书
2014/03/31 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
2015庆祝七一建党节94周年活动总结
2015/03/20 职场文书
工厂仓库管理员岗位职责
2015/04/09 职场文书
辣妈辣妹观后感
2015/06/10 职场文书
Python Pandas数据分析之iloc和loc的用法详解
2021/11/11 Python