Ajax长轮询问题



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

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

$num=$_GET['num']
这是因为有一个ajax get函数没有num参数,导致没有设置$_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等。

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

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

我也不同意他以这种方式使用file(他应该使用file_get_contents(,并且他告诉你从一开始就使用一个文件——它应该是$_SESSION,或者更好的是,数据库连接。教程还应尽一切必要避免使用关键字global(如果教程无法做到这一点,那么作者可能应该阅读教程,而不是编写教程(。他还认为使用无效CSS的ID是个好主意(在CSS中,ID中不能有空格。这在JS中是可以接受的,但如果它使CSS不可能,你为什么要这样做呢(。最后,他谈到了Ajax.Updater的所有好处,但他决定使用一个奇怪的递归方案来代替Ajax.PeriodicalUpdater。这就是它的用途。

我的建议是放弃那个教程,改一个更好的教程。就我个人而言,我发现学习"老方法"(没有框架AJAX(很有价值,我不得不推荐这一种。如果你想使用一个框架,我个人认为你最好使用jQuery教程(比如这个(,因为它更常见。如果你真的喜欢Prototype,还有其他更简单的例子——这一个似乎很难理解。

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

  1. 确保WAMP仍在运行(我知道这是愚蠢的一步,但偶尔会发生在我们中的很多人身上(
  2. 将PHP中的"sleep"替换为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,看看它是否正在更新

相关内容

  • 没有找到相关文章

最新更新