【发布时间】:2015-09-02 08:03:08
【问题描述】:
我一直在处理 php - mysqli 引发的异常,并在下面创建了这个 sn-p,它试图检查几次以查看临时故障是否导致数据库失败。如果是这样,它会尝试恢复。如果不能,则退出/结束。
现在虽然逻辑没问题,但我不知道为什么 echo 语句没有按应有的规律间隔出现。仅在最后(取决于 findMail() 函数中抛出异常的方式),输出才会被正确地吐出。 throw new exception 行可以更改为始终失败或最后一次通过。它被设置为通过 sn-p 中的最后一轮。如果有人能指出我为什么 echo 没有按间隔显示输出,那就太好了。
此外,我不确定这在生产中是好主意还是坏主意。非常欢迎对此提供任何反馈。谢谢大家。
代码片段:
<?php
$host = 'localhost';
$user = 'root';
$password = '';
$database = 'test';
// OPEN A CONNECTION TO THE DATA BASE SERVER AND SELECT THE DB
try
{
$con = new mysqli($host,$user,$password,$database);
if($con->connect_error)
{
throw new Exception("Goof Up");
}
mysqli_set_charset($con, "utf8");
}
catch(Exception $e)
{
echo $e->getMessage();
exit;
}
// All well so far
$cnt = 0;
if(findMail($con,$cnt)) echo "<br> Hurray !!";
function findMail($con,$cnt)
{
try
{
echo $cnt++."<br>";
$query = "SELECT name, email from users";
$stmt=$con->prepare($query);
if($cnt < 3 ) throw new exception($cnt);
if($stmt->execute())
{
$stmt->bind_result($name, $email);
while ($stmt->fetch())
{
$email = htmlspecialchars($email);
$name = htmlspecialchars($name);
echo $name.' ---- '.$email.'<br>';
}
}
}
catch(Exception $e)
{
$cnt = (int)($e->getMessage());
// echo $cnt;
if($cnt === 4) { echo "Ending"; exit();}
sleep(5);
findMail($con,$cnt);
}
return true;
}
?>
【问题讨论】:
-
能否将输出添加到您的代码 sn-p 中?
-
确定输出是 0 1 2 我得到了名字 --- 电子邮件和“万岁!” .输出正确且符合预期。只是应该以 5 秒的间隔回显 0、1、2 等,但事实并非如此。整个输出发生在 20 秒间隔结束时,或者取决于
if($cnt
-
如何使用flush() / ob_flush() - 这样做的原因是什么:
if($cnt < 3 ) throw new exception($cnt);? -
是的,我尝试了函数 flush() 但这也不起作用。
if ($cnt 的原因是模拟失败 3 次,最后让查询第 4 次成功。只是为了检查代码是否会根据需要处理意外查询,即不会立即终止程序,而是在退出之前尝试几次($cnt)。
-
这是我根据您的建议修改的文件的链接。 codepen.io/ajoo/pen/OVjdqj.html 链接>。请注意,errScript.php 只包含一行代码。 '
if(findMail($con,$cnt)) echo "万岁!!"
'