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
yii的CURD操作实例详解
Dec 04 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
Dec 16 PHP
php获取远程文件的内容和大小
Nov 03 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
May 24 PHP
浅谈Laravel中的一个后期静态绑定
Aug 11 PHP
Yii2框架可逆加密简单实现方法
Aug 25 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
Apr 02 PHP
php实现的表单验证类完整示例
Aug 13 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 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 进度条实现代码
2009/03/10 PHP
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
PHP数据集构建JSON格式及新数组的方法
2012/11/07 PHP
PHP中substr函数字符串截取用法分析
2016/01/07 PHP
PHP的PDO连接讲解
2019/01/24 PHP
jQuery对表单元素的取值和赋值操作代码
2011/05/19 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
2013/06/13 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
js和jquery设置disabled属性为true使按钮失效
2014/08/07 Javascript
HTML5+setCutomValidity()函数验证表单实例分享
2015/04/24 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
微信小程序 删除项目工程实现步骤
2016/11/10 Javascript
JavaScript数组复制详解
2017/02/02 Javascript
基于Vue的ajax公共方法(详解)
2018/01/20 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
2018/06/09 jQuery
vue基于better-scroll仿京东分类列表
2020/06/30 Javascript
Python查询阿里巴巴关键字排名的方法
2015/07/08 Python
Python随机数用法实例详解【基于random模块】
2017/04/18 Python
Python正则表达式非贪婪、多行匹配功能示例
2017/08/08 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
为什么说Python可以实现所有的算法
2019/10/04 Python
python 将视频 通过视频帧转换成时间实例
2020/04/23 Python
python生成xml时规定dtd实例方法
2020/09/21 Python
python实现图片转字符画的完整代码
2021/02/21 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
2021/03/03 Python
武汉东之林科技有限公司机试
2013/09/17 面试题
学校班班通实施方案
2014/06/11 职场文书
欢迎标语大全
2014/06/21 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
领导激励员工的演讲稿,各种会上用得到,建议收藏
2019/08/13 职场文书
goland 恢复已更改文件的操作
2021/04/28 Golang
docker-compose部署Yapi的方法
2022/04/08 Servers
nginx 添加http_stub_status_module模块
2022/05/25 Servers