Comment contrôler le temps d'exécution d'une boucle en php

王林
Libérer: 2023-03-08 06:18:01
avant
3321 Les gens l'ont consulté

Comment contrôler le temps d'exécution d'une boucle en php

Lorsque nous exécutons un programme en boucle, un délai d'attente peut se produire, provoquant la mort du programme. Par conséquent, nous devons limiter le temps d’exécution maximum de chaque boucle pour éviter la mort du programme.

En cas d'expiration du délai, le processus d'amélioration sera directement déconnecté et passera au niveau suivant de fonctionnement en boucle. 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;]);
    }
}
Copier après la connexion

(Partage de vidéos d'apprentissage : Tutoriel vidéo php)

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)
                    );
}
Copier après la connexion

pcntl_fork Avant, Il ne peut pas y avoir d'opérations de connexion à la base de données, donc s'il s'agit d'opérations de base de données, vous devez vous reconnecter à la base de données à chaque fois que vous effectuez une boucle. Après avoir effectué l'opération, n'oubliez pas de déconnecter la connexion à la base de données, sinon le serveur MySQL a disparu !

Recommandations associées : Tutoriel 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!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal