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自定义函数截取汉字长度
May 15 PHP
Laravel 4.2 中队列服务(queue)使用感受
Oct 30 PHP
php常用hash加密函数
Nov 22 PHP
php常见的魔术方法详解
Dec 25 PHP
php实现检查文章是否被百度收录
Jan 27 PHP
php查询mysql大量数据造成内存不足的解决方法
Mar 04 PHP
WordPress中限制非管理员用户在文章后只能评论一次
Dec 31 PHP
简单谈谈PHP中strlen 函数
Feb 27 PHP
PHP模板引擎Smarty中的保留变量用法分析
Apr 11 PHP
Yii2创建控制器(createController)方法详解
Jul 23 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
Jun 28 PHP
关于php开启错误提示的总结
Sep 24 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
thinkphp的c方法使用示例
2014/02/24 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
2015/03/26 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
2018/10/12 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
2020/08/17 PHP
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
2014/05/11 Javascript
js实现可得到不同颜色值的颜色选择器实例
2015/02/28 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
简述vue中的config配置
2018/01/23 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
小程序实现搜索框
2020/06/19 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
python将html转成PDF的实现代码(包含中文)
2013/03/04 Python
python logging类库使用例子
2014/11/22 Python
Python提取网页中超链接的方法
2016/09/18 Python
Python2随机数列生成器简单实例
2017/09/04 Python
Python Selenium 之关闭窗口close与quit的方法
2019/02/13 Python
python获取引用对象的个数方式
2019/12/20 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
python 模拟登录B站的示例代码
2020/12/15 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
运动会广播稿50字
2014/01/26 职场文书
3分钟英语演讲稿
2014/04/29 职场文书
实践论读书笔记
2015/06/29 职场文书
网络舆情信息简报
2015/07/21 职场文书
任命书格式范文
2015/09/22 职场文书
python基于tkinter实现gif录屏功能
2021/05/19 Python
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技
Java 常见的限流算法详细分析并实现
2022/04/07 Java/Android
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
2022/06/01 Java/Android