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 09 PHP
CakePHP去除默认显示的标题及图标的方法
Oct 22 PHP
第4章 数据处理-php正则表达式-郑阿奇(续)
Jul 04 PHP
php笔记之:有规律大文件的读取与写入的分析
Apr 26 PHP
php 常用算法和时间复杂度
Jul 01 PHP
修改destoon会员公司的伪静态中的com目录的方法
Aug 21 PHP
php采集中国代理服务器网的方法
Jun 16 PHP
php遍历解析xml字符串的方法
May 05 PHP
利用PHPStorm如何开发Laravel应用详解
Aug 30 PHP
在laravel中使用with实现动态添加where条件
Oct 10 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
May 02 PHP
laravel中Redis队列监听中断的分析
Sep 14 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/31 PHP
php从csv文件读取数据并输出到网页的方法
2015/03/14 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
Javascript 面向对象 重载
2010/05/13 Javascript
javascript如何判断输入的url是否正确
2014/04/11 Javascript
jquery form 隐藏的input 选择
2014/04/29 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
javascript中sort()的用法实例分析
2015/01/30 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
2015/05/09 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
分享javascript、jquery实用代码段
2016/10/20 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
JavaScript实现类似淘宝的购物车效果
2017/03/16 Javascript
javascript+html5+css3自定义弹出窗口效果
2017/10/26 Javascript
js中如何完美的解析数据
2018/03/18 Javascript
Node.js Windows Binary二进制文件安装方法
2019/05/16 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
2019/09/03 Javascript
[48:12]Secret vs Optic Supermajor 胜者组 BO3 第三场 6.4
2018/06/05 DOTA
[00:14]护身甲盾
2019/03/06 DOTA
基于python 二维数组及画图的实例详解
2018/04/03 Python
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
2018/07/06 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
2019/06/13 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
2020/01/02 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
2020/08/11 Python
通过实例解析Python文件操作实现步骤
2020/09/21 Python
学院书画协会部门岗位职责
2013/12/01 职场文书
温馨提示标语
2014/06/26 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
亮剑观后感500字
2015/06/05 职场文书
2015暑期爱心支教策划书
2015/07/14 职场文书
PyTorch的Debug指南
2021/05/07 Python