2013-07-22 5 views
1

Я сделал чат для друзей, который использует текстовые файлы для хранения данных, и все это работает более или менее, за исключением случаев, когда я вхожу в систему и что-то пишу кому-то, ничего не всплывает (но текст сохраняется в соответствующем текстовом файле), тогда, когда я обновляю страницу, это нормально с THEN ON, но в другом браузере в качестве другого пользователя я также должен обновить страницу, чтобы она нормально работала в обоих направлениях.Проблемы с длинными опросами и сеансами (чат)

В принципе, каждый раз, когда я вхожу в систему, мне нужно щелкнуть имя человека, с которым я хочу пообщаться, затем появится окно, а затем я должен обновиться, иначе это будет работать \ sn't.

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

здесь home.php (перенаправляются пользователи здесь, когда они войти на index.php странице)

<?php 
session_start(); 

if (!isset($_SESSION['user'])) { 
    header("Location: index.php"); 
    exit(); 
} 

?> 
<!DOCTYPE html> 
<html lang="en"> 

<head> 
<meta charset="utf-8"> 

<title></title> 
<style type="text/css">@import 'custom_chat.css';</style> 
</head> 

<body> 

<h2>Hello, <?php echo $_SESSION['user']; ?></h2> 
<hr> 
<p><b>CONTACTS:</b></p> 
<?php 
require_once 'dbc.php'; 
$u = $_SESSION['user']; 

$q = "SELECT user_id FROM users WHERE username='$u'"; 
$r = mysqli_query($dbc, $q); 
$row = mysqli_fetch_row($r); 

// current user id 
$uid = $row[0]; 

$q = "SELECT u.username FROM users AS u, friends AS f 
     WHERE (f.f1 = '$uid' OR f.f2 = '$uid') AND (f.f1 = u.user_id OR f.f2 = u.user_id) AND (u.username != '$u')"; 
$r = mysqli_query($dbc, $q); 


while ($row = mysqli_fetch_assoc($r)) { 
    echo '<div class=chat_contacts>'; 
    echo '<div class='.$row['username'].'>'; 
    echo '<div class=inner>'; 
    echo '<div class=inner_chat></div>'; 
    echo '<form> 
       <textarea class=chat_text></textarea> 
      </form>  
      '; 
    echo '</div>'; // end .inner 
    echo '<a href="#" class='. $row['username'] .'>'.$row['username'] .'</a> 
      </div>'; 
    echo '</div>'; // end .chat_contacts 
} 

?> 

<p><a href="index.php">HOME</a></p> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js"></script> 
<script type="text/javascript"> 

var nc = '<?php echo $u ?>'; 

// toggle chat window 
$('.chat_contacts a').click(function() { 
    $(this).prev('div.inner').toggle(); 
    var tc = $(this).attr('class'); 
    $(this).parent().parent().addClass(nc+tc); 
    $('textarea').focus(); // MD maybe 
    return false; 
}); 

// call main chat function 
$(function() { 
    updateChat(); 
}); // end ready 

//update on enter 
$('textarea.chat_text').keypress(function(e) { 
    $this = $(this); // textarea 
    if (e.which == '13') { 
     insertChat(); 



     return false; 
    } 
}); 

function insertChat() { 
    var text = $this.val(); 
    $this.val(''); 
    var ru = $this.parent().parent().parent().attr('class'); 
    $.post('insert.php',{text:text, ru:ru}, function(data) { 
     if (data) { 
      alert(data) 
     } 
    }); 
} 

var timestamp = 0; 
function updateChat() { 
    $.ajax({ 
     type: 'GET', 
     url: 'update.php?timestamp=' + timestamp, 
     async: true, 
     cache: false, 

     success:function(data) { 
      // alert(data); 
      var json = eval('('+data+')'); 
      // if (json['msg'] != null) { 
       $('.chat_contacts.'+nc+json['nru']+' .inner_chat').append('<p>'+json['msg']+'</p>'); // MD 
      // } 
      timestamp = json['timestamp']; 
      setTimeout('updateChat()', 1000); 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown) { 
      // alert('error '+textStatus+'('+errorThrown+')'); 
      setTimeout('updateChat()', 1000); 
     } 
    }); 
} 

</script> 
</body> 
</html> 

update.php

<?php 
session_start(); 
require_once('dbc.php'); 
error_reporting(E_ALL^E_NOTICE); 
set_time_limit(0); 

$ou = $_SESSION['user']; 
$ru = $_SESSION['ru']; 
session_write_close(); 

$q = "SELECT * FROM chats WHERE 
     (chats.f1='$ru' AND chats.f2='$ou') OR (chats.f1='$ou' AND chats.f2='$ru') ORDER BY time DESC LIMIT 1"; 
$r = mysqli_query($dbc, $q); 

