• 技术文章 >后端开发 >PHP问题

    php如何控制循环执行的时间

    王林王林2021-02-12 09:40:45转载1459

    我们在循环执行某个程序时,可能会出现超时导致程序死掉的情况。所以我们有必要限制每个循环执行的最长时间,以此来避免程序死掉的情况。

    如果超时,则直接断开改进程,并继续下一层循环操作。携程,多线程都可以完成该操作,但在没有了解这些高深技术的时候,可以用这个简便的方法替代。

    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']);
        }
    }

    (学习视频分享:php视频教程

    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如何控制循环执行的时间的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除
    专题推荐:php 循环 时间
    上一篇:php mysql 转义的方法 下一篇:php如何解决跨域问题
    20期PHP线上班

    相关文章推荐

    精选22门好课,价值3725元,开通VIP免费学习!• C语言中要改变循环语句的流程可以使用的语句有哪些• While、Loop和Repeat三种循环语句有什么异同?• continue语句只用于循环语句中,它的作用是什么• c语言可以用来实现循环的结构化语句是什么
    1/1

    PHP中文网