Hot For Coding

在PHP中用sleep导致诡异事件

近日,由于项目需求

需要用到sleep()函数定时从数据库取一堆数据出来去执行某些操作。

sleep()等待的时间至少有一个小时以上

此前做过测试

sleep()函数去完成数小时后执行的操作是可行的

可邪门的问题出来了

程序用sleep()后发现不能从数据库取到相应的信息

sleep()去掉

结果正常

郁闷中。。。

难道sleep()影响读库操作!!!

于是为了方便测试

直接来个sleep(10)十秒后执行

结果能从数据库读取信息

可为什么sleep()一个小时后不能读取信息呢?

为了测试方便我直接在sleep()语句前读库一次,sleep()后再读一次库

<?php
// 琼台博客 www.qttc.net

require_once('include.php');
// 读取数据库信息
$data = $db->getList();
print_r($data);
 
// 定时一个小时以后
sleep(3600);
 
// 再读取一次信息
$data = $db->getList();
print_r($data);
 
?>

结果发现: 第一次读库成功 第二次读库为空

于是再把sleep()改成十秒钟后再测试一次

<?php
// 琼台博客 www.qttc.net

require_once('include.php');
// 读取数据库信息
$data = $db->getList();
print_r($data);
 
// 定时十秒以后
sleep(10);
 
// 再读取一次信息
$data = $db->getList();
print_r($data);
 
?>

以上结果: 两次读库成功

为何一个小时读库失败,十秒钟却读库成功呢??

我用的是单例数据库操作类

想起一个问题

会不会是数据库连接超时导致读库失败呢?

于是赶紧把此处读库操作改成现连

<?php
// 琼台博客 www.qttc.net

require_once('include.php');
// 读取数据库信息
$data = getList();
print_r($data);
 
// 定时一个小时以后
sleep(3600);
 
// 再读取一次信息
$data = getList();
print_r($data);
 
// 读取数据库信息
function getList(){
  $pdo = new PDO('mysql:host=localhost;dbname=test','root','root');
  $result = $pdo->query('select * from tables');
  return $result->fetchAll(PDO::FETCH_ASSOC);
}
?>

测试成功!!

原来sleep()会导致单例类超时问题从而出现执行时间过长以后数据库连接可能断开问题,也就不能读到数据库信息!

分享

TITLE: 在PHP中用sleep导致诡异事件

LINK: https://www.qttc.net/75-php-be-careful-using-sleep.html

NOTE: 原创内容,转载请注明出自琼台博客