PHP es muy adecuado para grandes proyectos? ¿Puede ser transaccionales?

StackOverflow https://stackoverflow.com/questions/934236

  •  06-09-2019
  •  | 
  •  

Pregunta

Esta pregunta puede parecer extraña.

Sin embargo, cada vez que hacía proyectos de PHP en el pasado, me encontré con este tipo de mala experiencia:

Scripts cancelar funcionando después de 10 segundos. Esto se traduce en muy malas inconsistencias de bases de datos (mal ejemplo para un bucle de borrado: El usuario está a punto de eliminar un álbum de fotos de objetos del álbum se elimina de la base de datos y la mitad hacia abajo de borrar las fotos del guión muere justo donde está, y. 10.000 fotos se quedan sin referencia).

No es transacción segura. Nunca he encontrado una manera de hacer algo segura , para asegurarse de que es Listo . Si la escritura es asesinada, se muere. Justo en el medio de un bucle. Se pone acaba de matar. Eso nunca sucedió en Tomcat con Java. Java se ejecuta y corre y corre, si se tarda mucho tiempo.

La porción de boletín-scripts tratar de llegar en torno a ese problema mediante la división del trabajo hasta en un montón de paquetes, es decir, el envío de 100 a la vez, entonces relading la página (oh hombre, realmente estúpido), haciendo la siguiente, y pronto. Muy a menudo se cuelga algo o script tomará más de 10 segundos, y su plataforma se ve mermada hacia arriba.

Pero entonces, me entero de que proyectos muy grandes utilizan PHP como studivz (el clon facebook alemán, en realidad el mayor sitio web alemán). Así que hay una pequeña luz de esperanza de que este mal comportamiento solo proviene de las empresas de alojamiento no profesionales que sólo matan a los scripts PHP debido a que sus servidores son tan malas. ¿Cuál es la verdad acerca de esto? Puede ser configurado de tal manera, que los scripts no matan porque toman un poco más?

No hay solución correcta

Otros consejos

  

Es PHP adecuado para proyectos muy grandes?

Cada vez que veo una pregunta como esa, me sale un poco incómodo. ¿Qué muy grande significa? Lo que puede ser grande para usted, puede ser pequeña para mí, o viceversa. Y que es aun suponiendo que usamos la misma métrica. ¿Está midiendo el tiempo para construir el proyecto, el ciclo de vida completo del proyecto, el dinero que están involucrados, el número de personas que lo utilizan, número de desarrolladores crear / mantener, etc., etc.

Dicho esto, los problemas que usted describe suena como usted no sabe su tecnología lo suficientemente bueno. Eso sería un problema para usted, independientemente de la tecnología que usted escogió. Por ejemplo, utilizar las transacciones de bases de datos para garantizar la atomicidad. Y el uso de puestos de trabajo fuera de línea asíncronos para procesar las tareas en ejecución largos (como el envío de una lista de correo).

Una gran cantidad si el mal comportamiento está cubierta en buenas frameworks como Zend Framework. Cualquier cosa que tarda más de 10 segundos está muy mal estado, pero siempre se puede aumentar el tiempo de ejecución con http: // de3. php.net/set_time_limit

Una gran cantidad de sitios grandes están writen en PHP: Facebook, Wikipedia, StudiVZ, Digg.com etc .. muchas de las cosas que estamos hablando son cosas de configuración sólo tal vez debería mirar en eso

?

El rendimiento no es una característica que sólo puede tirar después de la mayor parte del sitio está hecho. Usted tiene que diseñar el sitio para carga pesada.

Si una tarea de base de datos normalmente se involucra 10K filas, debe estar preparado no sólo los problemas de tiempo de ejecución, pero otras cuestiones de mantenimiento.

  • peor de los casos: hacer una herramienta consistencia a comprobar y corregir esos errores.
  • Mejor:. En lugar de eliminar físicamente las imágenes, sólo les bandera y dejar que los servicios de fondo para hacerse cargo de las maniobras caros
  • Mejor:. Puede utilizar un servicio de cola de trabajos y añade este trabajo a la cola

Si necesita hacer transacciones en php, sólo se puede hacer:

mysql_query("BEGIN");

/// do your queries here

mysql_query("COMMIT");

El comando commit se acaba de completar la transacción.

Si se produce algún error, sólo puede deshacer con:

mysql_query("ROLLBACK");

