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 相关文章推荐
分页显示Oracle数据库记录的类之一
Oct 09 PHP
PHP - Html Transfer Code
Oct 09 PHP
php cookie 登录验证示例代码
Mar 16 PHP
php session 错误
May 21 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
Apr 23 PHP
域名和cookie问题(域名后缀)
Oct 10 PHP
php curl基本操作详解
Jul 23 PHP
PHP的构造方法,析构方法和this关键字详细介绍
Oct 22 PHP
浅谈php扩展imagick
Jun 02 PHP
Laravel 5框架学习之环境与配置
Apr 08 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
Feb 15 PHP
在Laravel5中正确设置文件权限的方法
May 22 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
短波的认识
2021/03/01 无线电
第1次亲密接触PHP5(2)
2006/10/09 PHP
PHP游戏编程25个脚本代码
2011/02/08 PHP
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
php中的filesystem文件系统函数介绍及使用示例
2014/02/13 PHP
PHP实现模仿socket请求返回页面的方法
2014/11/04 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
纯js简单日历实现代码
2013/10/05 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
JS控制日期显示的小例子
2013/11/23 Javascript
jQuery动态星级评分效果实现方法
2015/08/06 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
2016/06/13 Javascript
JavaScript html5利用FileReader实现上传功能
2020/03/27 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
深入探究node之Transform
2017/07/20 Javascript
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
2018/07/23 Javascript
vue基本使用--refs获取组件或元素的实例
2019/11/07 Javascript
vue-router 按需加载 component: () =&gt; import() 报错的解决
2020/09/22 Javascript
Python中的自定义函数学习笔记
2014/09/23 Python
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
Python内置函数delattr的具体用法
2017/11/23 Python
python的re正则表达式实例代码
2018/01/24 Python
python3 deque 双向队列创建与使用方法分析
2020/03/24 Python
CSS3的transition和animation的用法实例介绍
2014/08/20 HTML / CSS
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
什么是三层交换,说说和路由的区别在那里
2014/09/01 面试题
中专毕业生自荐信
2013/11/16 职场文书
初中毕业生的自我评价
2014/03/03 职场文书
单位作风建设自查报告
2014/10/23 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
小学记事作文之200字
2019/08/06 职场文书
实例详解Python的进程,线程和协程
2022/03/13 Python