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函数篇详解十进制、二进制、八进制和十六进制转换函数说明
Dec 05 PHP
PHP随机生成随机个数的字母组合示例
Jan 14 PHP
PHP中使用memcache存储session的三种配置方法
Apr 05 PHP
php强制更新图片缓存的方法
Feb 11 PHP
php通过array_merge()函数合并两个数组的方法
Mar 18 PHP
php一个解析字符串排列数组的方法
May 12 PHP
PHP多文件上传实例
Jul 09 PHP
学习php设计模式 php实现桥梁模式(bridge)
Dec 07 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
Apr 24 PHP
php使用fullcalendar日历插件详解
Mar 06 PHP
thinkPHP5框架接口写法简单示例
Aug 05 PHP
PHP goto语句用法实例
Aug 06 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
ThinkPHP php 框架学习笔记
2009/10/30 PHP
php 变量未定义等错误的解决方法
2011/01/12 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
深入浅出php socket编程
2015/05/13 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
Nodejs极简入门教程(二):定时器
2014/10/25 NodeJs
JavaScript中的值类型转换介绍
2014/12/31 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
jQuery实现边框动态效果的实例代码
2016/09/23 Javascript
jquery实时获取时间的简单实例
2017/01/26 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
从零开始搭建webpack+react开发环境的详细步骤
2018/05/18 Javascript
简述vue路由打开一个新的窗口的方法
2018/11/29 Javascript
详解JavaScript中new操作符的解析和实现
2020/09/04 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
[01:07:19]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第一场
2018/04/06 DOTA
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
基于Pycharm加载多个项目过程图解
2020/01/19 Python
Python安装依赖(包)模块方法详解
2020/02/14 Python
html5实现输入框fixed定位在屏幕最底部兼容性
2020/07/03 HTML / CSS
英国探险旅游专家:Explore
2018/12/20 全球购物
护理专业自荐信
2013/12/03 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
大学生党员个人总结
2015/02/13 职场文书
明确岗位职责
2015/02/14 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书
七年级作文之下雨天
2019/12/23 职场文书
redis实现排行榜功能
2021/05/24 Redis
一篇文章弄懂Python中的内建函数
2021/08/07 Python
漫画「古见同学有交流障碍症」第25卷封面公开
2022/03/21 日漫