2012-04-01 2 views
1

Я реализовал сердцебиения как следующийДлинные потянув PHP & AJAX - производительность сервера

$.ajax({ 
    cache:false, 
    timeout:8000, 
    type:"POST", 
    url:"someurl.php", 
    data:allFormValues, 
    error:function(){ alert("some error occurred") }, 
    success:function(response){ //call some functions } 
    }); 

и на стороне сервера

$time = time(); 
     while(!proccessServer() && (time() - $time) < 60) 
     { 
      sleep(5); 
     } 

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

я использовал до этого

window.setInterval(function(){ 
    //I call a function here 
}, 5000); 

но и ест ресурсы из-за многих запросов

и, возможно, мое приложение было 100K онлайн в то же самое время и я не думал об использовании WebSockets из-браузеров Совместимость Что вы предлагаете решить? Подсказка:

ответ

2

Ваш веб-сервер (Apache?) Будет использовать один поток до тех пор, пока запрос не завершится, и он ест ресурсы. И вы используете PHP-процесс для каждого посетителя, просто ожидая. PHP не подходит для таких решений. Вы должны смотреть на другие технологии, если хотите сделать комету. Например node.js.

Вы также можете переключиться на NGiNX как веб-сервер и использовать NGiNX_HTTP_Push_Module от http://pushmodule.slact.net/ для вашего приложения, а затем оставайтесь с PHP. NGiNX затем примет соединение от вашего посетителя, а затем дождитесь, пока ваш код вытолкнет данные в NGiNX. Это может сработать для вас, в зависимости от того, что именно вы хотите сделать.

1

Проблема заключается в том, что вы позволяете серверу спать и повторять попытку. что само по себе является ресурсоемким. использовать его мудро.

Что нужно сделать, так это опросить сервер за более длительные промежутки времени и ответить сервером с таким статусом, как «done» или «fail». после этого пусть JS определит ответ и повторит попытку, а не PHP.


в качестве альтернативы, вы можете использовать новый HTML5 sockets так, что у вас есть постоянное двустороннее соединение от клиента к серверу. сервер может выталкивать новый контент клиенту без запроса клиента каждый раз.

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