Pregunta

Necesito una manera simple para que múltiples scripts PHP en ejecución compartan datos.

¿Debo crear una base de datos MySQL con un motor de almacenamiento RAM y compartir datos a través de eso (pueden conectarse varios scripts a la misma base de datos simultáneamente?)

¿O los archivos planos con un dato por línea serían mejores?

¿Fue útil?

Solución

¿Archivos planos? Nooooooo ...

Use un buen motor de base de datos (MySQL, SQLite, etc.). Luego, para obtener el máximo rendimiento, use memcached para caché contenido.


De esta forma, tiene la facilidad y confiabilidad de compartir datos entre procesos utilizando un software de servidor probado que maneja la concurrencia, etc. Pero obtiene la velocidad de tener sus datos en caché.

Tenga en cuenta un par de cosas:

  1. MySQL tiene un caché de consultas. Si está emitiendo las mismas consultas repetidamente, puede obtener mucho rendimiento sin agregar una capa de almacenamiento en caché.
  2. MySQL es realmente rápido de todos modos. ¿Has probado la carga para demostrar que no es lo suficientemente rápido?

Otros consejos

Por favor, no use archivos planos, por la cordura de los mantenedores.

Si solo desea compartir datos, lo más rápido posible, y puede guardarlos en la RAM, entonces memcached es la solución perfecta.

Si desea la persistencia de los datos, utilice un DBMS, como MySQL.

Generalmente, una base de datos es mejor, sin embargo, si está compartiendo una pequeña cantidad de datos, en su mayoría estática, puede haber beneficios de rendimiento (y simplicidad) al hacerlo con archivos planos.

Sin embargo, cualquier otra cosa que no sea compartir datos triviales y elegiría una base de datos.

1- Donde el archivo plano puede ser útil: El archivo plano puede ser más rápido que una base de datos, pero en aplicaciones muy específicas. Son más rápidos si los datos se leen de principio a fin sin ninguna búsqueda o escritura. Si los datos no caben en la memoria y necesitan leerse completamente para realizar el trabajo, "puede" ser más rápido que una base de datos. Además, si hay mucho más escritura que lectura, el archivo plano también brilla, la mayoría de las configuraciones de bases de datos predeterminadas deberán hacer que las consultas de lectura esperen a que finalice la escritura para mantener los índices y las claves externas. Hacer las consultas de escritura suele ser más lento que las lecturas simples.

TD / LR vesion: Utilice archivos planos para el sistema basado en trabajos (Aka, análisis de registros simples), no para consultas de búsquedas web.

2- Los archivos planos caen en picada:   Si vas con un archivo plano, necesitarás sincronizar tus scripts cuando el archivo cambie usando un mecanismo de bloqueo personalizado. Lo que puede conducir a la desaceleración, la corrupción hasta el bloqueo total si tiene un error.

3- ¿Base de datos basada en RAM? La mayoría de las bases de datos tienen en la memoria caché los resultados de las consultas, los índices de búsqueda, lo que los hace muy difíciles de superar con un archivo plano. Debido a que se almacenan en la memoria caché, hacer que se ejecute completamente desde la memoria es la mayoría de las veces ineficaz y peligroso. Es mejor ajustar correctamente la configuración de la base de datos.

Si buscas optimizar el rendimiento con ram, primero buscaría ejecutar tus scripts php, páginas html e imágenes pequeñas desde una unidad ram. Donde es más probable que el mecanismo de caché sea tosco y golpee el disco duro sistemáticamente para datos estáticos que no cambien.

Se puede lograr un mejor resultado con un equilibrador de carga, agrupando con conexiones de plano posterior hasta una matriz SAN basada en RAM. Pero ese es un tema completamente diferente.

5- ¿se pueden conectar varios scripts a la misma base de datos simultáneamente?

Sí, se llama agrupación de conexiones. En php (lado del cliente) es la función para abrir una conexión su mysql-pconnect ( http://php.net/manual/en/function.mysql-pconnect.php ). Puede configurar la conexión máxima abierta en php.ini, creo. Una configuración similar en el lado del servidor mysql define el máximo de conexiones concurrentes de clientes en /etc/mysql/my.cnf.

Debe hacer esto para aprovechar el procesamiento paralelo de la CPU y evitar que el script php espere a que finalice la consulta entre ellos. Aumenta enormemente el rendimiento bajo cargas pesadas.

También hay un grupo de conexiones / grupo de hilos en la configuración de Apache para clientes web normales. Ver httpd.conf.

Perdón por el muro de texto, estaba aburrido. Louis

Si los está ejecutando en varios servidores, un enfoque basado en el sistema de archivos no lo cortará (a menos que tenga un sistema de archivos compartido coherente, lo que es poco probable y no escalable).

Por lo tanto, necesitará una base de datos basada en servidor de todos modos para permitir el intercambio de datos entre servidores web. Si te tomas en serio el rendimiento o la disponibilidad, tu aplicación admitirá varios servidores web.

Yo diría que la base de datos MySql sería una mejor opción a menos que tenga algún mecanismo para manejar bloqueos en los archivos planos (y alguna forma de controlar el acceso). En este caso, la capa de DB (independientemente del DBMS específico) está actuando como una capa de indirección, lo que le permite no preocuparse por ello.

Dado que el OP no especifica un servidor web (y PHP en realidad puede ejecutarse desde una línea de comandos), entonces no estoy seguro de que las tecnologías de almacenamiento en caché sean lo que buscan aquí. El OP podría estar buscando hacer algún tipo de transformación de datos voladores que no esté impulsada por el sitio web. Quién sabe.

Si su sistema tiene un caché PHP (que almacena en caché el código PHP compilado en la memoria, como APC), intente poner sus datos en un archivo PHP, como código PHP. Si tiene que escribir datos, hay algunos problemas de seguridad.

  

Necesito una forma simple para múltiples   ejecutar scripts PHP para compartir datos.

APC , y memcached son buenas opciones según el contexto. memoria compartida también puede ser una opción.

  

¿Debo crear una base de datos MySQL con una RAM   motor de almacenamiento y comparta datos a través de   eso (se pueden conectar varios scripts a   ¿El mismo DB simultáneamente?)

Esa también es una opción decente, pero probablemente no será tan rápida como APC o memcached.

  

O podría aplastar archivos con una sola pieza de   ¿los datos por línea serán mejores?

Si se trata de datos de solo lectura, es una posibilidad, pero puede ser más lenta que cualquiera de las opciones anteriores. Especialmente si los datos son grandes. Sin embargo, en lugar de escribir un código de análisis personalizado, considere simplemente crear una matriz PHP e incluya () el archivo.

Si este es un almacén de datos al que pueden acceder varios escritores simultáneamente, ¡por supuesto, NO use un archivo plano! Escribir en un archivo plano desde múltiples procesos es probable que conduzca a la corrupción del archivo. Puede bloquear el archivo, pero corre el riesgo de problemas de contención de bloqueo y largos tiempos de espera de bloqueo.

El manejo de escrituras concurrentes es la razón por la que existen aplicaciones como mysql y memcached.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top