una - Tácticas para usar PHP en un sitio de alta carga.
insertar datos php y mysql ejemplos (23)
Antes de responder esto, nunca he desarrollado nada lo suficientemente popular como para alcanzar altas cargas de servidores. Trátame como (suspiro) un extraterrestre que acaba de aterrizar en el planeta, aunque uno que conozca PHP y algunas técnicas de optimización.
Estoy desarrollando una herramienta en PHP que podría alcanzar a muchos usuarios, si funciona bien. Sin embargo, aunque soy totalmente capaz de desarrollar el programa, no tengo ni idea de cómo hacer algo que pueda hacer frente a un gran tráfico. Así que aquí hay algunas preguntas (siéntase libre de convertir esta pregunta en un hilo de recursos también).
Bases de datos
En este momento planeo usar las funciones de MySQLi en PHP5. Sin embargo, ¿cómo debo configurar las bases de datos en relación con los usuarios y el contenido? ¿Realmente necesito múltiples bases de datos? En este momento, todo está mezclado en una base de datos, aunque he estado considerando la difusión de los datos del usuario a una, el contenido real a otra y finalmente el contenido del sitio central (maestros de plantillas, etc.) a otra. Mi razonamiento detrás de esto es que enviar consultas a diferentes bases de datos facilitará la carga en ellas como una base de datos = 3 fuentes de carga. Además, ¿esto seguiría siendo efectivo si todos estuvieran en el mismo servidor?
Almacenamiento en caché
Tengo un sistema de plantillas que se utiliza para crear las páginas y cambiar las variables. Las plantillas maestras se almacenan en la base de datos y cada vez que se llama una plantilla, se llama su copia en caché (un documento html). En este momento tengo dos tipos de variables en estas plantillas: una variable estática y una dinámica. Las variables estáticas suelen ser cosas como nombres de páginas, el nombre del sitio, cosas que no cambian a menudo; Las variables dinámicas son cosas que cambian en cada carga de página.
Mi pregunta sobre esto:
Digamos que tengo comentarios sobre diferentes artículos. Una solución mejor: almacene la plantilla de comentarios simple y haga comentarios (de una llamada de base de datos) cada vez que se cargue la página o almacene una copia en caché de la página de comentarios como una página html, cada vez que se agregue / edite / elimine un comentario la página es recopeada.
Finalmente
¿Alguien tiene algún consejo / puntero para ejecutar un sitio de alta carga en PHP? Estoy bastante seguro de que es un lenguaje viable de usar: Facebook y Yahoo! dale una gran prioridad, pero ¿hay alguna experiencia que deba tener en cuenta?
Gracias por el consejo sobre las extensiones de almacenamiento en caché de PHP, ¿podría explicar las razones para usar una sobre otra? He escuchado grandes cosas acerca de memcached a través de IRC, pero nunca he oído hablar de APC. ¿Cuáles son sus opiniones sobre ellos? Supongo que el uso de múltiples sistemas de almacenamiento en caché es bastante ineficiente.
En realidad, muchos usan APC y se conectan juntos ...
@ gary
No use MySQLi - PDO es la capa de acceso a base de datos OO "moderna". La característica más importante a utilizar es marcadores de posición en sus consultas. Es lo suficientemente inteligente como para usar preparaciones del lado del servidor y otras optimizaciones para usted también.
En este momento estoy mirando PDO y parece que tienes razón, pero sé que MySQL está desarrollando la extensión MySQLd para PHP. Creo que para tener éxito con MySQL o MySQLi, ¿qué piensas al respecto?
Gracias por el consejo sobre las extensiones de almacenamiento en caché de PHP, ¿podría explicar las razones para usar una sobre otra? He escuchado grandes cosas acerca de memcached a través de IRC, pero nunca he oído hablar de APC. ¿Cuáles son sus opiniones sobre ellos? Supongo que el uso de múltiples sistemas de almacenamiento en caché es bastante ineficiente.
Definitivamente estaré seleccionando algunos evaluadores de perfiles - muchas gracias por sus recomendaciones al respecto.
Busque en mod_cache , un caché de salida para el servidor web Apache, similar al caché de salida en ASP.NET.
Sí, puedo ver que todavía es experimental, pero algún día será definitivo.
Claro que el pdo es bueno, pero has been some controversia sobre su rendimiento en comparación con mysql y mysqli, aunque parece estar arreglado ahora.
Debería usar pdo si visualiza la portabilidad, pero si no, mysqli debería ser el camino. Tiene una interfaz OO, declaraciones preparadas y la mayor parte de lo que ofrece pdo (excepto, bueno, portabilidad).
Además, si el rendimiento es realmente necesario, prepárese para el controlador MysqLnd (mysql nativo) en PHP 5.3, que estará mucho más integrado con php, con un mejor rendimiento y un mejor uso de la memoria (y estadísticas para el ajuste del rendimiento).
Memcache es bueno si tienes servidores agrupados (y una carga similar a YouTube), pero yo también probaría APC primero.
Definir su aplicación con algo como Xdebug (como se recomienda tj9991) definitivamente será una necesidad. No tiene mucho sentido simplemente optimizar las cosas a ciegas. Xdebug te ayudará a encontrar los cuellos de botella reales en tu código para que puedas pasar tu tiempo de optimización de manera inteligente y corregir los fragmentos de código que en realidad causan retrasos.
Si está utilizando Apache, otra utilidad que puede ayudar en las pruebas es Siege . Le ayudará a anticipar cómo reaccionarán su servidor y su aplicación a las cargas elevadas, poniéndolo realmente a prueba.
Cualquier tipo de caché de código de operación para PHP (como APC o uno de los muchos otros) también ayudará mucho.
En primer lugar, como creo que dijo Knuth, "la optimización prematura es la raíz de todo mal". Si no tiene que lidiar con estos problemas en este momento, entonces no lo haga, concéntrese en entregar algo que funcione correctamente primero. Dicho esto, si las optimizaciones no pueden esperar.
Intente perfilar las consultas de su base de datos, averigüe qué es lento y qué sucede mucho y desarrolle una estrategia de optimización a partir de eso.
Yo investigaría a Memcached ya que es lo que muchos de los sitios de mayor carga utilizan para almacenar de manera eficiente el contenido de todos los tipos, y la interfaz del objeto PHP es bastante agradable.
La división de bases de datos entre servidores y el uso de algún tipo de técnica de equilibrio de carga (por ejemplo, generar un número aleatorio entre 1 y # bases de datos redundantes con los datos necesarios, y usar ese número para determinar a qué servidor de base de datos conectarse) también puede ser una excelente manera de aumentar eficiencia.
Todos estos han funcionado bastante bien en el pasado para algunos sitios de carga bastante alta. Espero que esto te ayude a comenzar :-)
He trabajado en algunos sitios que obtienen millones / visitas / mes respaldados por PHP y MySQL. Aquí hay algunos conceptos básicos:
- Caché, caché, caché. El almacenamiento en caché es una de las formas más simples y efectivas de reducir la carga en su servidor web y base de datos. Contenido de la página del caché, consultas, cálculos costosos, cualquier cosa que esté vinculada a E / S. Memcache está muerto simple y eficaz.
- Utilice varios servidores una vez que esté al máximo. Puede tener múltiples servidores web y múltiples servidores de bases de datos (con replicación).
- Reduzca el número total de solicitudes a sus servidores web. Esto implica el almacenamiento en caché de JS, CSS e imágenes con encabezados de caducidad. También puede mover su contenido estático a un CDN, lo que acelerará la experiencia de su usuario.
- Medida y punto de referencia. Ejecute Nagios en sus máquinas de producción y cargue la prueba en su servidor dev / qa. Debe saber cuándo se incendiará su servidor para evitarlo.
Recomiendo leer Construyendo sitios web escalables , fue escrito por uno de los ingenieros de Flickr y es una excelente referencia.
También puede ver la publicación de mi blog sobre escalabilidad, tiene muchos enlaces a presentaciones sobre escalas con múltiples idiomas y plataformas: http://www.ryandoherty.net/2008/07/13/unicorns-and-scalability/
La DOP también es muy lenta y su API es bastante complicada. Nadie en su sano juicio debe usarlo si la portabilidad no es una preocupación. Y seamos sinceros, en el 99% de todas las aplicaciones web no lo es. Solo te quedas con MySQL o PostrgreSQL, o con lo que estés trabajando.
En cuanto a la pregunta de PHP y qué tener en cuenta. Creo que la optimización prematura es la raíz de todo mal. ;) Haga su aplicación primero, trate de mantenerla limpia cuando se trata de programación, haga un poco de documentación y escriba pruebas de unidad. Con todo lo anterior no tendrá ningún problema en el código de refactorización cuando llegue el momento. Pero primero quieres terminar y presionarlo para ver cómo reacciona la gente.
La primera pregunta es qué tan grande realmente esperas que sea? ¿Y cuánto planea invertir en su infraestructura? Dado que siente la necesidad de hacer la pregunta aquí, supongo que espera comenzar poco a poco con un presupuesto limitado.
El rendimiento es irrelevante si el sitio no está disponible. Y para disponibilidad necesitas escala horizontal. Lo mínimo que se puede obtener con sensatez es con 2 servidores, ambos ejecutando apache, php y mysql. Configure un DBMS como esclavo del otro. Realice todas las escrituras en el maestro y todas las lecturas en la base de datos local (sea lo que sea), a menos que, por algún motivo, necesite volver a leer los datos que acaba de leer (usar el maestro). Asegúrate de que tienes la maquinaria en su lugar para promocionar automáticamente al esclavo y cercar al maestro. Utilice el DNS round-robin para las direcciones del servidor web para dar más afinidad al nodo esclavo.
La partición de sus datos en diferentes nodos de bases de datos en esta etapa es una muy mala idea. Sin embargo, puede considerar dividirlos en diferentes bases de datos en el mismo servidor (lo que facilitará la partición entre nodos cuando supere a Facebook).
Asegúrese de tener implementadas las herramientas de monitoreo y análisis de datos para medir el rendimiento de sus sitios e identificar cuellos de botella. La mayoría de los problemas de rendimiento se pueden solucionar escribiendo mejor SQL / arreglando el esquema de la base de datos.
Mantener la plantilla de la memoria caché en la base de datos es una idea tonta: la base de datos debe ser un depósito central común para los datos estructurados. Mantenga la plantilla de la memoria caché en el sistema de archivos local de sus servidores web: estará disponible más rápidamente y no ralentizará el acceso a su base de datos.
Utilice un caché de op-code.
Pase mucho tiempo estudiando su sitio y sus registros para comprender por qué va tan lento.
Empuje tanto caché como sea posible en el cliente.
Usa mod_gzip para comprimir todo lo que puedas.
DO.
Los puntos hechos sobre el caché son correctos; Es la parte menos complicada y más importante de construir una aplicación eficiente. Me gustaría agregar que aunque memcached es excelente, APC es aproximadamente cinco veces más rápido si su aplicación vive en un solo servidor.
La publicación "Comparación de rendimiento de caché" en el blog de rendimiento de MySQL tiene algunos puntos de referencia interesantes sobre el tema - http://www.mysqlperformanceblog.com/2006/08/09/cache-performance-comparison/ .
Mi primer consejo es pensar en este problema y tenerlo en cuenta al diseñar el sitio, pero no exagerar . A menudo es difícil predecir el éxito de un sitio nuevo, y me será mejor dedicar su tiempo a levantarse temprano y a optimizarlo más tarde.
En general, lo simple es rápido . Las plantillas te ralentizan. Las bases de datos te ralentizan. Las bibliotecas complejas te ralentizan. Colocando plantillas una sobre otra recuperándolas de las bases de datos y analizándolas en una biblioteca compleja -> los retrasos se multiplican entre sí.
Una vez que tenga el sitio básico en funcionamiento, haga pruebas para mostrarle dónde gastar sus esfuerzos. Es difícil ver a dónde apuntar. A menudo, para acelerar las cosas, tendrá que desentrañar la complejidad del código, esto hace que sea más grande y más difícil de mantener, por lo que solo desea hacerlo cuando sea necesario.
En mi experiencia establecer la conexión de base de datos era relativamente caro. Si puede salirse con la suya, no se conecte a la base de datos para los visitantes generales en las páginas más visitadas, como la página principal del sitio. Crear múltiples conexiones de base de datos es una locura con muy poco beneficio.
No hay dos sitios iguales. Realmente necesitas obtener una herramienta como jmeter y punto de referencia para ver dónde estarán tus puntos problemáticos. Puede pasar mucho tiempo adivinando y mejorando, pero no verá resultados reales hasta que mida y compare sus cambios.
Por ejemplo, durante muchos años, el caché de consultas de MySQL fue la solución a todos nuestros problemas de rendimiento. Si su sitio era lento, los expertos en MySQL sugirieron activar el caché de consultas. Resulta que si tienes una alta carga de escritura, el caché está realmente paralizado. Si lo encendieras sin probar, nunca lo sabrías.
Y no olvides que nunca has terminado de escalar. Un sitio que maneje 10req / s necesitará cambios para admitir 1000req / s. Y si tiene suficiente experiencia como para ser compatible con 10,000req / s, su arquitectura probablemente también se verá completamente diferente.
Bases de datos
- No use MySQLi - PDO es la capa de acceso a base de datos OO "moderna". La característica más importante a utilizar es marcadores de posición en sus consultas. Es lo suficientemente inteligente como para usar preparaciones del lado del servidor y otras optimizaciones para usted también.
- Probablemente no quieras dividir tu base de datos en este punto. Si encuentra que una base de datos no está cortando, hay varias técnicas para escalar, dependiendo de su aplicación. La replicación a servidores adicionales generalmente funciona bien si tiene más lecturas que escrituras. Sharding es una técnica para dividir sus datos en muchas máquinas.
Almacenamiento en caché
- Probablemente no quieras cachear en tu base de datos. La base de datos suele ser su cuello de botella, por lo que agregar más IO a la misma suele ser algo malo. Hay varios cachés de PHP por ahí que logran cosas similares como APC y Zend.
- Mida su sistema con el almacenamiento en caché encendido y apagado. Apuesto a que tu caché es más pesado que servir las páginas directamente.
- Si le lleva mucho tiempo compilar sus comentarios y datos de artículos desde la base de datos, integre memcache en su sistema. Puede almacenar en caché los resultados de la consulta y almacenarlos en una instancia de memcached. Es importante recordar que recuperar los datos de memcache debe ser más rápido que ensamblarlos desde la base de datos para ver algún beneficio.
- Si sus artículos no son dinámicos, o si tiene cambios dinámicos simples después de que se generen, considere la posibilidad de escribir html o php en el disco. Podría tener una página index.php que busque en el disco el artículo; si está allí, lo transmite al cliente. Si no lo está, genera el artículo, lo escribe en el disco y lo envía al cliente. Eliminar archivos del disco causaría que las páginas se reescribieran. Si se agrega un comentario a un artículo, elimine la copia en caché, se regenerará.
No me veo cambiando de MySQL pronto, así que supongo que no necesito las capacidades de abstracción de PDO. Gracias por esos artículos DavidM, me han ayudado mucho.
No puedo creer que nadie haya mencionado esto: modularización y abstracción. Si crees que tu sitio tendrá que crecer a muchas máquinas, ¡ debes diseñarlo para que pueda hacerlo! Eso significa cosas estúpidas como no asumir que la base de datos está en localhost. También significa cosas que serán una molestia al principio, como escribir una capa de abstracción de base de datos (como PDO, pero mucho más ligera porque solo hace lo que necesita hacer).
Y significa cosas como trabajar con un framework. Necesitará capas en su código para poder obtener un rendimiento más adelante al refactorizar la capa de abstracción de datos, por ejemplo, enseñándole que algunos objetos se encuentran en una base de datos diferente, y que el código no tiene que saber ni preocuparse .
Finalmente, tenga cuidado con las operaciones que hacen un uso intensivo de la memoria, por ejemplo, la copia innecesaria de cadenas. Si puede mantener bajo el uso de memoria de PHP, obtendrá un mayor rendimiento de su servidor web y esto es algo que se escalará cuando vaya a una solución de carga equilibrada.
Para lo que vale la pena, el almacenamiento en caché es DIRT SIMPLE en PHP incluso sin un paquete de extensión / ayuda como memcached.
Todo lo que necesitas hacer es crear un búfer de salida usando ob_start()
.
Crear una función de caché global. Llame a ob_start
, pase la función como una devolución de llamada. En la función, busque una versión en caché de la página. Si existe, sírvelo y termina.
Si no existe, el script continuará procesando. Cuando llegue al ob_end () correspondiente, llamará a la función que especificó. En ese momento, simplemente obtiene el contenido del búfer de salida, los coloca en un archivo, guarda el archivo y finaliza.
Añadir en algún espiración / recolección de basura.
Y muchas personas no se dan cuenta de que puede anidar ob_start()
/ ob_end()
. Entonces, si ya está utilizando un búfer de salida para, digamos, analizar anuncios o hacer resaltado de sintaxis o lo que sea, puede anidar otra llamada ob_start/ob_end
.
Parece que estaba equivocado . MySQLi todavía se está desarrollando. Pero según el artículo, el equipo de MySQL está contribuyendo a PDO_MySQL. Del artículo:
La extensión mejorada de MySQL - mysqli - es el buque insignia. Es compatible con todas las funciones del servidor MySQL, incluidos conjuntos de caracteres, declaraciones preparadas y procedimientos almacenados. El controlador ofrece una API híbrida: puede utilizar un estilo de programación orientado a objetos o de procedimiento en función de sus preferencias. mysqli viene con PHP 5 y superior. Tenga en cuenta que el fin de la vida útil de PHP 4 es 2008-08-08.
Los objetos de datos PHP (PDO) son una capa de abstracción de acceso a la base de datos. PDO le permite utilizar las mismas llamadas API para varias bases de datos. DOP no ofrece ningún grado de abstracción de SQL. PDO_MYSQL es un controlador MySQL para PDO. PDO_MYSQL viene con PHP 5. A partir de PHP 5.3, los desarrolladores de MySQL contribuyen activamente. El beneficio PDO de una API unificada tiene el precio que las características específicas de MySQL, por ejemplo, múltiples declaraciones, no son totalmente compatibles a través de la API unificada.
Deje de usar el primer controlador MySQL para PHP publicado: ext / mysql. Desde la introducción de la extensión mejorada de MySQL - mysqli - en 2004 con PHP 5, no hay ninguna razón para seguir usando el controlador más antiguo. ext / mysql no admite conjuntos de caracteres, declaraciones preparadas y procedimientos almacenados. Está limitado al conjunto de características de MySQL 4.0. Tenga en cuenta que el soporte extendido para MySQL 4.0 finaliza en 2008-12-31. ¡No te limites al conjunto de características de un software tan antiguo! Actualice a mysqli, consulte también Conversión de_MySQLi. mysql está en modo de solo mantenimiento desde nuestro punto de vista.
Para mí, parece que el artículo está sesgado hacia MySQLi. Supongo que estoy sesgado hacia la DOP. Realmente me gusta PDO sobre MySQLi. Es muy sencillo para mí. La API está mucho más cerca de otros lenguajes que he programado. Las interfaces de la base de datos OO parecen funcionar mejor.
No he encontrado ninguna característica específica de MySQL que no estuviera disponible a través de PDO. Me sorprendería si alguna vez lo hiciera.
Si está trabajando con grandes cantidades de datos y el almacenamiento en caché no lo está reduciendo, busque en Sphinx. Hemos obtenido excelentes resultados con el uso de SphinxSearch, no solo para una mejor búsqueda de texto, sino también como un reemplazo de recuperación de datos para MySQL cuando se trata de tablas más grandes. Si usa SphinxSE (complemento de MySQL), superó nuestras ganancias de rendimiento que tuvimos al almacenar en caché varias veces, y la implementación de la aplicación es un error.
Soy un desarrollador líder en un sitio con más de 15 millones de usuarios. Hemos tenido muy pocos problemas de escalado porque lo planeamos TEMPRANO y lo escalamos pensativamente. Aquí están algunas de las estrategias que puedo sugerir de mi experiencia.
ESQUEMA En primer lugar, desnormalizar sus esquemas. Esto significa que en lugar de tener varias tablas relacionales, debe optar por tener una sola tabla grande. En general, las uniones son un desperdicio de recursos de base de datos valiosos porque al hacer varias preparaciones y la intercalación se queman las E / S del disco. Evítalos cuando puedas.
La compensación aquí es que usted almacenará / extraerá datos redundantes, pero esto es aceptable porque los datos y el ancho de banda dentro de la caja son muy baratos (discos más grandes) mientras que las E / S de preparación múltiple son órdenes de magnitud más caras (más servidores) .
INDEXACIÓN Asegúrese de que sus consultas utilizan al menos un índice. Sin embargo, tenga en cuenta que los índices le costarán si escribe o actualiza con frecuencia. Hay algunos trucos experimentales para evitar esto.
Puede intentar agregar columnas adicionales que no estén indexadas y que se ejecuten paralelas a las columnas que están indexadas. Luego, puede tener un proceso fuera de línea que escribe las columnas no indexadas sobre las columnas indexadas en lotes. De esta manera, puede controlar mejor cuándo mySQL necesitará volver a calcular el índice.
Evite las consultas computadas como una plaga. Si debe calcular una consulta, intente hacerlo una vez en el momento de la escritura.
CACHING Recomiendo altamente Memcached. Ha sido probado por los jugadores más grandes en la pila de PHP (Facebook) y es muy flexible. Hay dos métodos para hacer esto, uno es el almacenamiento en caché en su capa de base de datos, el otro es el almacenamiento en caché en su capa de lógica empresarial.
La opción de capa de base de datos requeriría almacenar en caché el resultado de las consultas recuperadas de la base de datos. Puedes hacer hash de tu consulta SQL usando md5 () y usarla como clave de búsqueda antes de ir a la base de datos. La ventaja de esto es que es bastante fácil de implementar. El inconveniente (dependiendo de la implementación) es que pierde flexibilidad porque está tratando a todos los cachés de la misma manera con respecto a la caducidad de la caché.
En la tienda en la que trabajo, usamos el almacenamiento en caché de la capa empresarial, lo que significa que cada clase concreta en nuestro sistema controla su propio esquema de almacenamiento en caché y los tiempos de espera de caché. Esto nos ha funcionado bastante bien, pero tenga en cuenta que los elementos recuperados de la base de datos pueden no ser los mismos que los elementos de la memoria caché, por lo que tendrá que actualizar la memoria caché y la base de datos juntos.
DATOS TARDE La replicación solo te lleva hasta el momento. Más temprano de lo que esperas, tus escritos se convertirán en un cuello de botella. Para compensar, asegúrese de admitir la fragmentación de datos lo antes posible. Probablemente querrás dispararte más tarde si no lo haces.
Es bastante simple de implementar. Básicamente, desea separar la autoridad de claves del almacenamiento de datos. Utilice una base de datos global para almacenar una asignación entre las claves primarias y los identificadores de clúster. Consulta esta asignación para obtener un clúster y luego consulta el clúster para obtener los datos. Puede almacenar en la memoria caché esta operación de búsqueda, que la convertirá en una operación insignificante.
El inconveniente de esto es que puede ser difícil reunir datos de varios fragmentos. Pero, también puedes diseñar tu camino alrededor de eso.
PROCESAMIENTO OFFLINE No haga que el usuario espere su backend si no tiene que hacerlo. Cree una cola de trabajos y mueva cualquier procesamiento que pueda desconectar, haciéndolo por separado de la solicitud del usuario.
Tengo un sitio web con 7-8 millones de visitas al mes. No terriblemente mucho, pero lo suficiente como para que nuestro servidor sintiera la carga. La solución que elegimos fue simple: Memcache a nivel de base de datos. Esta solución funciona bien si la carga de la base de datos es su principal problema.
Comenzamos a usar Memcache para almacenar en caché objetos completos y los resultados de la base de datos que se utilizaron con mayor frecuencia. Funcionó, pero también introdujo errores (podríamos haber evitado algunos de ellos si hubiéramos sido más cuidadosos).
Así que cambiamos nuestro enfoque. Construimos un contenedor de base de datos (con los mismos métodos exactos que nuestra base de datos anterior, por lo que fue fácil de cambiar), y luego lo clasificamos para proporcionar métodos de acceso a la base de datos memcached.
Ahora todo lo que tiene que hacer es decidir si una consulta puede usar los resultados en caché (y posiblemente desactualizados) o no. La mayoría de las consultas realizadas por los usuarios ahora se obtienen directamente de Memcache. Las excepciones son las actualizaciones y las inserciones, que para el sitio web principal solo se producen debido al registro. Esta medida bastante simple redujo la carga de nuestro servidor en aproximadamente un 80%.
Ya se dieron muchas respuestas buenas, pero me gustaría señalarle un caché de código de operación alternativo llamado XCache . Es creado por un colaborador ligero.
Además, si es posible que necesite un equilibrio de carga en su servidor de base de datos en el futuro, MySQL Proxy podría ayudarlo a lograrlo.
Ambas herramientas deberían conectarse a una aplicación existente con bastante facilidad, por lo que esta optimización se puede hacer cuando la necesite, sin demasiados problemas.
APC es una necesidad absoluta. No solo es un gran sistema de almacenamiento en caché, sino que la ganancia de los archivos PHP en caché automático es una bendición. En cuanto a la idea de bases de datos múltiples, no creo que se obtenga mucho de tener diferentes bases de datos en el mismo servidor. Es posible que aumente la velocidad durante el tiempo de consulta, pero dudo que valga la pena desplegar y mantener el código para los tres y asegurarse de que estén sincronizados.
También recomiendo encarecidamente ejecutar xdebug para encontrar cuellos de botella en su programa. Hizo que la optimización fuera una brisa para mí.
Re: DOP / MySQLi / MySQLND
@ gary
No se puede decir simplemente "no usar MySQLi" ya que tienen objetivos diferentes. La DOP es casi como una capa de abstracción (aunque en realidad no lo es) y está diseñada para facilitar el uso de múltiples productos de base de datos, mientras que MySQLi es específico para las conexiones de MySQL. Es erróneo decir que PDO es la capa de acceso moderna en el contexto de compararlo con MySQLi porque su declaración implica que la progresión ha sido mysql -> mysqli -> PDO, lo cual no es el caso.
La elección entre MySQLi y PDO es simple: si necesita admitir varios productos de base de datos, entonces use PDO. Si solo estás usando MySQL, entonces puedes elegir entre PDO y MySQLi.
Entonces, ¿por qué elegirías MySQLi en lugar de PDO? Vea abajo...
Tiene razón con respecto a MySQLnd, que es la biblioteca de nivel de lenguaje central de MySQL más reciente, sin embargo, no es un reemplazo para MySQLi. MySQLi (como con PDO) sigue siendo la forma en que interactuaría con MySQL a través de su código PHP. Ambos utilizan libmysql como el cliente C detrás del código PHP. El problema es que libmysql está fuera del motor central de PHP y es donde mysqlnd entra, es decir, es un controlador nativo que utiliza los componentes internos de PHP para maximizar la eficiencia, específicamente en lo que respecta al uso de memoria.
MySQLnd está siendo desarrollado por MySQL y recientemente aterrizó en la rama PHP 5.3 que está en pruebas RC, lista para su lanzamiento a finales de este año. Entonces podrá usar MySQLnd con MySQLi ... pero no con PDO. Esto le dará a MySQLi un aumento de rendimiento en muchas áreas (no todas) y la convertirá en la mejor opción para la interacción de MySQL si no necesita las capacidades de abstracción de PDO.
Dicho esto, MySQLnd ahora está disponible en PHP 5.3 para PDO y, por lo tanto, puede obtener las ventajas de las mejoras de rendimiento de ND en PDO. Sin embargo, PDO sigue siendo una capa de base de datos genérica y, por lo tanto, es poco probable que pueda beneficiarse tanto de Las mejoras en ND como MySQLi puede .
Aquí se pueden encontrar algunos puntos de referencia útiles, aunque son de 2006. También debe ser consciente de cosas como esta opción .
Hay muchas consideraciones que deben tenerse en cuenta al decidir entre MySQLi y PDO. La realidad es que no importará hasta que obtengas números de solicitud demasiado altos y, en ese caso, tiene más sentido utilizar una extensión que haya sido diseñada específicamente para MySQL en lugar de una que resuma las cosas y que proporcione un controlador MySQL. .
No es una cuestión simple de lo que es mejor porque cada uno tiene ventajas y desventajas. Debe leer los enlaces que he proporcionado y tomar su propia decisión, luego probarla y averiguarlo. He usado PDO en proyectos anteriores y es una buena extensión, pero mi elección para el rendimiento puro sería MySQLi con la nueva opción MySQLND compilada (cuando se lance PHP 5.3).
General
- No intente optimizar antes de comenzar a ver la carga del mundo real. Puedes adivinar bien, pero si no lo haces, has perdido tu tiempo.
- Use jmeter , xdebug u otra herramienta para xdebug el sitio.
- Si la carga comienza a ser un problema, es probable que el almacenamiento en caché de datos o de objetos esté involucrado, por lo que generalmente lea las opciones de almacenamiento en caché (memcached, opciones de almacenamiento en caché de MySQL)
Código
- Perfile su código para que sepa dónde está el cuello de botella y si está en el código o en la base de datos
Bases de datos
- Utilice MYSQLi si la portabilidad a otras bases de datos no es vital, de lo contrario, PDO
- Si los puntos de referencia revelan que la base de datos es el problema, verifique las consultas antes de iniciar el almacenamiento en caché. Utilice EXPLAIN para ver dónde se están desacelerando sus consultas.
- Una vez que las consultas se optimizan y la base de datos se almacena en caché de alguna manera, es posible que desee utilizar varias bases de datos. Dependiendo de los datos, las consultas y el tipo de comportamiento de lectura / escritura, puede ser apropiado replicar a múltiples servidores o fragmentar (dividir los datos en múltiples bases de datos / servidores).
Almacenamiento en caché
- Se ha escrito bastante sobre el código, objetos y datos de almacenamiento en caché. Busque artículos sobre APC , Zend Optimizer , memcache , QuickCache , JPCache . Haga algo de esto antes de que realmente lo necesite, y estará menos preocupado por comenzar sin optimizar.
- APC y Zend Optimizer son cachés de código de operación, aceleran el código PHP al evitar volver a compilar y compilar el código. Generalmente fácil de instalar, vale la pena hacerlo temprano.
- Memcached es un caché genérico, que puede usar para cachear consultas, funciones u objetos de PHP, o páginas completas. El código debe escribirse específicamente para usarlo, lo que puede ser un proceso involucrado si no hay puntos centrales para manejar la creación, actualización y eliminación de objetos almacenados en caché.
- QuickCache y JPCache son cachés de archivos, de lo contrario son similares a Memcached. El concepto básico es simple, pero también requiere código y es más fácil con los puntos centrales de creación, actualización y eliminación.
Diverso
- Considere servidores web alternativos para alta carga. Los servidores como lighthttp y nginx pueden manejar grandes cantidades de tráfico en mucho menos memoria que Apache , si puede sacrificar el poder y la flexibilidad de Apache (o si simplemente no necesita esas cosas, que a menudo no lo hace).
- Recuerde que el hardware es sorprendentemente barato en estos días, así que asegúrese de costar el esfuerzo de optimizar un gran bloque de código en lugar de "compramos un servidor monstruo".
- Considere agregar las etiquetas "MySQL" y "escalado" a esta pregunta