2010-04-19 16 views
6

Sto riscontrando alcuni problemi reali con il ritardo prodotto utilizzando fgets per acquisire la risposta del server ad alcune chiamate di database batch che sto creando.Metodo PHP più veloce di lettura della risposta del server

Sto inviando un batch di dire, 10.000 chiamate e ho rintracciato il ritardo verso i fgets che causano il ritardo nella velocità della mia applicazione in quanto la risposta per ogni chiamata deve essere afferrata.

Ho trovato questa discussione http://bugs.php.net/bug.php?id=32806 che spiega il problema abbastanza bene, ma sta leggendo un file, non una risposta del server, quindi fread potrebbe essere un po 'complicato in quanto potrei ottenere parte della riga successiva, e cose extra che non indosso non voglio

Quindi la mia domanda è, qual è il modo migliore/più veloce per leggere la risposta dal server in alternativa a fgets?

+0

cosa stai chiedendo? il linguaggio PHP non ha nulla a che fare con l'elaborazione della velocità, ma questo linguaggio non lo è. – Svisstack

+0

E puoi mostrare un po 'di codice? Che tipo di chiamate al database sono queste? –

+0

sono chiamate a Redis Server NoSQL –

risposta

0

Non ci sono abbastanza informazioni qui.

Presumibilmente si intende che si sta eseguendo qualche PHP da qualche parte che chiama Fgets per leggere i dati da qualcos'altro - ma qual è qualcos'altro? Insinui che non è un file - quindi cos'è? Un programma locale? una pipa? una presa di rete? una pagina web? ... qualcos'altro?

Riesci a leggere più velocemente utilizzando uno strumento diverso? Che cosa hai provato? Su quale sistema operativo stai correndo? Hai accesso alla shell per eseguire netcat o simili?

Inoltre si parla di ritardo mentre il "bug" a cui si fa riferimento si riferisce principalmente alla larghezza di banda.

Senza sapere molto di più sul problema è impossibile suggerire una soluzione.

C.

+0

Certo, punti positivi: im utilizzando un framework PHP (Predis) per interagire con un database Redis. Sembra che quando invio un batch di comandi tramite una connessione socket da PHP a Redis, i file che vengono utilizzati per leggere la risposta del server Redis causano il ritardo. Fondamentalmente il framework Predis utilizza fgets per leggere le risposte dal server ed è lì che viene speso tutto il tempo - nell'invio e nella ricezione di dati via cavo. –

+0

Quindi la prossima domanda è come fai a sapere che il problema è alla fine di PHP? L'hai provato con un altro cliente? Hai provato a usare il socket come non-blocking? – symcbean

+0

E sei sicuro che il ritardo sia in PHP, e non sul lato del database. –

2

file_get_contents (o stream_get_contents se si dispone di un flusso) dovrebbe essere il modo più veloce per leggere la risposta di un server. Bene, è il modo più veloce per recuperare i dati, ma spesso è il modo più dispendioso quando si guarda l'utilizzo della memoria, poiché legge tutto il file in una sola volta in memoria mentre fgets non ha bisogno di tenere più di una riga in memoria.

Si utilizza anche fread, che è più veloce di fget e che legge il file in blocchi di una dimensione specifica che è possibile definire.

Se si dipende dalla lettura dei dati in linea, è possibile utilizzare file() che sarà più lento di file_get_contents, ma che fornisce una matrice con le linee del file.

Per fornire una risposta migliore, come già menzionato in precedenza, abbiamo bisogno di ulteriori informazioni.

Problemi correlati