用php在做一个发布部门公告的模块,
发布人选择发送对象,给他发布一个公告,然后发送对象那边马上弹出一个类似QQ空间消息提醒那样的功能。
开始考虑的是通过js中的setInterval()定时 执行一个ajax去检索数据库,可过一段时间游览器就崩溃了,设置时间为30秒也会崩溃。
我想要实现这个即时的功能,还有什么别的办法吗?请各位前辈们给看看啊..

解决方案 »

  1.   

    没什么好办法,js 的定时功能 我测试过发现会不断的占用浏览器内存,不知道是不是内存泄漏。
    你可以看看一些论坛比如dz的提示功能是怎么写的.
      

  2.   

    再页面的头部写一个iframe,里面放一个php文件,这个文件每隔几秒就去读取一下(文件或者数据库,建议是文件),如果有新消息,在push一下,echo '您有新消息';
    ob_flush();
    flush();
    sleep(30);
     
    或者通过ajax,但是这样效率确实很低
      

  3.   


    实现方法有两种:
    一、服务器长连接(少数服务器支持)
    二、JS定时查询,但请注意一点,数据结果不要用HTML,建议使用XML(首选)、JSON,这样可以防止IE之类的浏览器崩溃。
      

  4.   

    比较山寨的解决办法<iframe src="notice.htm"></iframe>notice.htm
    ----
    <meta http-equiv="refresh" content="间隔时间" />
    <script>
    msg = null;
    <?php
    $msg = get_msg();
    echo 'var msg = "'.$msg.'"';
    ?>
    if (msg ) {
      top.notice(); //这个函数你自己写哈
    }
    </script>
      

  5.   


    非常感谢您的帮助啊,
    不过
    <script>
    msg = null;
    <?php
    $msg = get_msg();
    echo 'var msg = "'.$msg.'"';
    ?>
    if (msg ) {
      top.notice(); //这个函数你自己写哈
    }
    </script>
    这些代码是什么意思啊,我看不太懂,您能简单和我说说吗?谢谢谢谢
      

  6.   

    本帖最后由 xuzuning 于 2012-04-09 09:25:52 编辑
      

  7.   


    index.php<iframe src="reminding.php""></iframe>
    reminding.php<?php session_start();?>
    <html>
    <head>
    <meta http-equiv="refresh" content="2"/>
    <script type="text/javascript" src="reminding.js" language="javascript"></script><引入消息提醒的js文件-->
    <script type="text/javascript">
    $(document).ready(function(){alert('aa');
    tanchureminding();
    })
    </script>

    </head>
    <body>
    <?php//连接数据库
    $db=public_DBConnect(DB_NAME,DB_HOST,DB_PASSWORD,DB_USER);$sql="select *  from oanoticereceiver where  receiverid=".$_SESSION['oa_userid']."";
    $result=$db->query($sql);
    $num=$result->num_rows;
    if($num)
    {
    $i=0;
    while ($rows=$result->fetch_array())
    {
                      echo "<input type=\"hidden\" id=\"hid_saveid\" name=\"hid_saveid[]\" value=\"".$rows['id']."\">";   }
    }?>
    </body>>
    </html>原理明白了,可还有几个问题啊。
    1 引入js文件,和调用js函数,是要在index.php,还是reminding.php里啊
    2 是要直接刷新reminding.php页面就行了吗?像我上面写的那样,js函数都不好用啊,说是缺少对象,这是怎么了啊
      

  8.   

    引入js文件,要在index.php里
    调用js函数,要在reminding.php里假设 tanchureminding 函数在index.php里用于显示信息,reminding.php里调用时用
    parent.document.tanchureminding()
      

  9.   

    老师啊
    其实路径是这样,
    index.php
    reminding/reminding.php
    index.php和reminding是在同一级目录,reminding.php中用“parent.document.tanchureminding()”也还是调用不到js中的函数啊,还是缺少对象啊
      

  10.   

    引用js和调用js函数都放在reminding.php就可以了,这样没问题吧????
      

  11.   

    我写错了,应该是 parent.document.tanchureminding()给个最最简单的测试例子
    main.php<script>
    num = 0;function foo() {
      document.getElementById('view').innerHTML = num++;
    }
    </script>
    <div id=view></div>
    <iframe src=subwin.php style='display:none'></iframe>subwin.php<meta http-equiv="refresh" content="2" />
    <script>
    parent.foo();
    </script>你可在此基础上,实验你的代码
    先静态后动态
      

  12.   

    如您所说。
    我想着在subwin.php 里面进行数据库操作,把查询出来的相应的数据存到隐藏域里,
    <input type=\"hidden\" id=\"hid_remind\" value=\"数据\">
    这个隐藏域是在subwin.php里然后在js函数中判断,如果这个隐藏域值不为空,则弹出消息(div id='view')提醒。可这个js文件是在main.php中导入的,即使在subwin.php中parent.foo();也是找不到这个隐藏域的我该如何在js中判断啊??