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静态新闻列表自动生成代码
Jun 14 PHP
备份mysql数据库的php代码(一个表一个文件)
May 28 PHP
PHP新手用的Insert和Update语句构造类
Mar 31 PHP
php中如何防止表单的重复提交
Aug 02 PHP
使用PHP备份MYSQL数据的多种方法
Jan 15 PHP
php无限遍历目录示例
Feb 21 PHP
学习php设计模式 php实现建造者模式
Dec 07 PHP
学习php设计模式 php实现模板方法模式
Dec 08 PHP
PHP实现截取中文字符串不出现?号的解决方法
Dec 29 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
Mar 15 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
Laravel推荐使用的十个辅助函数
May 10 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 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
php在线解压ZIP文件的方法
2014/12/30 PHP
php使用cookie显示用户上次访问网站日期的方法
2015/01/26 PHP
PHP中如何判断exec函数执行成功?
2016/08/04 PHP
php 三大特点:封装,继承,多态
2017/02/19 PHP
PDO::inTransaction讲解
2019/01/28 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
2019/02/15 PHP
改版了网上的一个js操作userdata
2007/04/27 Javascript
js数组Array sort方法使用深入分析
2013/02/21 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
2013/12/14 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
兼容浏览器的js事件绑定函数(详解)
2017/05/09 Javascript
React中常见的动画实现的几种方式
2018/01/10 Javascript
vue-router懒加载速度缓慢问题及解决方法
2018/11/25 Javascript
JavaScript格式化json和xml的方法示例
2019/01/22 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
webpack项目使用eslint建立代码规范实现
2019/05/16 Javascript
jQuery实现验证用户登录
2019/12/10 jQuery
JavaScript实现模态对话框实例
2020/01/13 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
[01:04:05]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[31:29]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第一场 12.20
2020/12/23 DOTA
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
商务日语毕业生自荐信范文
2013/11/14 职场文书
大二法学专业职业生涯规划范文
2014/02/12 职场文书
成人继续教育实施方案
2014/03/01 职场文书
班主任工作经验交流材料
2014/05/13 职场文书
孕妇病假条怎么写
2015/08/17 职场文书
小学语文教师研修感悟
2015/11/18 职场文书
Win Server2016远程桌面如何允许多用户同时登录
2022/06/10 Servers