【问题标题】:Cannot run another ajax while long polling?长轮询时无法运行另一个 ajax?
【发布时间】:2011-10-16 19:17:57
【问题描述】:

我正在尝试使用长轮询和 php 在网络上制作一个简单的聊天应用程序。

主要是我在客户端有 2 个 ajax 函数,
1. update : 更新聊天消息。
2. send : 发送用户输入的信息。
更新函数进行长轮询,即等待 10 秒或直到有新消息可用。 send 函数写入数据库。

我的问题是,当更新功能正在运行(长轮询)时,发送功能无法运行。并且只有在更新函数完成运行后,发送函数才会运行。这是预期的行为还是我的代码有问题?

如果您想查看网页,可以在这里访问:http://tedhost.awardspace.us
如果你懒得注册,你可以使用用户名 dummy0 和密码 123456

这是代码..对不起,如果我的代码乱七八糟..

ajax 代码:http://tedhost.awardspace.us/ajax.js
update_chat.php

<?php
session_start();
$filename = "wew.xt";
$user = $_SESSION["user"];
$last = $_SESSION["lmsgtime"];

if (file_exists($filename)) {
    $lama = 0;
    $mulai = time();
    do {
        $fin = fopen($filename, "r");
        $current = 0;
        fscanf($fin, "%d", $current);
        fclose($fin);
        usleep(10000);
        $akhir = time();
    } while($current <= $last && $akhir - $mulai <= 10);
}
include "con.php";
mysql_select_db($dbname, $con);
$sql = "SELECT * FROM chats WHERE time > '$last' ORDER BY time ASC";
$res = mysql_query($sql);
/*
$lama = 0;
while (mysql_num_rows($res) <= 0 && $lama <= 10000000) {
    $res = mysql_query($sql);
    usleep(500);
    $lama += 500;
}
*/
if (!$res)
    die("error");
$out = "";
while($row = mysql_fetch_array($res)) {
    $out = $out . "<div id=";
    if ($row["user"] == $user)
        $out = $out . "\"chatme\"";
    else if ($row["user"] == "sys")
        $out = $out . "\"chatsystem\"";
    else
        $out = $out . "\"chatother\"";
    $out = $out . ">";
    $out = $out . date("(h:i:s) ", $row["time"]);
    $out = $out . $row["user"];
    $out = $out . ": " . stripslashes($row["data"]);
    $out = $out . "</div>";
    $last = $row["time"];
}
$_SESSION["lmsgtime"] = $last;
echo $out;
?>

发送.php

<?php
$time = time();
session_start();
include "con.php";
$data = mysql_real_escape_string($_GET["msg"]);
$user = mysql_real_escape_string($_SESSION["user"]);
mysql_select_db($dbname, $con);
$sql = "INSERT INTO chats VALUES ('$time', '$user', '$data')";
$res = mysql_query($sql);
if (!$res)
    die("err");
else
    echo "ok";
$lho = fopen("wew.xt", "w");
fprintf($lho, "%d\n", $time);
fclose($lho);
?>

【问题讨论】:

  • 所有浏览器都这样吗?
  • 在所有浏览器上工作是首选,但不是必需的。我这样做是为了学习..
  • 哦,我想我误解了你的问题。我已经在 Chrome 和 Firefox 上尝试过,它给出了相同的结果。不确定其他浏览器..
  • 对不起,我没有太多想法 abt php
  • 仅供参考,您应该查看此应用程序的 Web 套接字。使用 ajax 和长轮询会更好。它是一个 HTML5 规范

标签: php ajax apache long-polling


【解决方案1】:

如果您使用默认会话处理程序,则一次只能打开一个脚本,因为一次只能写入一个会话文件,否则可能会发生损坏。

您可以通过在脚本中尽快调用 session_write_close 来解决此问题。对于只读取会话数据的脚本,您应该能够在 session_start 之后直接调用它。对于对会话进行更改的脚本,您必须在对会话进行最后一次更改后立即调用它。

虽然使用 session_write_close 意味着您对 $_SESSION 所做的任何后续更改都不会被保存,但 $_SESSION 数组仍然可以访问并包含上次从会话加载的值。

http://www.php.net/session_write_close有相关信息。

【讨论】:

    猜你喜欢
    • 2013-01-10
    • 2011-09-02
    • 2012-02-24
    • 2011-04-20
    • 2011-02-26
    • 2012-08-16
    • 1970-01-01
    • 2012-05-17
    • 2011-09-19
    相关资源
    最近更新 更多