2011-08-16 8 views
5

Dopo che una pagina Web PHP da un server Apache viene caricata dal browser, il javascript lato client invia richieste AJAX ogni 5 secondi a uno script di aggiornamento PHP. La risposta AJAX, codificata in JSON, può essere abbastanza grande, quindi voglio inviare semplicemente l'array vuoto '[]' se non ci sono cambiamenti dalla richiesta AJAX precedente, o l'intero array che contiene vari oggetti JSON se c'è stato un cambia rispetto alle ultime richieste AJAX.Centinaia di processi Apache che si aggirano dopo le richieste Ajax quando viene utilizzata la variabile di sessione

Per implementare l'invio '[]' o l'array completo sto usando una variabile di sessione. Il mio script di aggiornamento appare come:

<?php 
session_start(); 
$output = '[]'; // server is running PHP 5.1 so can't use built in JSON encode 
// code here queries a database and updates $output based on the query result 
if (isset($_SESSION['previous_output'])) { 
    if ($_SESSION['previous_output'] == $output) { 
     echo '[]'; 
    } else { 
     $_SESSION['previous_output'] = $output; 
     echo $output; 
    } 
} 
?> 

Dopo aver implementato lo script precedente, l'amministratore del server web notato "troppi" processi httpd in fase di creazione e in giro, alla fine portando il server a un brusco stop.

Quando rimuovo il codice che coinvolge le variabili di sessione, alcuni processi di httpd rimangono bloccati, ma il "backlog" non è così male, e alla fine i processi spariscono prima che ci sia un impatto notevole sul server.

Il server Web non è molto utilizzato, in grado di servire una mezza dozzina di "visitatori" in qualsiasi momento. La pagina Web che esegue le richieste AJAX di 5 secondi è "protetta", ovvero solo un utente amministratore può accedervi in ​​un momento

Ho trovato un altro posting allo PHP MySQLi Singleton for Ajax-Requests end in to many processes che sembra simile, e si riferisce al progetto AJAX Push Engine (APE), che vorrei approfondire ulteriormente alla fine.Tuttavia, sono attualmente premuto per tempo e risorse (ad es. configurare un server APE ...), quindi sono perso per ciò che può essere fatto

Qualche consiglio su come eseguire le richieste AJAX di 5 secondi senza influire negativamente sulle prestazioni del server? l'uso della variabile di sessione fa una differenza così evidente?

risposta

2

Apache tenta di mantenere un gruppo di lavoratori inattivi per elaborare le richieste in entrata. Queste impostazioni possono essere ottimizzate (numero minimo di lavoratori inattivi, numero massimo di lavoratori - di particolare interesse MaxRequestsPerChild, provare a ridurre questo valore). Questo non dovrebbe causare problemi, supponendo che il tuo script stia terminando correttamente (questo non dovrebbe essere un problema per la tipica app web). È possibile ottenere una risposta approfondita dal serverfault community.

Inoltre, a seconda del carico del server (numero di utenti attivi, risorse utilizzate dalla api, ecc.), Potrebbe essere necessario ridimensionare l'app (ricerca della scalabilità automatica con il servizio ec2 di Amazon).

http://httpd.apache.org/docs/2.0/mod/worker.html

+1

In aggiunta a questo, esaminare la direttiva KeepAliveTimeout Apache http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout – Mike

Problemi correlati