Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 长轮询时无法运行其他ajax?_Php_Ajax_Apache_Long Polling - Fatal编程技术网

Php 长轮询时无法运行其他ajax?

Php 长轮询时无法运行其他ajax?,php,ajax,apache,long-polling,Php,Ajax,Apache,Long Polling,我正在尝试使用长轮询和php在web上制作一个简单的聊天应用程序。 我在客户端上主要有两个ajax函数, 1.更新:更新聊天信息。 2.发送:发送用户输入的消息。 更新功能进行长时间轮询,即等待10秒或直到新消息可用。 send函数写入数据库 我的问题是,当更新函数正在运行(长轮询)时,发送函数无法运行。只有在更新函数完成运行后,发送函数才会运行。这是预期的行为还是我的代码有问题 如果您想查看网站,可以在此处访问: 如果你懒得注册,你可以使用用户名dummy0和密码123456 这是代码。如果我

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

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

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

如果您想查看网站,可以在此处访问:
如果你懒得注册,你可以使用用户名dummy0和密码123456

这是代码。如果我的代码很乱,很抱歉。

ajax代码:
更新_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;
?>

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

您可以通过在脚本中尽快调用session_write_close来绕过此问题。对于只读取会话数据的脚本,您应该能够在会话启动后直接调用它。对于更改会话的脚本,您必须在上次更改会话后立即调用它

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


有相关信息。

所有浏览器都是这样吗?最好使用所有浏览器,但不是必需的。我这样做是为了学习哦我想我误解了你的问题。。我在Chrome和Firefox上试用过,结果也一样。不确定其他浏览器。我很抱歉我没有太多想法abt phpFYI你应该看看这个应用程序的web套接字。。使用ajax和长轮询会更好。这是HTML5规范
<?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);
?>