我在这里看了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,还有其他更简单的例子——这一个似乎很难理解。
如果你觉得这是一个真正的教程,那么你可以做一些事情来帮助自己解决这个问题。你没有任何明显的编码错误,所以我能做的就是给你建议:
- 确保WAMP仍在运行(我知道这是愚蠢的一步,但偶尔会发生在我们中的很多人身上(
- 将PHP中的"sleep"替换为
if (parseInt(transport.responseText)) setTimeout(connectToServer, Math.rand() * 4000 + 1000);
(将延迟放置在客户端而不是服务器端(。sleep
实际上只能在极少数情况下使用 - 在
transport.responseText
上调用console.log
(如果您没有使用像Firebug这样的web开发工具,请发出警报(如果没有……为什么不呢?((。如果服务器返回0,则不会再次激发connectToServer方法。因此,了解这个价值可能是有用的 - 跟踪Ajax请求。你可以免费使用Firebug
- 查看CdCount.txt,看看它是否正在更新