Maison >développement back-end >Problème PHP >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 . '/database.php'); return new Connection($dbConfig['hostname'], $dbConfig['hostport'], $dbConfig['username'], $dbConfig['password'], $dbConfig['database']); } }
(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(),'downLoadExcel'), array($data), 60 * 60 * 10 , function($data){ echo '执行超时' ; }, array($data) ); }
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!