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 相关文章推荐
Apache实现Web Server负载均衡详解(不考虑Session版)
Jul 05 PHP
php中生成随机密码的自定义函数代码
Oct 21 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
Apr 20 PHP
使用URL传输SESSION信息
Jul 14 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
Nov 16 PHP
Centos6.5和Centos7 php环境搭建方法
May 27 PHP
功能强大的php分页函数
Jul 20 PHP
PHP使用GD库输出汉字的方法【测试可用】
Nov 10 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
PHP-FPM的配置与优化讲解
Mar 15 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 PHP
Laravel登录失败次数限制的实现方法
Aug 26 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 增加了对 .ZIP 文件的读取功能
2006/10/09 PHP
php下把数组保存为文件格式的实例应用
2010/02/08 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
2014/07/25 PHP
PHP图片库imagemagick安装方法
2014/09/23 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
PHP实现简单计算器小程序
2020/08/28 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
灵活应用js调试技巧解决样式问题的步骤分享
2012/03/15 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
javascript模拟map输出与去除重复项的方法
2015/02/09 Javascript
详解Bootstrap按钮
2016/01/04 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
原来JS还可以这样拆箱转换详解
2019/02/01 Javascript
ES6模板字符串和标签模板的应用实例分析
2019/06/25 Javascript
原生js实现的金山打字小游戏(实例代码详解)
2020/03/16 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
python看某个模块的版本方法
2018/10/16 Python
python使用PIL实现多张图片垂直合并
2019/01/15 Python
Python字符串的一些操作方法总结
2019/06/10 Python
python子线程退出及线程退出控制的代码
2019/10/16 Python
python def 定义函数,调用函数方式
2020/06/02 Python
用Python 执行cmd命令
2020/12/18 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
20佳惊艳的HTML5应用程序示例分享
2011/05/03 HTML / CSS
英国最大的在线蜡烛商店:Candles Direct
2019/03/26 全球购物
SQL面试题
2013/12/09 面试题
出国导师推荐信
2014/01/16 职场文书
机械专业毕业生自我鉴定2014
2014/10/04 职场文书
简易离婚协议书范本2014
2014/10/15 职场文书
2015元旦节寄语
2014/12/08 职场文书
创先争优活动个人总结
2015/03/04 职场文书