Этот скрипт чата эффективен? - PullRequest
1 голос
/ 16 августа 2010

Я сделал чат, используя php и ajax, и я использую цикл while для проверки базы данных на наличие новых сообщений.

это код, который получает сообщение:

//retrive message

function update(){

$(document).ready(function(){

$.ajax({

async: true,

type: "POST",

url: "listen.php",

success: function(data){

$("#myp").before(data);

},

complete: function(){

window.setTimeout("update();",100);
}

});

});

};


//wating for new message

<?php
include_once("connect.php");

$type="";

while($type!=='n'){


usleep(1000);

$search=mysql_query("SELECT * from chat ORDER BY id DESC LIMIT 1");

$row=mysql_fetch_assoc($search);

$type=$row['type'];

$id=$row['id'];

}

echo $row['message'] . "<br/>";


mysql_query("UPDATE chat SET type='o' WHERE id=$id");


?>

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

1 Ответ

1 голос
/ 16 августа 2010

Ваша догадка верна.Типичная настройка сервера может отвечать в любом месте между 100-1000 PHP-запросов в секунду, поэтому выполнение 10 запросов в секунду на клиента приведет к потере много ресурсов на вашем сервере.Хотя это может сработать и создать для нескольких человек, оно не будет хорошо масштабироваться.Ваш сервер может максимально работать где-то между 10-100 пользователями (что довольно мало).

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

Лучшим решением может быть использование подхода комета .Это сложно (если не невозможно) сделать исключительно с помощью PHP, поэтому вам придется иметь дело с некоторым внешним API для обработки длинных запросов http.

...