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 preg_match_all结合str_replace替换内容中所有img
Oct 11 PHP
PHP得到mssql的存储过程的输出参数功能实现
Nov 23 PHP
非常精妙的PHP递归调用与静态变量使用
Dec 16 PHP
浅谈apache和nginx的rewrite的区别
Feb 22 PHP
基于PHP生成静态页的实现方法
May 10 PHP
PHP 异步执行方法,模拟多线程的应用分析
Jun 03 PHP
php日期操作技巧小结
Jun 25 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
Jul 10 PHP
php快速导入大量数据的实例方法
Sep 23 PHP
php+iframe 实现上传文件功能示例
Mar 04 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 PHP
通过实例解析PHP数据类型转换方法
Jul 11 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
B2K与车机的中波PK
2021/03/02 无线电
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
2016/08/29 Javascript
js对象浅拷贝和深拷贝详解
2016/09/05 Javascript
AngularJS API之copy深拷贝详解及实例
2016/09/14 Javascript
图片懒加载插件实例分享(含解析)
2017/01/09 Javascript
JS实现的添加弹出层并完成锁屏操作示例
2017/04/07 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
layer.confirm取消按钮绑定事件的方法
2018/08/17 Javascript
解决Vue中 父子传值 数据丢失问题
2019/08/27 Javascript
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
[04:44]DOTA2西游记战队视频彩蛋流出 师徒开黑巧遇林书豪
2016/08/03 DOTA
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
Python入门篇之面向对象
2014/10/20 Python
详解Python中的多线程编程
2015/04/09 Python
python获取元素在数组中索引号的方法
2015/07/15 Python
在jupyter notebook 添加 conda 环境的操作详解
2020/04/10 Python
Python  word实现读取及导出代码解析
2020/07/09 Python
Pycharm添加虚拟解释器报错问题解决方案
2020/10/13 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
农民工创业典型事迹
2014/01/25 职场文书
社区活动邀请函范文
2014/01/29 职场文书
初二生物教学反思
2014/02/03 职场文书
职工代表大会主持词
2014/04/01 职场文书
技术负责人任命书
2014/06/05 职场文书
幼儿发展评估方案
2014/06/11 职场文书
学校党员对照检查材料
2014/08/28 职场文书
2015国庆节66周年演讲稿
2015/03/20 职场文书
员工手册董事长致辞
2015/07/29 职场文书
KTV员工管理制度
2015/08/06 职场文书
python控制台打印log输出重复的解决方法
2021/05/14 Python
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL
MySQL 数据表操作
2022/05/04 MySQL