您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

详解利用PHP如何操控循环时间?(代码示例)

2024/3/27 16:52:39发布20次查看
本篇文章给大家通过代码示例介绍一下使用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如何操控循环时间?(代码示例)的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product