Php Ajax长轮询问题

Php Ajax长轮询问题,php,javascript,ajax,long-integer,polling,Php,Javascript,Ajax,Long Integer,Polling,我查看了ajax长轮询的简要介绍,并尝试在我自己的pc上使用wamp模拟它,但是我遇到了几个问题 我在longpolling.php文件的第29行中不断遇到一个关于未定义索引的错误 $num = $_GET['num']; html文件实际上不值得发布。它只包括ajaxjavascript文件、原型js文件和相关div等 为了解决这个问题,我绞尽脑汁想了好几个小时,但我不知道到底出了什么问题,而且这篇文章来自“教程”类型的文章也不令人鼓舞 坦白地说,你的第一个问题可能是一个教程,这一事实是不可原

我查看了ajax长轮询的简要介绍,并尝试在我自己的pc上使用wamp模拟它,但是我遇到了几个问题

我在longpolling.php文件的第29行中不断遇到一个关于未定义索引的错误 $num = $_GET['num']; html文件实际上不值得发布。它只包括ajaxjavascript文件、原型js文件和相关div等


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

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

我还反对这样一个事实,即他正以这种方式使用
file
(他应该使用
file\u get\u contents
),并且他告诉您首先使用一个文件——它应该是
$\u SESSION
,或者更好的是,一个数据库连接。教程还应尽一切必要避免使用关键字
global
(如果教程无法做到这一点,那么作者可能应该阅读教程而不是编写它们)。他还认为使用无效CSS的ID是一个好主意(在CSS中,ID中不能有空格。这在JS中是可以接受的,但如果它使CSS不可能,为什么要这样做)。最后,他谈到了Ajax.Updater的所有优点,但他决定使用bizarro递归方案来代替

我的建议是放弃那个教程,改一个更好的。就个人而言,我觉得学习“旧方法”(无框架AJAX)很有价值,我不得不推荐。如果您想使用框架,我个人认为最好使用jQuery教程(如),因为它更常见。如果你真的喜欢原型,还有其他更简单的例子——看起来很简单

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

  • 确保WAMP仍在运行(我知道这是愚蠢的一步,但我们中的很多人偶尔也会这样)
  • if(parseInt(transport.responseText))setTimeout(connectToServer,Math.rand()*4000+1000)替换PHP中的“sleep”(将延迟放置在客户端而不是服务器端)<代码>睡眠
    实际上只能在非常罕见的情况下使用
  • transport.responseText
    上调用
    console.log
    (如果您没有使用Firebug之类的web开发工具,请发出警报(如果没有,为什么不?)。如果服务器返回0,则不会再次激发connectToServer方法。因此,了解该值可能是有用的
  • 跟踪Ajax请求。你可以用Firebug免费完成这项工作
  • 查看CdCount.txt,看看它是否在更新

  • 请在您的问题中添加代码/js/html内联的相关部分。好的,我已经将它们内联了,但是,我不知道问题所在,所以无法判断哪些部分是相关的。我希望我没有添加太多。我不小心按了回车键。非常感谢您的回复!在我将基本ajax应用到我自己的项目之前,我最初阅读教程只是为了测试基本ajax在我的服务器设置中是否适用。原本应该是一个简单的30分钟的锻炼变成了一整天的谷歌搜索和摆弄。对于你在这方面的建议,我感激不尽。我确实对firebug/web软件开发有一些进一步的问题,因为我对这方面完全陌生,但没有留下评论的空间,我不知道是否能得到回复,因为这是一个评论。@Michael,你应该问一个关于他们的问题 if(isset($_GET['num'])) $num = $_GET['num']; else $num = "";
    <?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);
    }
    ?>
    
    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() }
        });
    }