// $filename = 'vojaolja.txt'; 
$q = "SELECT user_id FROM users WHERE username='$ou' 
     ORDER BY user_id DESC LIMIT 1"; 
$r = mysqli_query($dbc, $q); 
$row = mysqli_fetch_row($r); 
$fu = $row[0]; 

$q = "SELECT user_id FROM users WHERE username='$ru' ORDER BY user_id DESC LIMIT 1"; 
$r = mysqli_query($dbc, $q); 
$row = mysqli_fetch_row($r); 
$su = $row[0]; 

$q = "SELECT username FROM users WHERE username='$ru' ORDER BY user_id DESC LIMIT 1"; 
$r = mysqli_query($dbc, $q); 
$row = mysqli_fetch_row($r); 
$nru = $row[0]; 

if ($fu < $su) { 
    $filename = $fu.$su.'.txt'; 
} else { 
    $filename = $su.$fu.'.txt'; 
} 

$lastmodif = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0; 
$currentmodif = filemtime($filename); 

while ($currentmodif <= $lastmodif) { 
    usleep(10000); 
    clearstatcache(); 
    $currentmodif = filemtime($filename); 
} 

$response = array(); 

$data = file($filename); 
$line = $data[count($data)-1]; 

$response['msg'] = $line; 
$response['nru'] = $nru; 
$response['timestamp'] = $currentmodif; 

echo json_encode($response); 

?> 

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

EDIT:

как только я войти в систему, я вижу следующее в консоли:

http://localhost/x_super_chat/update.php?timestamp=0&_=1374509358392 (plus the rolling thingy, it is waiting) 

Затем я нажимаю на имя друга, всплывает окно, я что-то писать и я получаю это в консоли:

http://localhost/x_super_chat/insert.php 

И ТОГДА, кОГДА Я ОБНОВИТЬ РАЗ (когда он на самом деле начинает работать) я получаю следующее в консоли.

http://localhost/x_super_chat/update.php?timestamp=0&_=1374509491493 
http://localhost/x_super_chat/update.php?timestamp=1374509435&_=1374509493231 + the waiting thingy icon, it is waiting 

Так изменяется после обновления, мне нужно то, что я получаю после обновления, чтобы быть там, как только я войти

EDIT 2:. (после ответа Pitchinnate в)

Как только как я войти в систему, я вижу это в консоли:

http://localhost/x_super_chat/update.php?timestamp=0&_=1374566749185 (plus the waiting animation) 

Тогда я что-то другому человеку (скажем Иоанна) писать, и я получаю следующее:

http://localhost/x_super_chat/update.php?timestamp=0&_=1374566749185 
http://localhost/x_super_chat/insert.php 
http://localhost/x_super_chat/update.php?timestamp=0&_=1374566817682 
http://localhost/x_super_chat/update.php?timestamp=1374565160&_=1374566817740 
http://localhost/x_super_chat/update.php?timestamp=1374566817&_=1374566817801 (plus waiting animation) 

ТОГДА, когда я пишу что-то на другой стороне, как Джон, я получаю следующее: (это из хрома, так что это не то же самое, как консоль Firebug):

http://localhost/x_super_chat/update.php?timestamp=0&_=1374566987051 
http://localhost/x_super_chat/insert.php 
http://localhost/x_super_chat/update.php?timestamp=1374566995&_=1374567004175 
http://localhost/x_super_chat/update.php?timestamp=1374567004&_=1374567004215 
+0

У вас установлен firebug?Вы видите запрос Get в 'updateChat()' сидит и ждет ответа от длинного опроса? – Pitchinnate

+0

я. Как я это вижу? –

+0

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

ответ

0

One что вы можете попробовать это отменить свой длинный опрос После вставки, создать глобальный переменный яваскрипт за пределами функции обновления var myajax;

myajax = $.ajax({ 
    type: 'GET', 
    url: 'update.php?timestamp=' + timestamp, 

Тогда на вставке:

function insertChat() { 
    myajax.abort(); 
    var text = $this.val(); 
    $this.val(''); 
    var ru = $this.parent().parent().parent().attr('class'); 
    $.post('insert.php',{text:text, ru:ru}, function(data) { 
     if (data) { 
      updateChat(); 
     } 
    }); 
} 
+0

Итак, я оставляю updatechat(), так как это PLUS также добавляет это? –

+0

Просто добавьте 'myajax =' before '$ .ajax ({' в 'updateChat()'. Затем просто добавьте две строки в 'insertChat();' и добавьте 'var myajax;' вверху, например, '' var nc = ' – Pitchinnate

+0

Это действительно улучшило его! Теперь, когда я пишу что-то, что вижу, но другой человек этого не делает. Затем, когда другой человек что-то пишет, мы оба начинаем его видеть. Кроме того, он продолжает удваиваться , все отображается дважды, и я получаю от 2 до 3 вызовов ajax, ожидающих в консоли. –

Смежные вопросы