【发布时间】:2014-04-03 10:28:13
【问题描述】:
我正在尝试使用以下代码生成 1500 验证码:
<?php
include "../include/top.php";
set_time_limit(0);
ini_set("memory_limit", "-1");
$end=0;
while ($end<1500)
{
//generate an authentication code
$string="ABCDEFGHJKLMNPQRSTUVWXYZ123456789";
$string= substr(str_shuffle($string),5,8) ;
//check whether generated code already exist
$query = "select count(*) from auth where code = '$string' ";
$stmt = prepare ($query);
execute($stmt);
$bind = mysqli_stmt_bind_result($stmt, $count);
check_bind_result($bind);
mysqli_stmt_fetch($stmt);
mysqli_stmt_free_result($stmt);
//If generated code does not already exist, insert it to Database table
if ($count == 0)
{
echo $string."<br>";
$query = "insert into auth (Code) values ('$string')";
$stmt = prepare ($query);
execute($stmt);
$end++;
}
}
?>
它在 15 秒内生成并在数据库中插入 1024 个代码并在浏览器中打印 667 个代码,并且浏览器继续加载而不插入/打印更多代码,直到半小时后我关闭浏览器窗口。 之后,当从 WAMP 在浏览器中打开任何网页时,它显示为浏览器正在加载并且不显示内容。也就是说,在打开任何网页之前,我需要在运行此脚本后重新启动 WAMP。 这个我试过很多次了。
为什么脚本没有生成 1500 个代码并且在达到计数 667/1024 时总是停止?
更新
作为一个实验,我在 IF 条件中添加了一个 ELSE 子句,并编写了代码以在 ELSE 子句中打印“代码已存在”。并使用同一张表的空(截断)副本运行脚本,然后打印并插入 1024 个代码,然后连续打印“代码已存在”(5 分钟内约有 700 000 多个条目并继续)。同样,当使用只有 1024 行的表运行脚本时,它甚至不会打印或插入单个代码。相反,它无限地继续打印“代码已经存在”。 我观察到的另一件事是 WHILE 循环的第一个 1024 次迭代通过了 IF 条件(如果表为空)。并且所有后续迭代都失败了 IF 条件。
【问题讨论】:
-
http 服务器错误日志文件中有任何条目吗?
-
@arkascha 在 Appache 错误日志文件中未发现错误
-
@arkascha 我已经更新了我的代码。实际上我第一次发布了错误的代码。对不起..
-
如果没有数据库结构和准备/执行函数的作用(因为它们似乎由您定义),很难进行测试,但听起来您正在泄漏 mysqli 句柄/连接。打印/存储之间的差异可能是由 httpd 中的缓冲引起的,并且由于它耗尽了可用的 MySQL 句柄,因此必须重新启动 httpd 才能让它们全部消失。
-
代码栏有索引吗?否则,您将进行不断增长的逐行搜索以查找代码是否已存在。另外,我不会将其用作密码,因为它永远不会重复使用字符,因此您限制了最大排列数(除非您特别想这样做)。
标签: php string shuffle secret-key