Не удается запустить другой Ajax во время длительного опроса? - PullRequest
1 голос
/ 31 июля 2011

Я пытаюсь создать простое приложение для чата в Интернете, используя длинный опрос и php.

В основном у меня есть 2 функции ajax на клиенте,
1. update: обновить сообщения чата.
2. отправить: чтобы отправить сообщение, которое вводит пользователь.
Функция обновления выполняет длинный опрос, который заключается в ожидании в течение 10 секунд или до появления нового сообщения. Функция отправки пишет в базу данных.

Моя проблема заключается в том, что во время работы функции обновления (длинный опрос) функция отправки не может быть запущена. И только после завершения работы функции обновления запускается функция отправки. Это ожидаемое поведение или что-то не так с моим кодом?

Если вы хотите посмотреть сеть, вы можете получить к ней доступ здесь: 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;
?>

send.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);
?>

1 Ответ

2 голосов
/ 31 июля 2011

Если вы используете обработчик сеанса по умолчанию, тогда сеанс может быть открыт только один сценарий за раз, так как в файл сеанса одновременно может записываться только одна вещь, в противном случае может произойти повреждение.

Вполне возможно, что вы можете обойти эту проблему, вызвав session_write_close как можно скорее в ваших скриптах.В случае сценариев, которые только читают данные сеанса, вы должны вызывать их сразу после session_start.В случае сценариев, которые вносят изменения в сеанс, вам придется вызывать его сразу после последнего изменения в сеансе, который вы сделали.

Хотя использование session_write_close означает, что любые последующие изменения, внесенные вами в $ _SESSION, не будут сохранены, массив $ _SESSION по-прежнему будет доступен и будет содержать значения, которые были загружены в последний раз из сеанса.

http://www.php.net/session_write_close имеет соответствующую информацию.

...