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 文件缓存函数
Oct 08 PHP
php实现快速排序法函数代码
Aug 27 PHP
PHP获取MSN好友列表类的实现代码
Jun 23 PHP
跟我学Laravel之路由
Oct 15 PHP
php链表用法实例分析
Jul 09 PHP
php实现简单的MVC框架实例
Sep 23 PHP
thinkphp命名空间用法实例详解
Dec 30 PHP
php打包网站并在线压缩为zip
Feb 13 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
Oct 29 PHP
PHP实现基于3DES算法加密解密字符串示例
Aug 24 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
Sep 26 PHP
PHP读取文件或采集时解决中文乱码
Mar 09 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
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
实现PHP多线程异步请求的3种方法
2014/01/17 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
php通过array_shift()函数移除数组第一个元素的方法
2015/03/18 PHP
php实现的mongodb操作类实例
2015/04/03 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
Laravel中9个不经常用的小技巧汇总
2019/04/16 PHP
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
一分钟理解js闭包
2016/05/04 Javascript
jQuery+css实现非常漂亮的水平导航菜单效果
2016/07/27 Javascript
解析js如何获取css样式
2016/12/11 Javascript
js的函数的按值传递参数(实例讲解)
2017/11/16 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
用Python进行一些简单的自然语言处理的教程
2015/03/31 Python
Python with用法实例
2015/04/14 Python
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
pandas DataFrame数据转为list的方法
2018/04/11 Python
基于pycharm导入模块显示不存在的解决方法
2018/10/13 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
Python list与NumPy array 区分详解
2019/11/06 Python
python pandas利用fillna方法实现部分自动填充功能
2020/03/16 Python
Python如何发送与接收大型数组
2020/08/07 Python
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
《歌唱二小放牛郎》教学反思
2014/04/19 职场文书
2014年教师党员自我评价范文
2014/09/22 职场文书
党建工作汇报材料
2014/12/24 职场文书
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android