温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何利用PHP操控循环时间

发布时间:2021-07-14 09:55:36 来源:亿速云 阅读:164 作者:chen 栏目:编程语言

这篇文章主要讲解了“如何利用PHP操控循环时间”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何利用PHP操控循环时间”吧!

循环执行某个程序,但循环执行过程中,可能会超时导致程序死掉,因此需要限制每个循环操作的最长时间。如果超时,则直接断开改进程,并继续下一层循环操作。携程,多线程都可以完成该操作,但在没有了解这些高深技术的时候,可以用这个简便的方法替代。

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

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 之前,不能有数据库连接操作,所以,如果涉及到数据库的操作,在每次循环的时候,一定要重新连接数据库,执行完操作,要记得断开数据库连接,否则这样会提示 MySQL server has gone away !

感谢各位的阅读,以上就是“如何利用PHP操控循环时间”的内容了,经过本文的学习后,相信大家对如何利用PHP操控循环时间这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI