Home >Backend Development >PHP Tutorial >Detailed explanation of how to control cycle time using PHP? (code example)

Detailed explanation of how to control cycle time using PHP? (code example)

青灯夜游
青灯夜游forward
2021-07-13 19:08:432553browse

This article will introduce you to the method of using PHP to control loop operation time through code examples. I hope it will be helpful to you!

Detailed explanation of how to control cycle time using PHP? (code example)

Execute a program in a loop, but during the execution of the loop, a timeout may occur and the program dies, so it is necessary to limit the maximum time for each loop operation. If it times out, the improvement process is directly disconnected and the next level of loop operation continues. Ctrip and multi-threading can complete this operation, but when you do not understand these advanced technologies, you can use this simple method instead.

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 . &#39;/database.php&#39;);
        return new Connection($dbConfig[&#39;hostname&#39;], $dbConfig[&#39;hostport&#39;], $dbConfig[&#39;username&#39;], $dbConfig[&#39;password&#39;], $dbConfig[&#39;database&#39;]);
    }
}

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

There cannot be a database before pcntl_fork Connection operation, so if it involves database operations, you must reconnect to the database during each cycle. After performing the operation, remember to disconnect the database, otherwise it will prompt MySQL server has gone away!

Recommended learning: "PHP Video Tutorial"

The above is the detailed content of Detailed explanation of how to control cycle time using PHP? (code example). For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:csdn.net. If there is any infringement, please contact admin@php.cn delete