php中的致命错误(超过60s的执行时间)

时间:2010-02-13 13:36:41

标签: php mysql

我写了一个代码来更新我网站中的密码加密。 代码是......

<?php
$db= mysql_pconnect("localhost","root","root");
mysql_select_db("nitconnect");
$query="select password from register limit 1000";
$result=mysql_query($query);
$c=0;
while($ans=mysql_fetch_array($result))
{
    $newpass=sha1($ans[0].'Q*iV%qKz$&!C');
    $newone="update register set password='{$newpass}' where password='{$ans[0]}'";
    mysql_query($newone);
}
?>

如何更正此错误?

5 个答案:

答案 0 :(得分:1)

除了在php.ini中设置php的max_execution_time之外,没有其他真正的解决方案,但是:

mysql原生支持sha1,所以也许你可以做一些像

这样的事情
update register set password = sha1(concat(password, 'Q*iV%qKz$&!C'))

这应该比你的php解决方案快得多。

除非你在古老的盒子上,否则你的查询性能仍然很低。也许你没有为密码字段定义索引?

答案 1 :(得分:1)

<?php 

  $db= mysql_pconnect("localhost","root","root"); 
  mysql_select_db("nitconnect"); 
  $query="UPDATE register SET password = SHA1(CONCAT(password, 'Q*iV%qKz$&!C')) WHERE 1"; 
  $result=mysql_query($query);

?> 

答案 2 :(得分:0)

假设MySQL的原生SHA1方法(如罗马建议的)不起作用,请尝试将其添加到循环中:

set_time_limit(10);

它基本上会在每次调用该函数时重置PHP超时,再给它10秒钟。

答案 3 :(得分:0)

您正在选择1000条记录,然后在foreach循环中使用每个值并再次更新数据库,这可能会让您失去时间,尝试通过将其放在脚本之上来增加时间限制:

ini_set('max_execution_time', 14000); // or whatever value

答案 4 :(得分:0)

另一个解决方案是以块的形式进行记录,然后使用标头将自己发送回相同的脚本,传递最后更新的记录的索引,然后执行下一个块。

类似的东西:

if(issset($_GET['start']) {
   $start = $_GET['start'];
} else {
   $start = 0;
}

$query="select password from register limit $start, 50";
... do your stuff ...

$start = $start + 50;
header("Location: http://www.example.com/yourscript.php?start=$start");