将php文本输出发送到客户端浏览器并在服务器端运行rest

时间:2013-12-27 14:25:35

标签: php mysql return echo

我有一个直接的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);

4 个答案:

答案 0 :(得分:0)

我猜你正在创建一个网站。因此,您可以在AJAX调用中运行其他10个查询,在加载页面时启动。

您的架构将是:

  • main.php,运行1个查询并返回包含查询数据的HTML页面;
  • long_query.php,它在后台运行其他查询;
  • page.html显示第一个查询结果,并使用一些称为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;

你不再需要那里的骰子陈述,但我离开了它,因为你想要别的东西。这应该做你需要的,检查我的东西打字错误虽然我只是有点快推出它你。请不要忘记为正确答案标记该小复选框是否有效,或者引导您找到解决方案。谢谢你