2013-01-02 60 views
0

问题:输出加载消息

之前我执行一个很长的计算过程,我想以输出加载消息给用户。

代码:

<html>   
<!doctype html> 
      <head> 
       <title>Loading</title> 
      </head> 

    <?php 

    function longProcess() 
    { 
     //where long process takes a long time to compute 
    } 

    ?> 
      <body> 
       <?php 
         echo <div id = 'loading'> LOADING </div> 
         echo '</body>'; 
         echo '</html>'; 
         flush(); 
         longProcess(); 

       ?> 

更多详情:

基本上,我之前所说的longProcess功能,我想输出负载给用户。我使用flush,所以我可以输出HTML的结束标记,然后调用longProcess函数。问题在于它没有被输出,服务器正在计算这个漫长的过程。

+0

为什么不使用ajax? –

+0

你能给我一些更多的细节吗? – Goaler444

回答

4

你需要的可能是类似彗星的功能。尝试以下操作使其工作。

<?php 
// Disable buffering 
@apache_setenv('no-gzip', 1); 
@ini_set('zlib.output_compression', 0); 
@ini_set('output_buffering', 'Off'); 
@ini_set('implicit_flush', 1); 
// Flush buffers 
ob_implicit_flush(1); 
for ($i = 0, $level = ob_get_level(); $i < $level; $i++) ob_end_flush(); 
?><!DOCTYPE html> 
<html> 
<head> 
    <title>Loading</title> 
</head> 
<body> 
    <div id="loading">LOADING</div> 
<?php 
// We need to send enough junk messages to make it works for all browsers 
echo str_repeat(" ", 1024), "\n"; 

ob_start(); 
// Long process starts here 
// For this example, just sleep for 5 seconds 
sleep(5); 
echo "Loaded"; 
// Flush output like this 
ob_flush(); 
flush(); 
?> 
</body> 
</html> 

参考文献:

+0

谢谢:)它的工作原理。你可以向我解释在@符号的前几行中你正在做什么。还有什么是ob_命令? – Goaler444

+1

at符号被称为错误控制操作符。当在PHP中添加表达式时,可能会忽略可能由该表达式生成的任何错误消息。 Apache和PHP缓冲区默认输出。第一行是关闭缓冲区。 'ob_'函数是输出控制函数。在这里看到细节:http://php.net/manual/en/ref.outcontrol.php –

0

PHP是服务器端。您无法输出加载消息。

您可以尝试将自动重定向到目标页面的页面(在此页面中放置您的“加载”消息)。现在你看到加载页面,直到你的目标页面加载

0

,你可以使用PHP可能输出的JavaScript。您将执行以下操作:

  • longProcess()之前,输出JavaScript设置内<body>一个#contents DIV是一个加载动画
  • 运行longProcess()
  • 输出的JavaScript内<body>设置#contents DIV输出不管你想要,无论是数据,“完成”或其他。

只是一个快速的想法,几乎肯定不是最好的,但它会工作。


另一种方法是重新直接使用PHP来完成的页面,一旦装载过程未曾使用header完成。

header('Location: http://www.example.com/');

最后,萧的禁用缓存是你应该看一看的东西!

0

而不是在同一页计算,

  1. 负载,负载符号
  2. 页面启动负载Ajax调用你的PHP文件并执行所有的计算
  3. 关于Ajax响应调用让你的输出替换你的加载分区。