• 技术文章 >后端开发 >php教程

    详解利用PHP如何操控循环时间?(代码示例)

    青灯夜游青灯夜游2021-07-13 19:10:09转载559
    本篇文章给大家通过代码示例介绍一下使用PHP控制循环操作时间的方法,希望对大家有所帮助!

    循环执行某个程序,但循环执行过程中,可能会超时导致程序死掉,因此需要限制每个循环操作的最长时间。如果超时,则直接断开改进程,并继续下一层循环操作。携程,多线程都可以完成该操作,但在没有了解这些高深技术的时候,可以用这个简便的方法替代。

    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如何操控循环时间?(代码示例)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除
    专题推荐:PHP
    上一篇:带大家学习PHP中的文件系统函数(一) 下一篇:聊聊PHP中的代理模式(正向代理和反向代理)
    第16期线上培训班

    相关文章推荐

    • PHP如何使用回溯算法计算组合总和• php怎么给数组增加值• php如何去掉重复元素• PHP如何实现字符串相加• PHP如何判断是否为有效的完全平方数• php怎么去掉右边空格

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网