¿Fwrite concurrente en PHP?

Tengo una función fwrite para escribir el registro para retrasar la inserción en la base de datos.

Tenemos una tasa de visitas de 20,000 visitas por hora.

por lo que es 0.18 s por escritura.

Mi pregunta es que ¿es posible que PHP pierda varios registros cuando hay 2 o 3 visitantes que ingresan al mismo tiempo?

Si es así, ¿cómo puedo hacer esto simultáneo?

Mi código es normal Fopen fwrite fclose.

preguntado el 16 de mayo de 11 a las 19:05

Hice algunas pruebas que mostraron que las escrituras eran atómicas hasta 10k en mi plataforma (centos). Creo que la mayoría de las aplicaciones se basan en esto; a veces terminará con algunas entradas de registro dañadas, pero eso suele ser más aceptable de lo que requeriría agregar la sobrecarga de cualquier tipo de sincronización de escritura. ¿Quizás podría iniciar sesión en syslog si realmente es un problema? -

Mi código es solo un fopen fwrite fclose normal -

2 Respuestas

Evitaría esto si fuera tú. Si debe registrar algo para cada solicitud, use algo como Gearman para poner los datos en cola para su procesamiento posterior, o guárdelos en una base de datos (o una base de datos NoSQL) para su procesamiento posterior. No olvide que las bases de datos fueron diseñadas para resolver este mismo problema. No intente reinventar una base de datos utilizando archivos de registro.

Sin mencionar que 0.18s por escritura es probablemente mucho más costoso que una inserción en un DBM (MySQL para mí generalmente devuelve escrituras dentro de 0.01 segundos, dependiendo de la tabla, MongoDB puede ser MUCHO más rápido).

contestado el 16 de mayo de 11 a las 23:05

¿Por qué agregaría una tensión adicional al disco duro de su servidor de base de datos, cuando hay syslog (3)? - miel

Mel: porque el OP declara explícitamente que quiere recuperar estos datos para una operación de db retrasada. Entonces, ¿no sería un abuso de syslog usarlo como un almacén de datos temporal? Estaría de acuerdo en usar syslog si estuviéramos hablando de registro, pero parece que el OP solo está buscando una cola temporal (pero podría estar equivocado) - ircmaxell

Hmm, leí que quiere registrar el "tiempo de retraso de las inserciones", es decir, cuánto tarda una inserción. Guess OP necesita aclarar lo que quiere. - miel

Estimado Mel, insertar usando Load Data de nuestro servidor solo toma menos de 1 segundo. Actualmente usamos Fwrite para escribir CSV temporal, después de que el CSV alcance los 500KB, lo importaremos a la base de datos. Pero debemos mantenerlo correcto. Al principio, pensé en usar Gear Man, pero es una molestia en la instalación porque estamos ejecutando Windows, así que uso Fwrite en su lugar. Supongo que debería volver a Gearman para poner en cola el fwrite. - DucDigital

¿Cómo estás disparando las escrituras? Si cada solicitud (1 por visita) tiene una escritura asociada, no se perderá ninguna. Quizás podrían volverse (más lentos) ya que su servidor web está haciendo cola / manejando solicitudes (tráfico pico), pero PHP es impulsado por solicitudes, por lo que para cada carga de página, tendrá que ejecutar fwrite.

Digo que no se perderá ninguno porque, a menos que esté haciendo alguna E / S sin bloqueo, su script se bloqueará en la llamada fwrite. En otras palabras, se ejecutará fwrite.

Tendrá problemas para obtener cualquier tipo de concurrencia en una aplicación basada en solicitudes escrita en PHP sin hacer algunas cosas realmente extravagantes.

contestado el 16 de mayo de 11 a las 23:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.