Editar Nota esto sólo funcionará si está utilizando una base de datos que soporta transacciones, como InnoDB

Puede configurar la cantidad de tiempo permitido para la ejecución de un script, ya sea en la configuración php.ini o mediante ini_set / set_time_limit

En lugar de studivz (del alemán Facebook clon), usted podría mirar en el Facebook real que es totalmente PHP. O Digg. O muchos sitios de Yahoo. O muchos, muchos otros.

ignore_user_abort es probablemente lo que usted está buscando, pero también se podría añadir otra capa en términos de intervenciones de mantenimiento programado. Básicamente se ejecutan en un intervalo especificado y hacer varias cosas para asegurarse de que sus datos / sistema de archivos se encuentran en un estado que desea borrar los archivos antiguos ... / no enlazados es sólo una de las muchas cosas que puede hacer.

En estos bucles grandes como la supresión de los álbumes de fotos o el envío de correos electrónicos de 1000 en busca de su ignore_user_abort y set_time_limit.
Algo como esto:

ignore_user_abort(true); //users leaves webpage will not kill script
set_time_limit(0); //script can take as long as it wants
for(i=0;i<10000;i++)
 costly_very_important_operation();

Tenga cuidado sin embargo, que esto podría ejecutar el script para siempre:

ignore_user_abort(true); //users leaves webpage will not kill script
set_time_limit(0); //script can take as long as it wants
while(true)
  do_something();

Ese guión nunca morirá, a menos que se reinicie el servidor.

Por lo tanto, lo mejor es no establecer el time_limit el 0 es.

Técnicamente no es lenguaje de programación transacción segura, que es la base de datos que necesita para estar seguro de transacciones. Así que si el script / código de ejecución muere o se desconecta, por cualquier razón, la transacción se revertirán.

Poner consultas en un bucle es una muy mala idea a menos que se diseñe específicamente para estar en ejecución en lotes y rompiendo un conjunto mucho más grande en trozos más pequeños. Ajuste de los temporizadores y los límites de PHP es generalmente una solución déficit de parada, usted sigue siendo dependiente del navegador del cliente si se utiliza la web para dar inicio a una secuencia de comandos.

Si tengo un largo proceso que necesita ser puesto en marcha por un navegador, que "desconectar" el proceso desde el navegador y el servidor web para que el control se devuelve al usuario mientras se ejecuta el script. scripts PHP ejecuta desde la línea de comandos pueden funcionar durante horas si lo desea. A continuación, puede utilizar AJAX, o volver a cargar la página, para comprobar el progreso de la escritura de larga duración.

Hay preocupación de seguridad con este código, sino a "desconectar" un proceso de PHP se ejecuta en algo así como Apache:

exec("nohup /usr/bin/php -f /path/to/script.php > /dev/null 2>&1 &");

Pero eso no tiene nada que ver con PHP siendo adecuado para grandes proyectos o estar transacción segura. PHP puede ser usado para grandes proyectos, pero ya que por defecto no hay ningún código que sigue siendo "residente" entre los golpes, ya que puede ser lento si no se diseña derecha. Además, dado que no hay soporte de espacio de nombres, que desea planificar con antelación si tiene un gran equipo de desarrollo.

Está bien para un sistema basado en Java para tomar unos minutos para que se inicie, inicializar y cargar todos los objetos predeterminados. Pero esto es inaceptable con PHP. PHP tomará más planificación para sistemas más grandes. La pregunta es, ¿cuándo el tiempo ahorrado en el uso de PHP se desperdicia por el tiempo de planificación adicional requerida para un sistema grande?

La razón por la que muy probablemente experimentado malos consistencias de bases de datos en el pasado se debe a que estaba utilizando el motor MyISAM para MySQL (que no soporta transacciones). El uso de InnoDB en cambio, es compatible con las transacciones y realiza bloqueo a nivel de fila. O usar PostgreSQL.

Muchos, muchos sitios de software se realizan en PHP. Sin embargo, no se enterará de millones de páginas web hechas en PHP que ya no existen porque fueron abandonados. Esas páginas pueden haber quemado todo dinero de la empresa para hacer frente a desastre PHP, o tal vez a la quiebra debido a su suave era tan cutre que el cliente no lo quería ... PHP parece bueno en la puesta en marcha, pero no escala muy bien. Sí, hay muchos grandes sitios web hecho en PHP, pero son más bien excepciones, que una norma.

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