¿Hay alguna forma de sincronizar las funciones en PHP para garantizar que dos o más usuarios no puedan ejecutar la misma función al mismo tiempo?Funciones sincronizadas en PHP
Respuesta
Creo que puede lograr lo mismo (si está disponible) usando sem_acquire para adquirir un semáforo (ingresando a la sección crital) y sem_release para liberar el bloqueo.
No puedo pensar en ningún problema que pueda enfrentar. Sin embargo, una vez tuve que escribir un script PHP que estaba haciendo algunos cálculos complejos y tuve que asegurarme de que no fue ejecutado simultáneamente por dos usuarios. Para lograr eso, creé un archivo vacío al comienzo del script y lo eliminé cuando los cálculos se completaron. Por supuesto, el script verificó si el archivo existía antes de comenzar los cálculos.
Sin embargo, una base de datos puede ser más rápida. –
Siempre tengo razón, Lucasz. :) –
considere esto: prcess 1 cecks i el archivo existe y no existe. Luego, el proceso termina y la tarea finaliza, y se procesa dos veces, comprueba si existe y porque el segundo no lo ha creado. ¡Ambos procesos se ejecutarán al mismo tiempo!Su solución reduce el riesgo pero no lo elimina. Deberías usar sem_aquire como sugirió Alfred. –
Puede usar el bloqueo externo, por ejemplo, bloqueo de archivos a través de flock. Crea un archivo en alguna parte y haz que el script lo bloquee. También puede usar semaphores, pero esos son solo Unix.
Tenga en cuenta que el bloqueo de archivos locales y semáforos solo funciona si tiene un servidor web. Si su script está alojado en varios servidores con equilibrio de carga, tendrá que buscar algún otro mecanismo de bloqueo, por ejemplo, un "servidor de bloqueo" especializado en una máquina o algún tipo de bloqueo de archivos sobre NFS.
En el pasado, he creado bloqueos simples en registros en la base de datos. Si está procesando un registro existente, puede almacenar su tipo, id y la hora del bloqueo. Asegúrese de que el tipo y el ID sean la clave de la tabla de la base de datos (o de la memoria caché). Cuando comienza el proceso, adquiere el bloqueo de una manera que no borrará un bloqueo existente. Si hay un bloqueo caducado, tómalo. Si hay un bloqueo existente que no ha caducado, no se puede iniciar el proceso (ya sea cola o devolución). Si no había un candado, o si había un candado vencido existente, estás dorado. Ahora tienes el candado. Cuando termine, suelte el candado.
Puede vincular este tipo de sistema a los registros que ya están en su base de datos, crear nuevas tablas para el trabajo en progreso, o incluso utilizar un caché externo.
Saludos, Jacob
Algunos detalles más sobre por qué necesita el bloqueo sería agradable. Si tiene problemas con las interacciones de la base de datos de los usuarios, se debe buscar el uso de transacciones en el código de su base de datos para que la base de datos procese atómicamente los cambios complejos.
A modo de ejemplo: Consumo de Symfony con el ORM de Doctrine, por lo que mi código de comprometerse por lo general se ve algo como esto:
$conn = Doctrine_Manager::connection();
$conn->beginTransaction();
try {
// .. database code ..
$conn->commit();
} catch(Doctrine_Exception $ex) {
$conn->rollback();
// additional exception handling
}
Ahora, esto no evitará que los usuarios clobbering entre sí, si que se encuentren modificando el mismo registro al mismo tiempo; sin embargo, se asegurará de que la base de datos se mantenga coherente, es decir, los cambios del usuario A surtan efecto o los cambios del usuario B entren en vigencia, pero nunca un hudge-podge del usuario A y el usuario B cambia dependiendo del estado de ánimo del DB.
- 1. Desvanecimiento en imágenes cargadas sincronizadas en iOS
- 2. Funciones en mysql o php
- 3. variables php en funciones anónimas
- 4. ¿Funciones espaciales GIS en PHP?
- 5. Mantener las tablas sincronizadas en Oracle
- 6. Redefinir funciones PHP integradas
- 7. funciones PHP y @functions
- 8. Funciones PHP recursivas anónimas
- 9. Programación de interfaces y colecciones sincronizadas
- 10. ¿Cómo mantener dos carpetas sincronizadas automáticamente?
- 11. PHP uso incluyen las funciones en
- 12. Funciones comunes de CRUD en PHP
- 13. funciones lambda en PHP no son lógicas
- 14. ¿Cuándo uso variables/funciones estáticas en php?
- 15. Cómo definir funciones globales en PHP
- 16. PHP: $ _GET y $ _POST en funciones?
- 17. PHP: nombres de funciones ambiguas
- 18. Constructores PHP y funciones estáticas
- 19. PHP: ¿cómo evitar redeclarar funciones?
- 20. Mantener las configuraciones de shell sincronizadas en varias máquinas
- 21. Código fuente de PHP para funciones incorporadas
- 22. Prácticas recomendadas de funciones de espacio PHP
- 23. ¿Qué versión de php agregó funciones anónimas
- 24. Php (eval vs call_user_func vs funciones variables ...)
- 25. Lista de funciones del archivo PHP
- 26. Eclipse PDT Intellisense para funciones de PHP
- 27. Crear dinámicamente funciones de clase PHP
- 28. Funciones de PHP: número máximo de argumentos
- 29. ¿Qué hace PHP con las funciones obsoletas?
- 30. Banderas de funciones de PHP, ¿cómo?
Creo que debe proporcionar un poco más de información aquí. ¿La función que intentas ejecutar no es segura? – sberry
Este hilo es un poco antiguo, pero creo que esta es una muy buena respuesta: [Stackoverflow] (http://stackoverflow.com/questions/4710869/php-threads-and-synchronization) – Nicsoft