Maison  >  Article  >  développement back-end  >  Explication détaillée de la façon de contrôler le temps de cycle en utilisant PHP ? (exemple de code)

Explication détaillée de la façon de contrôler le temps de cycle en utilisant PHP ? (exemple de code)

青灯夜游
青灯夜游avant
2021-07-13 19:08:432522parcourir

Cet article expliquera comment utiliser PHP pour contrôler le temps de fonctionnement de la boucle à travers des exemples de code. J'espère qu'il vous sera utile !

Explication détaillée de la façon de contrôler le temps de cycle en utilisant PHP ? (exemple de code)

Un programme est exécuté en boucle, mais pendant l'exécution de la boucle, un délai d'attente peut se produire et le programme meurt, donc la durée maximale de chaque opération en boucle doit être limitée. Si le délai expire, le processus d'amélioration est directement déconnecté et le niveau suivant de fonctionnement en boucle continue. Ctrip et le multi-threading peuvent compléter cette opération, mais lorsque vous ne comprenez pas ces technologies avancées, vous pouvez utiliser cette méthode simple à la place.

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

pcntl_fork Avant, il ne peut pas y avoir d'opération de connexion à la base de données, donc si cela implique des opérations de base de données, vous devez vous reconnecter à chaque fois qu'il boucle la base de données, après avoir effectué l'opération, n'oubliez pas de déconnecter la connexion à la base de données, sinon le serveur MySQL aura disparu !

Apprentissage recommandé : "Tutoriel vidéo PHP"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer