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和MySql来与ODBC数据连接
Oct 09 PHP
一个分页的论坛
Oct 09 PHP
ThinkPHP php 框架学习笔记
Oct 30 PHP
php图片上传存储源码并且可以预览
Aug 26 PHP
解析PHP中的内存管理,PHP动态分配和释放内存
Jun 28 PHP
php求两个目录的相对路径示例(php获取相对路径)
Mar 27 PHP
php简单定时执行任务的实现方法
Feb 23 PHP
PHP5.3新特性小结
Feb 14 PHP
yii2.0整合阿里云oss的示例代码
Sep 19 PHP
PHP正则匹配到2个字符串之间的内容方法
Dec 24 PHP
PHP使用ajax的post方式下载excel文件简单示例
Aug 06 PHP
关于Yii中模型场景的一些简单介绍
Sep 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
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
用Flash图形化数据(一)
2006/10/09 PHP
第六章 php目录与文件操作
2011/12/30 PHP
php中smarty区域循环的方法
2015/06/11 PHP
PHP 错误处理机制
2015/07/06 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
写JQuery插件的基本知识
2013/11/25 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
详解nodejs微信公众号开发——1.接入微信公众号
2017/04/10 NodeJs
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
2018/03/26 Javascript
Angular value与ngValue区别详解
2019/11/27 Javascript
[57:59]EG vs Secret 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
Python中的元类编程入门指引
2015/04/15 Python
Python脚本实现自动发带图的微博
2016/04/27 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
解决springboot yml配置 logging.level 报错问题
2020/02/21 Python
pygame实现弹球游戏
2020/04/14 Python
零基础小白多久能学会python
2020/06/22 Python
Python连接Impala实现步骤解析
2020/08/04 Python
浅谈CSS3特性查询(Feature Query: @supports)功能简介
2017/07/31 HTML / CSS
宿舍违规用电检讨书
2014/02/16 职场文书
暑期培训随笔感言
2014/03/10 职场文书
公司晚会主持词
2014/03/22 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
自我查摆剖析材料
2014/10/11 职场文书
党员个人整改措施
2014/10/24 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书