Heim  >  Artikel  >  Backend-Entwicklung  >  So steuern Sie die Zeit des Schleifenvorgangs in PHP

So steuern Sie die Zeit des Schleifenvorgangs in PHP

醉折花枝作酒筹
醉折花枝作酒筹nach vorne
2021-05-25 17:26:491272Durchsuche

In diesem Artikel erfahren Sie, wie Sie die Zeit von Schleifenoperationen in PHP steuern. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

So steuern Sie die Zeit des Schleifenvorgangs in PHP

Ein Programm wird in einer Schleife ausgeführt, aber während der Schleifenausführung kann es zu einer Zeitüberschreitung kommen und das Programm stirbt ab, daher muss die maximale Zeit für jede Schleifenoperation begrenzt werden. Bei einer Zeitüberschreitung wird der Verbesserungsprozess direkt unterbrochen und die nächste Ebene des Schleifenbetriebs fortgesetzt. 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;]);
    }
}

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, müssen Sie in jeder Schleife erneut eine Verbindung zur Datenbank herstellen und den Vorgang abschließen. Denken Sie daran Trennen Sie die Datenbankverbindung, andernfalls wird die Meldung angezeigt, dass der MySQL-Server nicht mehr verfügbar ist!

Empfohlenes Lernen: php-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo steuern Sie die Zeit des Schleifenvorgangs 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