我有一个直接的PHP脚本,它执行一个mysql查询。基于此我然后运行大约10个mysql查询。然后我通过echo将结果返回给客户端。
但为了节省客户端的时间,我可以回显结果然后运行剩余的10个mysql查询服务器端,以便客户端获得更快的响应。
这可以吗?或者客户端在获得文本响应之前是否必须等待整个php脚本执行服务器端?
继承我的代码:
$dbc = mysql_connect("$db_host","$db_username","$db_pass");
if (!$dbc) { die('SERVER ERROR PLEASE CONTACT US FOR MORE INFORMATION!'); }
mysql_select_db("$db_name", $dbc);
$sql = "SELECT * FROM `ads` WHERE (`status` LIKE 'active%' OR `status` LIKE 'featured%') ORDER BY `clicks` DESC LIMIT 10;";
$result = mysql_query($sql,$dbc);
$totalads=mysql_num_rows($result);
$str="";
while ($row = mysql_fetch_assoc($result))
{
$str .= $row["banner"] . "][". $row["link"] . "<BR>";
//the code below is used to update stats but can be run after output to client
$views=$row["views"]; $targetviews=$row["targetviews"];
if (intval($views)+1 >= intval($targetviews))
{
$sql1 = "UPDATE `ads` SET `views` = `views` + 1 , `status` = 'expired' WHERE `ID`=".$row["id"].";";
}
else
{
$sql1 = "UPDATE `ads` SET `views` = `views` + 1 WHERE `ID`=".$row["id"].";";
}
$result2 = mysql_query($sql1,$dbc);
mysql_free_result($result2);
}
$str=rtrim($str,"<BR>");
mysql_free_result($result);
mysql_close($dbc);
die ($str);
答案 0 :(得分:0)
我猜你正在创建一个网站。因此,您可以在AJAX调用中运行其他10个查询,在加载页面时启动。
您的架构将是:
long_query.php
脚本的javascript来获取其他查询的结果。您需要为此编写一些javascript,它将run an AJAX call,获取数据并修改当前的HTML页面以添加返回的数据。如果您已在项目中使用jQuery,则可以使用jQuery.ajax()
function。
答案 1 :(得分:0)
您可以作为示例运行第一个查询。 然后将数据返回给客户端。 从客户端运行2°和ajax调用,将调用带有第二个脚本等的php页面....
也许2°和ajax可以调用一个php页面来启动其他9个查询,然后最终得到最后的回复。
答案 2 :(得分:0)
生成输出字符串 冲洗它 并减少代码 http://www.php.net/manual/en/function.flush.php
答案 3 :(得分:0)
使用ob_start()可以完全实现你想要的东西;看看这里...... http://www.php.net/ob_start,这会给你一个想法。我不知道你的代码是什么样的,但作为一个例子,你可以做这样的事情......
<?php
ob_start();
$query = "SELECT * FROM users";
$results = DB::get()->query($sql);
echo "<pre>";
print_r($results);
echo "</pre>";
$content = ob_get_content();
@ob_end_clean();
echo $contents;
//continue processing
显然你需要为你的特定脚本量身定做,但这是一个让你到达你需要去的地方的想法
~~~~~~~~~ EDIT ~~~~~~~~~~~~~
好的,所以你可以在这里使用你的代码和评论。 首先,是的,你可以使用结果进行多次while循环,尽管你不应该这样做是错误的编码实践。 这就是我要做的......
ob_start();
$level = ob_get_level();
$dbc = mysql_connect("$db_host","$db_username","$db_pass");
if (!$dbc) {
die('SERVER ERROR PLEASE CONTACT US FOR MORE INFORMATION!');
}
mysql_select_db("$db_name", $dbc);
$sql = "SELECT * FROM `ads`
WHERE (`status` LIKE 'active%' OR `status` LIKE 'featured%')
ORDER BY `clicks` DESC LIMIT 10;";
$result = mysql_query($sql,$dbc);
$totalads=mysql_num_rows($result);
$str="";
while ($row = mysql_fetch_assoc($result)) {
$str .= $row["banner"] . "][". $row["link"] . "<br />";
$views[] = $row['views'];
$target_views[] = $row['targetviews'];
$ids[] = $row['id'];
}
echo $str;
$content = ob_get_contents();
if(ob_get_level() > $level + 1) {
ob_end_flush();
}
echo $content;
@ob_end_clean();
for($i = 0, $len = count($views); $i < $len; $i++) {
if((intval($views[$i] + 1) >= intval($target_views[$i]) {
$sql = "UPDATE `ads`
SET `views` = `views` + 1 ,
`status` = 'expired'
WHERE `ID`=".$ids[$i].";";
} else {
$sql = "UPDATE `ads`
SET `views` = `views` + 1
WHERE `ID`=".$ids[$i].";";
}
$result = mysql_query($sql);
mysql_free_result($result);
}
//I don't know what this stuff here is for except for the close line, but it's her if you want it
$str=rtrim($str,"<BR>");
mysql_free_result($result);
mysql_close($dbc);
die ($str);
&GT;
你不再需要那里的骰子陈述,但我离开了它,因为你想要别的东西。这应该做你需要的,检查我的东西打字错误虽然我只是有点快推出它你。请不要忘记为正确答案标记该小复选框是否有效,或者引导您找到解决方案。谢谢你