我正在玩推送通知,并且想要在数据库发生变化时更新页面。

我从http://www.screenr.com/SNH获得了这个:

<?php
$filename = dirname(__FILE__).'/data.php';

$lastmodif = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;
$currentmodif = filemtime($filename);

while ($currentmodif <= $lastmodif) {
  usleep(10000);
  clearstatcache();
  $currentmodif = filemtime($filename);
}

$response = array();
$response['msg'] = file_get_contents($filename);
$response['timestamp'] = $currentmodif;
echo json_encode($response);
?>

我的data.php是一个从JSON文件获取数据的脚本:

<script>function itnews_overview() {
    $.getJSON('/ajax.php?type=itnews_overview', function(data) {
        $.each(data.data, function(option, type) {
            $('.bjqs').append('<li><span class="date">'+ type.submitted +'<br />'+     type.time +'</span><h2>' + type.title + '</h2><p>' + type.content + '</p></li>');
        });

    });

}
</script>

<script>
  itnews_overview();
</script>
<div id="news">
  <ul class="bjqs"></ul>
</div>

更新:index.php中的代码:

<script type="text/javascript">

  var timestamp = null;

  function waitForMsg() {
$.ajax({
  type: "GET",
  url: "getData.php?timestamp=" + timestamp,
  async: true,
  cache: false,

  success: function(data) {
    var json = eval('(' + data + ')');
    if(json['msg'] != "") {
      $(".news").html(json['msg']);

    }


    timestamp = json['timestamp'];
    setTimeout('waitForMsg()',1000);        
  },

  error: function(XMLHttpRequest, textStatus, errorThrown){
    setTimeout('waitForMsg()',15000);
  }

});
  }

  $(document).ready(function(){
  waitForMsg();
});

</script>

因为当我向数据库添加内容时不保存此文件,filemtime将无法工作 - 是否有另一种方法可以检查是否已将新行添加到表中?

更新:尝试用SSE解决这个问题。 我有两个文件,index.php和send_sse.php(灵感来自http://www.developerdrive.com/2012/03/pushing-updates-to-the-web-page-with-html5-server-sent-events /

index.php文件:

<div id="serverData">Content</div>
<script type="text/javascript">
//check for browser support
if(typeof(EventSource)!=="undefined") {
    //create an object, passing it the name and location of the server side script
    var eSource = new EventSource("send_sse.php");
    //detect message receipt
    eSource.onmessage = function(event) {
        //write the received data to the page
        document.getElementById("serverData").innerHTML = event.data;
    };
}
else {
    document.getElementById("serverData").innerHTML="Whoops! Your browser doesn't receive server-sent events.";
}
</script>

send_sse.php:

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

$url = "content.json";
$str = file_get_contents($url);
$data = json_decode($str, TRUE);
//generate random number for demonstration
//echo the new number
echo "data: " . json_encode($data);


ob_flush();
?>

但是,这似乎不起作用,这可能是因为SSE需要纯文本数据。 我只是无法弄清楚如何做到这一点,然后将这些内容包装在几个HTML标签中。

更新:好的,现在它已经与SSE合作,感谢VDP。 我有以下内容:

$sql= "SELECT title, content, submitted FROM `flex_itnews` where valid = 1 order by submitted desc";
$query= mysql_query($sql);
setlocale(LC_ALL, 'da_DK');
while($result = mysql_fetch_array($query)){
    echo "data: <li><span class='date'>". strftime('%e. %B', strtotime($result['submitted'])) ."<br />kl. ". strftime('%H.%M', strtotime($result['submitted'])) ."</span><h2>" . $result['title']. "</h2><p>" . $result['content'] ."</p></li>\n";
}

但是,当我添加任何新内容时,它只会回显data: data: data 如果我刷新页面,它会正确显示。

更新:使用livequery插件:

    <script>
      var source = new EventSource('data2.php');
      source.onmessage = function (event) {
        $('.bjqs').html(event.data);
      };

      $('#news').livequery(function(){
        $(this).bjqs({
          'animation' : 'slide',
          'showMarkers' : false,
          'showControls' : false,
          'rotationSpeed': 100,
          'width' : 1800,
          'height' : 160
        });
      });

  </script>

更新:尝试使用委托()

    <script>
      $("body").delegate(".news", "click", function(){
        $("#news").bjqs({
          'animation' : 'slide',
          'showMarkers' : false,
          'showControls' : false,
          'rotationSpeed': 100,
          'width' : 1800,
          'height' : 160
        });
                var source = new EventSource('data2.php');
      source.onmessage = function (event) {
        $('.bjqs').append(event.data);
      };
      });
  </script>

#1楼 票数:2 已采纳

是! 有多种(更好的)方式:

  1. websocket(最佳解决方案,但旧版或移动浏览器不支持)
  2. 服务器发送事件(SSE)(一种轮询,但仅针对您要求的任务进行了优化)
  3. 长轮询(就像你在做)
  4. 闪存套接字
  5. 其他基于插件的插件
  6. 阿贾克斯民意调查

我之前发布了另一个关于它的例子

我列出了几种运输方法。 websockets是理想的(因为它是服务器和客户端之间唯一的双向通信),SSE是我的第二选择。 您不需要$.getJSON方法。 整体想法是一样的。

在服务器端(在您的情况下为php),您在数据库中查询更改。 您将数据作为JSON返回( json_encode(data)可以执行此操作)。 在客户端,您解码JSON( JSON.parse(data)可以做到这一点)。 根据您收到的数据,您可以更新您的页面。

只是像你这样的轮询会导致更多的开销,因为你对服务器做了很多请求。

SSE更“我想订阅一个流”和“我想停止收听”。 =>开销减少

Websockets更多:“我建立了一个连接。我说服务器监听。服务器会话客户端监听”全双工连接。 =>最小开销

SSE代码示例

客户端访问的页面(例如index.html或index.php)

它只是一个包含这个javascript的普通html页面:

<html>
<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
    <script>
        //javascript:
        var source = new EventSource('data.php');
        source.onmessage = function (event) {
            //here you do the stuff with the received messages.
            //like log it to the console
            console.log(event.data);
            //or append it to div
            $('#response').append(event.data);
        };
    </script>
</head>
<body>
    <div id="response"></div>
</body>
</html>

'data.php'页面:

<?php
/* set the header first, don't echo/print anything before this header is set! Else the default headers will be set first then this line tries to set the headers and results in an error because the header is already set. */
header("Content-Type: text/event-stream\n\n");

//query the database
$sql= "SELECT COUNT(*) FROM `messages`";
$query= mysql_query($sql);
$result = mysql_fetch_array($query);
$count = $result[0];

//return the data
echo "data: " . $count. "\n";
?>

所以你只需要那2页。

更新:

我只看到你的评论而不是更新..对不起;)

