在PHP中用sleep導致詭異事件

在PHP中用sleep導致詭異事件

 

近日,由於項目需求

需要用到sleep函數定時從數據庫取一堆數據出來去執行某些操作。

 

sleep等待的時間至少有一個小時以上

此前做過測試

用sleep函數去完成數小時後執行的操作是可行的

 

可邪門的問題出來了

程序用sleep後發現不能從數據庫取到相應的信息

把sleep去掉

結果正常

 

鬱悶中。。。

難道sleep影響讀庫操作!!!

於是爲了方便測試

直接來個sleep(10) 十秒後執行

結果能從數據庫讀取信息

 

可爲什麼sleep()一個小時後不能讀取信息呢?

爲了測試方便我直接在sleep語句前讀庫一次,sleep後再讀一次庫

如:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<?php

require_once('include.php');

// 讀取數據庫信息

$data = $db->getList();

print_r($data);

 

// 定時一個小時以後

sleep(3600);

 

// 再讀取一次信息

$data = $db->getList();

print_r($data);

 

?>

結果發現

第一次讀庫成功

第二次讀庫爲空

 

於是再把sleep改成十秒鐘後再測試一次

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<?php

require_once('include.php');

// 讀取數據庫信息

$data = $db->getList();

print_r($data);

 

// 定時十秒以後

sleep(10);

 

// 再讀取一次信息

$data = $db->getList();

print_r($data);

 

?>

以上結果

兩次讀庫成功

 

爲何一個小時讀庫失敗,十秒鐘卻讀庫成功呢??

我用的是單例數據庫操作類

想起一個問題

會不會是數據庫連接超時導致讀庫失敗呢?

於是趕緊把此處讀庫操作改成現連

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<?php

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會導致單例類超時問題從而出現執行時間過長以後數據庫連接可能斷開問題,也就不能讀到數據庫信息!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章