2010-04-19 9 views
6

Tengo algunos problemas reales con el retraso producido al usar fgets para captar la respuesta del servidor a algunas llamadas a la base de datos por lotes que estoy realizando.Método más rápido de PHP para leer la respuesta del servidor

Estoy enviando un lote de, digamos, 10,000 llamadas y he rastreado el lag hacia abajo, lo que provoca el retraso en la velocidad de mi aplicación ya que la respuesta para cada llamada debe ser captada.

He encontrado este hilo http://bugs.php.net/bug.php?id=32806 que explica el problema bastante bien, pero él está leyendo un archivo, no una respuesta del servidor, así que fread podría ser un poco complicado ya que podría obtener parte de la siguiente línea, y cosas adicionales que no quiero

Así que mi pregunta es, ¿cuál es la mejor/más rápida forma de leer la respuesta del servidor como una alternativa a los fgets?

+0

¿De qué preguntas? El lenguaje php no tiene nada que ver con el procesamiento de velocidad, pero este lenguaje no es para. – Svisstack

+0

¿Y puede mostrar algún código? ¿Qué tipo de llamadas a la base de datos son estas? –

+0

son llamadas al servidor NoSQL de Redis –

Respuesta

0

No hay suficiente información aquí.

Probablemente te refieres a que estás ejecutando PHP en alguna parte que llama a los usuarios a leer datos de otra cosa, pero ¿qué otra cosa es? Usted insinúa que no es un archivo, entonces, ¿qué es? Un programa local? ¿un tubo? un enchufe de red? ¿una página web? ... ¿algo más?

¿Puedes leer más rápido usando una herramienta diferente? ¿Qué has intentado? ¿En qué sistema operativo estás corriendo? ¿Tiene acceso de shell para ejecutar netcat o similar?

También habla de retraso mientras que el "error" al que se refiere se refiere principalmente al ancho de banda.

Sin saber mucho más sobre el problema es imposible sugerir una solución.

C.

+0

Claro, buenos puntos: estoy usando un marco PHP (Predis) para interactuar con una base de datos Redis. Parece que cuando envío un lote de comandos a través de una conexión de socket desde PHP a Redis, los datos que se utilizan para leer la respuesta del servidor Redis están causando el retraso. Básicamente, el marco de Predis utiliza fgets para leer las respuestas del servidor y es donde todo el tiempo se está gastando: en el envío y recepción de datos a través del cable. –

+0

Entonces, la siguiente pregunta es ¿cómo sabes que el problema está en el extremo de PHP? ¿Lo has probado con otro cliente? ¿Has intentado ejecutar el socket como no bloqueante? – symcbean

+0

Y está seguro de que la demora está en PHP y no en el lado de la base de datos. –

2

file_get_contents (o stream_get_contents si usted tiene una corriente) debe ser la forma más rápida de leer la respuesta de un servidor. Bueno, es la forma más rápida de recuperar datos, pero a menudo es la forma más derrochadora cuando se analiza el uso de la memoria, ya que lee todo el archivo a la vez en memoria mientras que fgets no necesita mantener más de una línea en la memoria.

También utiliza fread, que es más rápido que fgets y que lee el archivo en trozos de un tamaño específico que puede definir.

Si depende de leer datos en línea, puede usar file() que será más lento que file_get_contents, pero que le proporciona una matriz con las líneas del archivo.

Para darle una mejor respuesta, como ya se mencionó anteriormente, necesitamos más información.

Cuestiones relacionadas