【问题标题】:Ajax long polling problemAjax 长轮询问题
【发布时间】:2011-08-14 05:18:48
【问题描述】:

我查看了对 ajax 长轮询 here 的简要介绍,并尝试在我自己的电脑上使用 wamp 模拟它,但是我遇到了一些问题。

我一直在 longpolling.php 文件第 29 行收到关于未定义索引的错误

$num = $_GET['num'];
这是因为有一个没有 num 参数的 ajax get 函数导致 $_GET 没有被设置。 我将代码更改为
if(isset($_GET['num']))
    $num = $_GET['num'];
别的
    $num = "";

而且效果很好。但是,一旦我重新加载页面,cd 计数会减少一次然后停止。

有人知道发生这种情况的原因吗? php 文件(服务器)

<?php

$cd_stock = ("CdCount.txt");

function updateStock($num)
{
    global $cd_stock;
    $count = file($cd_stock);
    $count = (int)$count[0];
    $count = $count - $num;
    if ($count < 0) $count = 0;
    $fp = fopen($cd_stock , "w");
    fputs($fp , "$count");
    fclose($fp);

    echo $count;
}

function getCdCount()
{
    srand();
    $newOrder  = rand(1, 3);
    $sleeptime = rand(2, 10);
    sleep(2);

    updateStock($newOrder);
}
if(isset($_GET['num']))
    $num = $_GET['num'];
else
    $num = "";
if ( $num = "")
{
    getCdCount();
}
else
{
    updateStock((int)$num);
}
?>

javascript 文件(客户端)(使用原型框架)

Event.observe(window, 'load', function() {

    Event.observe( 'btnSubmit', 'click', purchaseCD);

    connectToServer();
});

function connectToServer()
{
    new Ajax.Updater(  
        { success: 'CD Count', failure: 'errors' },
        'LongPolling.php', 
        {
            method:     'get',
            onSuccess:  function(transport)
            {
                if (parseInt(transport.responseText)) connectToServer();
            }
    });
}

function purchaseCD()
{
    new Ajax.Updater(
        { success: 'CD Count', failure: 'errors' },
        'LongPolling.php', 
        {
            method:     'get',
            parameters: { num: $('txtQty').getValue() }
    });
} 

html 文件真的不值得张贴。它只包括 ajax javascript 文件和原型 js 文件以及相关的 div 等。

我已经绞尽脑汁想解决这个问题好几个小时了,但我不知道出了什么问题,而且这来自“教程”类型的文章并不令人鼓舞。

【问题讨论】:

  • 请在您的问题中添加代码/js/html 内联的相关部分。
  • 好的,我已将它们内联,但是,我不知道问题所在,因此无法判断哪些部分相关或不相关。我希望我没有添加太多。

标签: php javascript ajax long-integer polling


【解决方案1】:

您的第一个问题可能存在的事实是教程,坦率地说,是不可原谅的。所有教程都应该假设您有最大的错误报告(如果所有教程都告诉您如何确保它发生,那就太好了)。对你来说是个好消息吗?默认情况下,WAMP 将错误报告设置得相当高,因此不必担心。

我也对他以这种方式使用file(他应该使用file_get_contents)并且他告诉你使用一个文件开头——它应该是$_SESSION或,甚至更好的是数据库连接。教程还应尽一切必要避免使用关键字global(如果教程无法做到这一点,那么也许作者应该通过教程而不是编写它们)。他还认为使用无效 CSS 的 ID 对您来说是个好主意(在 CSS 中您的 ID 中不能有空格。这在 JS 中是可以接受的,但如果它使 CSS 不可能,您为什么要这样做)。最后,他谈到了 Ajax.Updater 的所有好处,但他决定使用 bizarro 递归方案而不是 Ajax.PeriodicalUpdaterThat's what it's there for.

我的建议是放弃该教程并制作更好的教程。就个人而言,我发现学习“旧方法”(无框架 AJAX)的价值,我不得不推荐this one。如果您想使用框架,我个人认为您最好使用 jQuery 教程(如this one),因为它更常见。如果你真的很喜欢 Prototype,还有其他更简单的例子——this one 似乎非常困难。

如果您觉得这是最重要的一个真正的教程,那么您可以做一些事情来帮助自己解决这个问题。你没有任何明显的编码错误,所以我能做的就是给你建议:

  1. 确保 WAMP 仍在运行(我知道这是一个愚蠢的步骤,但我们中的很多人偶尔会遇到这种情况)。
  2. 将 PHP 中的“睡眠”替换为 if (parseInt(transport.responseText)) setTimeout(connectToServer, Math.rand() * 4000 + 1000);(将延迟放置在客户端而不是服务器端)。 sleep 实际上应该只在非常罕见的情况下使用。
  3. transport.responseText 上致电console.log(或者,如果您没有使用像Firebug 这样的Web 开发工具(如果没有...为什么不呢?),请发出警报)。如果服务器返回 0,它将不会再次触发 connectToServer 方法。因此,知道该值是什么可能会很有用。
  4. 跟踪 Ajax 请求。您可以免费使用 Firebug 做到这一点。
  5. 查看 CdCount.txt,看看它是否正在更新。

【讨论】:

  • 我不小心按了回车键。非常感谢您的回复!在我将它应用到我自己的项目之前,我最初查看教程只是为了测试基本 ajax 在我的服务器设置中是否对我有用。本来应该是一个简单的 30 分钟练习变成了一整天的谷歌搜索和乱七八糟的东西。我非常感谢您对此的建议。我确实对 Firebug/Web 软件开发有一些进一步的问题,因为我对此完全陌生,但没有空间留给 cmets,我不知道我是否会得到回复,因为这是评论。
  • @Michael 你应该问一个关于他们的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 2013-11-17
  • 2011-04-20
  • 1970-01-01
  • 2012-08-16
  • 2012-05-17
相关资源
最近更新 更多