php能不能循环运行,php如何控制循环执行的时间

402cb8ec49f677f634784fadbcf5fcc3.png

我们在循环执行某个程序时,可能会出现超时导致程序死掉的情况。所以我们有必要限制每个循环执行的最长时间,以此来避免程序死掉的情况。

如果超时,则直接断开改进程,并继续下一层循环操作。携程,多线程都可以完成该操作,但在没有了解这些高深技术的时候,可以用这个简便的方法替代。

TaskAsync.phpnamespace 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']);

}

}

(学习视频分享:php视频教程)

index.phpuse 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教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值