PHP и AJAX для длительного использования - производительность сервера - PullRequest
1 голос
/ 02 апреля 2012

Я реализовал сердцебиение следующим образом

$.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);
        }

и просто вызывает функцию, если возвращает false, цикл будет дольше 5 секунди затем проверьте, но проблема в том, что эта штука потребляет ресурсы моего ЦП, и это было только тогда, когда 5 пользователей тестировали ее

, которую я использовал до этого

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

, но она также поглощала ресурсы, потому чтоиз многих запросов

и, может быть, мое приложение одновременно имеет 100K онлайн, и я не думаю об использовании веб-сокетов из-за совместимости браузеров. Что вы предлагаете для решения этой проблемы?любая помощь приветствуется

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

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

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

1 голос
/ 02 апреля 2012

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

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


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

...