2013-05-01 20 views
17

Desidero scrivere applicazioni non bloccanti. Io uso apache2, ma stavo leggendo su nginx e il suo vantaggio rispetto ai processi di apache. Sto pensando di cambiare Apache per Nginx. La mia domanda è, è possibile scrivere applicazioni web non bloccanti con php e nginx ?.Scrittura di applicazioni PHP non bloccanti

O è un'idea migliore provare a farlo con python, utilizzando qualche proxy inverso come uwsgi o gunicorn con nginx? O è la soluzione per imparare nodejs?

risposta

12

Scrittura di applicazioni non di blocco in php è possibile, ma probabilmente non è l'ambiente migliore per farlo, in quanto non è stato creato tenendo questo in mente! Ottenete un controllo abbastanza decente sui vostri processi figli usando la libreria di controllo dei processi PCNTL ma ovviamente non vi offrirà mai la stessa facilità d'uso che gli altri ambienti possono darvi!

Non conosco molto bene python ma personalmente ti avrei consigliato di andare con nodejs! È una tecnologia abbastanza nuova, è vero, ma tutto non è bloccante lì ed è pensato per essere così! Fondamentalmente quello che hai è un singolo thread (che puoi estendere come vuoi in questa versione di notizie) e letteralmente tutto (tranne che tu dici di fare diversamente) sarà guidato dagli eventi, lasciando spazio per procedere sulla coda del processo come previsto!

Nodejs è davvero facile da imparare, se ti sei imbattuto in applicazioni web, sai comunque javascript! non è ancora ampiamente documentato, ma ci sono molti moduli pronti per l'uso che puoi scaricare e usare subito!

+3

@DarthVader JavaScript è un linguaggio molto potente una volta che sai come affrontarla! Sai che avrai un sacco di richiami, giusto? sapendo che in precedenza ti dà la possibilità di pensare in modo diverso, rispetto allo sviluppatore web medio che ha solo bisogno di qualche funzione jquery: D non penso davvero che nodejs sia solo un affare di app giocattolo! Beh, come sempre, praticamente tutto dipende da ciò che ti serve! Ma posso garantirti che ho visto dannatamente grandi progetti messi giù in js! – Ivo

+0

@DarthVader alcuni commenti su python? –

+0

no non lo è. puoi confrontare js con C# o java? è una lingua diversa – DarthVader

2

Se si desidera avere un'applicazione non bloccante senza un grande sforzo, è possibile provare a utilizzare pushpin. Lo uso in una delle mie applicazioni e funziona alla grande. Puoi trovare ulteriori informazioni su blog post dell'autore. Ho aggiunto questo al progetto esistente, quasi senza modificare il codice esistente.

Se si desidera utilizzare il nodo, essere sicuri che questo è lo strumento giusto per il lavoro. Controlla le domande di overflow dello stack, perché ci sono già risposte a questa domanda. Chiediti, se l'idea dell'applicazione si adatta alle funzionalità del nodo. Prova ad esempio Why and When to use node js? e How to decide when to use NodeJS?.

3

non ho guardato a spillo ancora, ma sto scrivendo questa risposta per puntare a un'altra struttura che supporta le applicazioni non-blocking in PHP:

Reagire http://reactphp.org/

Supporta il binding a un server HTTP o WebSocket e possono essere utilizzati con software webserver come Nginx inoltrando (usando proxy_pass) richieste ad esso tramite HTTP. Puoi persino utilizzare HTTPS nel server web e inoltrarlo non crittografato. (Manca il supporto SSL in React.)

Non sembra esserci ancora il supporto FastCGI o UWSGI, almeno non nel progetto upstream.

Lo stile è simile alla scrittura di node.js, alle chiusure di PHP 5.3+ allegate agli eventi e utilizza in modo trasparente i socket non bloccanti sotto. Ci sono buoni esempi su quel sito, quindi non li ripeterò qui poiché non hai mai chiesto un caso d'uso specifico.

AGGIORNATO: Ho appena guardato il sito web di simboli e non è un framework o uno strumento per scrivere domande di blocco PHP come richiesto nel titolo della domanda. Sembra che sarebbe utile come parte di una soluzione però.

4

Swoole è una buona scelta per la scrittura non-blocking applicazione PHP

ecco un esempio:

$fp = stream_socket_client("tcp://127.0.0.1:80", $code, $msg, 3); 
$http_request = "GET /index.html HTTP/1.1\r\n\r\n"; 
fwrite($fp, $http_request); 
swoole_event_add($fp, function($fp){ 
    echo fread($fp, 8192); 
    swoole_event_del($fp); 
    fclose($fp); 
}); 
swoole_timer_after(2000, function() { 
    echo "2000ms timeout\n"; 
}); 
swoole_timer_tick(1000, function() { 
    echo "1000ms interval\n"; 
});