如果你使用.delegate()你不应该使用body但是尽可能在树上尽量选择一个选择器(在你的情况下为.bjqs )。

在你的情况下,你甚至不需要现场,代表,或其他所有! 只需在内容更新后再次应用bjqs。

  var source = new EventSource('data2.php');
  source.onmessage = function (event) {
    $('.bjqs').html(event.data);
    $("#news").bjqs({
      'animation' : 'slide',
      'showMarkers' : false,
      'showControls' : false,
      'rotationSpeed': 100,
      'width' : 1800,
      'height' : 160
    });
  };

这也会给你带来问题,因为你经常重新初始化bjqs并且它不是为了处理动态更新内容而编写的。 如果有新数据,你可以做的只发送数据(用php)。 检查调用是否为空,如果不更新:

  var source = new EventSource('data2.php');
  source.onmessage = function (event) {
    if(event.data !=""){
        $('.bjqs').html(event.data);
        $("#news").bjqs({
          'animation' : 'slide',
          'showMarkers' : false,
          'showControls' : false,
          'rotationSpeed': 100,
          'width' : 1800,
          'height' : 160
        });
    }
  };

#2楼 票数:0

您可以计算表中的行数,然后检查行数是否更改。

#3楼 票数:0

在没有深入研究你的代码的情况下我回答标题中的问题:

将最后修改的列添加到您的表中,这有一个内置的mysql触发器,无论何时添加或更改行都会更新:

ALTER TABLE `yourTable`
    ADD COLUMN `last_modified` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    ADD INDEX (`last_modified`);

然后查询它,

SELECT * FROM yourTable where last_modified > ?

(“?”是您用上次查询的时间戳替换的pdo占位符)

  ask by pshoeg translate from so

未解决问题?本站智能推荐:

1回复

从MySQL数据库获取记录时php显示空

我正在尝试使用php类使用GCM将数据发送到app(phonegap)。 此处,数据存储到数据库,并使用Php-GCM类发送。 问题是发送所有列时都显示空值。 ,it is showing null value for all the items. 当我尝试显示 ,它显示所有项目的空值。
1回复

如何在MySQL插入新行时自动发送android推送通知?

目前我有2个Android应用程序共享相同的MySQL数据库。 第一个应用程序将数据发布到数据库。 第二个应用程序将显示数据库数据。 如何在第一个应用程序将数据发布到数据库后立即向第二个应用程序发送推送通知? 知道如何用GCM解决这个问题吗?
1回复

Mysql数据库更改状态时使用Push.js推送通知

目前,我有一个带有客户端和管理员端的PHP系统订单,一个客户端下订单,然后管理员根据订单的进度更改状态。 信息订单存储在MySQL数据库表中。 例如,这是我存储用户帐户,信息顺序和状态顺序的表: 当客户下订单并以“待处理”状态注册时,在管理页面中我们会检查该订单并通过AJAX单击按钮将
2回复

Android推送通知GCMphp和MySQL[关闭]

嗨,我是新来的php和我的sql。 Im正在开发android推送通知应用程序,随后是本教程 。 我已经创建了gcm数据库和表。 当我从test.php插入数据时,从register.php得到以下错误,但是输入的数据正确存储在数据库中。 在config.php中,我从Google项
1回复

当Web服务器的mysql数据库发生更改时,我想发送推送通知。可能吗?

我想创建一个系统,例如当在线Web服务器的MySQL数据库发生更改时,将推送通知发送到已注册的设备ID。
1回复

在数据库MySql中的所有令牌上发送推送通知

我已经为我的应用程序创建了一个推送通知,它可以完美运行,但不能在所有设备令牌上发送通知。 首先,我有一个数据库名称“ member”,它包含ID,用户名,密码,令牌 然后我创建此php函数以发送通知 该代码仅发送到一台设备,当我尝试在浏览器中访问它时,它会显示 eY0-0uIU
1回复

Lookig在HTML5/jquerymobile/PHP/MySQL应用程序中集成用户之间的推送通知

我有一个现有的 PHP/MySQL 应用程序,它是用 jquery 移动框架编码的,所以 ti 看起来像一个应用程序,虽然它像一个普通的网页一样运行。 我想添加功能,允许用户邀请(发送推送通知)其他用户加入他们的网球比赛。 当用户收到这样的邀请时,他会用 YES/NO 响应,并且响应应该插入到 My
4回复

适用于PHP/MySQL的AppEngine替代方案

有没有人知道允许我们在类似于Google App Engine的云平台上部署PHP / MySQL应用程序的公司? 我们希望该平台既方便用户使用,也可以自动调节,无需干预。 我不想SSH到每个服务器以更新服务器。 我们需要一个自动缩放,自动分片和自动复制的MySQL数据库。