2009-01-25 8 views
5

He creado un pequeño servicio web en PHP. Quiero controlar la cantidad de llamadas a un método API específico.¿Qué elegir para almacenar solo un número entero? Sqlite? o archivo de texto?

Pensé al principio en usar un archivo de texto, porque es solo un número entero. Pero después de echarle un buen vistazo a SQLite me pareció mucho más conveniente. Así que el código es simplemente: obtenga el "contador" de SQLite e increméntelo cuando se llame a ese método, luego guárdelo en SQLite db.

¿Es esta una forma correcta de hacerlo? ¿Sería más simple y más escalable usar solo un archivo o ... tal vez otra cosa?

Gracias de antemano.

Respuesta

1

Ponerlo en una base de datos real tanto un archivo de texto como un DB SQLite tendrán problemas de bloqueo donde si el archivo está abierto actualmente y se produce una nueva solicitud para abrirlo, la segunda solicitud dará error. Use una base de datos real como MySQL, MSSQL o lo que esté disponible.

+0

SQLite definitivamente hace frente a múltiples procesos/hilos/identificadores a la misma base de datos. – Javier

+0

Pero todavía son solo archivos. Un DBMS completo como MySQL es MUCHO mejor en el manejo de 1000 escrituras simultáneas. – UnkwnTech

+2

¿Dónde crees que MySQL almacena sus datos? En una caja del tesoro mágico? – jcollum

3

Una base de datos normalmente se escalaría mejor que el sistema de archivos, pero tendrá que tener cuidado y usar bloqueos apropiados con cualquiera de los mecanismos.

+0

tenga en cuenta que sqlite está optimizado para lecturas, escribe que bloquea todo el db ... –

+0

base de datos SQL solo para almacenar un número entero? De hecho, estoy sorprendido de que tu respuesta haya subido tanto, este es un triste estado de desarrollo de software. –

+0

@lubos hasko: Simplemente estoy diciendo los hechos. El cartel habla de un servicio web; ¿Escalará el sistema de archivos a miles de llamadas a un solo archivo? –

2

Por supuesto, use el archivo plano.

  • Se habrá lo que hay que hacer
  • extremadamente sencilla
  • Sin dependencia de biblioteca de terceros
  • Usted será capaz de ver o contador de actualización con el Bloc de notas simplemente.
  • Más rápido que SQLite (sin análisis de SQL, hay otros gastos generales)
  • y tan escalable como SQLite (SQLite son sólo archivos planos más complejos)

Si usted necesitará siempre algo tan rápido como sea posible, Tendrás que hacer un proceso persistente en la memoria para eliminar el cuello de botella de E/S. Pero por favor ... simplemente no use la base de datos SQL para almacenar un solo entero.

+1

no hace mención de cómo manejar el bloqueo y las posibles transacciones ... el bloqueo es la clave para hacer que esto funcione de manera confiable. –

+0

Ah, y ¿qué opinas, cómo maneja SQLite bloqueo? Abre el archivo en modo de solo lectura o exclusivo de lectura y escritura ... no hay magia. –

+0

en realidad hay magia, mucho de eso http://www.sqlite.org/lockingv3.html –

5

una tercera posibilidad: memcachedb. es compatible con memcached, pero almacena su almacén de clave-valor en un archivo BDB. no solo tiene comandos de lectura-escritura, sino también incrementos/decrementos atómicos para valores numéricos.

una alternativa más sería escribir un 'servidor de contador'. un proceso independiente que obtiene comandos de 'leer' e 'incrementar' sobre un socket. la ventaja es que es realmente fácil hacer incrementos 'atómicos'. almacena su (s) contador (es) en un archivo simple, sin problemas de concurrencia ya que nunca hay más de un servidor.

debería ser fácil escribir en menos de cien líneas de C. simplemente un ciclo cerrado procesando un comando a la vez, vaciando en el disco cada pocos segundos. dado que el procesamiento es tan simple, la latencia es mínima.

0

De acuerdo con SQLite puede gestionar sitios que van hasta "100K [sic] hits/día". Si está revisando eso, puede que necesite investigar una base de datos más sólida como MySQL.Pero si escribe 100k registros en la base de datos todos los días para un sitio web, creo que algo está mal con lo que está haciendo, según su ejemplo. Esto realmente suena como un trabajo para el almacenamiento en caché. De lo que no sé nada en PHP, lo siento.

Tienen esto que decir acerca de los archivos frente a SQLite: "Muchos programas usan fopen(), fread() y fwrite() para crear y administrar archivos de datos en formatos nacionales. SQLite funciona particularmente bien como reemplazo para estos archivos de datos ad hoc ". (source)

Cuestiones relacionadas