为什么我的PHP脚本会冻结?

时间:2010-03-11 16:53:41

标签: php

是什么导致我的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>

5 个答案:

答案 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');