是什么导致我的PHP代码冻结?我知道这是while循环的原因,但我有$ max_threads--;最后所以它不应该这样做。
<html>
<head>
<?php
$db = mysql_connect("host","name","pass") or die("Can't connect to host");
mysql_select_db("dbname",$db) or die("Can't connect to DB");
$sql_result = mysql_query("SELECT MAX(Thread) FROM test_posts", $db);
$rs = mysql_fetch_row($sql_result);
$max_threads = $rs[0];
$board = $_GET['board'];
?>
</head>
<body>
<?php
While($max_threads >= 0)
{
$sql_result = mysql_query("SELECT MIN(ID) FROM test_posts WHERE Thread=".$max_threads."", $db);
$rs = mysql_fetch_row($sql_result);
$sql_result = mysql_query("SELECT post FROM test_posts WHERE ID=".$rs[0]."", $db);
$post = mysql_fetch_row($sql_result);
$sql_result = mysql_query("SELECT name FROM test_posts WHERE ID=".$rs[0]."", $db);
$name = mysql_fetch_row($sql_result);
$sql_result = mysql_query("SELECT trip FROM test_posts WHERE ID=".$rs[0]."", $db);
$trip = mysql_fetch_row($sql_result);
if(!empty($post))
echo'<div class="postbox"><h4>'.$name[0].'['.$trip[0].']</h4><hr />' . $post[0] . '<br /><hr />[<a href="http://prime.programming-designs.com/test_forum/viewthread.php?thread='.$max_threads.'">Reply</a>]</div>';
$max_threads--;
}
?>
</body>
</html>
答案 0 :(得分:2)
首先,我建议完全摆脱无关的HTML位。然后,逐行缓慢地构建代码,看看是否可以找到有问题的行。因此,编写一个只连接到数据库的脚本,看看会发生什么。
如果你发现这个代码......
<?php
$db = mysql_connect("host","name","pass") or die("Can't connect to host");
mysql_select_db("dbname",$db) or die("Can't connect to DB");
?>
...导致冻结,然后它很容易成为MySQL服务器的问题。
但是,如果浏览器本身崩溃,这听起来像是系统的问题,而不是PHP或MySQL正在做的事情......
答案 1 :(得分:2)
尝试这1个SQL查询而不是那些1 +(4 * n)个查询:
SELECT MIN(ID), post, name, trip FROM test_posts GROUP BY Thread
最后也许是LIMIT 50
(或者要返回的最大线程数),这可能是很多数据。
您可以通过$max_threads
循环遍历此查询的结果,而不是while ($row = mysql_fetch_row($sql_result)) { /* echo(...); */ }
以及所有额外的数据库调用。
不确定与完全相同与您尝试获取的内容相同而不了解更多数据(获取论坛中每个帖子的根帖?),但它应该非常接近
(PS:如果这是一个线程化的2ch式论坛交易,我不确定这是一个理想的数据库设计。一个父子adjacency list可能比保持每个线程的数量计数更好。虽然猜测。)
答案 2 :(得分:1)
我在想这是因为你在每个循环中访问sql数据库4次。有没有办法可以一次访问它,然后从那里解析传入的数据?
$dbsql = 'SELECT * FROM my_database';
$result = mysql_query($dbsql);
while($row = mysql_fetch_array($result)) {
// Parse information here, rather than
// accessing the database for individual variables...
}
类似的东西。
更新
除了我已经说过的(你已经解雇了),我看到的只有一些在这里&amp;有编码怪癖:
此部分在echo和字符串之间没有空格。 'hr'元素没有起始括号。
echo '<div class="postbox"><h4>'.$name[0].'['.$trip[0].']</h4><hr>' . $post[0] . '<br /><hr />[<a href="http://prime.programming-designs.com/test_forum/viewthread.php?thread='.$max_threads.'">Reply</a>]</div>';
'while'不应该大写。
while($max_threads >= 0)
同样,干净的代码是一个很好的起点,但这就是我个人所拥有的。我刚刚清理了我自己的网站,它崩溃了IE(而没有其他浏览器),只是因为它有太多的标记错误。希望它有所帮助。
答案 3 :(得分:0)
也许你可以在你的代码中分散对这个简单函数的调用:
function of($required)
{
$args = func_get_args();
var_dump($args);
ob_flush();
flush();
}
of(__LINE__, $max_threads);
您也可以使用类似的内容进行查询:
function mydb_query($query, $db = null)
{
$args = func_get_args();
$result = call_user_func_array('mysql_query', $args);
if (!$result) {
of(array(__FUNCTION__), mysql_error(), $sql);
//return something else?
}
return $result;
}
$result = mydb_query("SELECT post, name, trip FROM test_posts WHERE ID = (SELECT MIN(ID) FROM test_posts WHERE Thread={$max_threads})", $db);
你应该使用mysqli / PDO / framework来支持预准备语句。
答案 4 :(得分:0)
该脚本可能超出了最大服务器执行时间阈值,请在文件顶部尝试执行此操作以确认这一点:
ini_set('max_execution_time', '180');