Maison  >  Article  >  développement back-end  >  Comment contrôler le temps de fonctionnement de la boucle en PHP

Comment contrôler le temps de fonctionnement de la boucle en PHP

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-05-25 17:26:491271parcourir

Cet article vous présentera comment contrôler le temps des opérations de boucle en PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Comment contrôler le temps de fonctionnement de la boucle en PHP

Exécute un programme en boucle, mais pendant l'exécution de la boucle, un timeout peut survenir et le programme meurt, il est donc nécessaire de limiter le temps maximum pour chaque opération en boucle . 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(),&#39;downLoadExcel&#39;),
                        array($data),
                        60 * 60 * 10 ,
                        function($data){
                            echo &#39;执行超时&#39; ;
                        },
                        array($data)
                    );
}

pcntl_fork Avant, il ne pouvait 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, Lors de chaque boucle, vous devez vous reconnecter à la base de données. Après avoir effectué l'opération, pensez à déconnecter la base de données, sinon cela affichera un message indiquant que le serveur MySQL a 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