Heim  >  Artikel  >  Backend-Entwicklung  >  So steuern Sie die Schleifenausführungszeit in PHP

So steuern Sie die Schleifenausführungszeit in PHP

王林
王林nach vorne
2021-02-12 09:40:453330Durchsuche

So steuern Sie die Schleifenausführungszeit in PHP

Wenn wir ein Programm in einer Schleife ausführen, kann es zu einer Zeitüberschreitung kommen und das Programm stirbt ab. Daher müssen wir die maximale Ausführungszeit jeder Schleife begrenzen, um einen Programmtod zu vermeiden.

Bei einer Zeitüberschreitung wird der Verbesserungsprozess direkt unterbrochen und mit der nächsten Ebene des Schleifenbetriebs fortgefahren. Ctrip und Multithreading können diesen Vorgang abschließen. Wenn Sie diese fortschrittlichen Technologien jedoch nicht verstehen, können Sie stattdessen diese einfache Methode verwenden.

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

(Lernvideo-Sharing: php-Video-Tutorial)

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 Vorher kann es keinen Datenbankverbindungsvorgang geben. Wenn es sich also um Datenbankvorgänge handelt, erfolgt in jeder Schleife die Zeit: Stellen Sie sicher, dass Sie nach dem Ausführen des Vorgangs die Verbindung zur Datenbank wiederherstellen. Andernfalls wird angezeigt, dass der MySQL-Server nicht mehr verfügbar ist. Verwandte Empfehlungen:

php-Tutorial

Das obige ist der detaillierte Inhalt vonSo steuern Sie die Schleifenausführungszeit in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:PHP-MySQL-Escape-MethodeNächster Artikel:PHP-MySQL-Escape-Methode