PHP explore MySQL conexión larga, grupo de conexiones

La forma en que php se conecta a mysql es principalmente la extensión mysql, la extensión mysqli y la extensión pdo_mysql, que se proporcionan oficialmente. El mecanismo operativo de php es que todos los recursos en el proceso php se liberarán después de que se ejecute la página. Si hay múltiples accesos concurrentes a la página de prueba local http://127.0.0.1/1.php, dependiendo de la diferencia entre php y el servidor web, Abra el hilo o proceso correspondiente para manejar la solicitud y el resultado se publicará después de la solicitud. Es decir, php no puede transferir algunos datos de una página a otra desde el nivel de idioma, pero mysql_pconnect y ATTR en pdo, configurando array (PDO :: ATTR_PERSISTENT => true) de la siguiente manera puede lograr una conexión larga.

$conn = new PDO($dsn, DB_USER, DB_PASSWORD,
    array(PDO::ATTR_PERSISTENT => true)
);

Creo que la función de las conexiones largas es que, en condiciones de alta carga, al reutilizar conexiones largas, se reduce el tiempo para establecer una conexión de base de datos para cada página y el tiempo para establecer una conexión mysql está en mi máquina.

  • En el caso de conexiones de base de datos <10, el tiempo de establecimiento de conexión pdo mysql es 0.003ms, el tiempo de conexión de establecimiento mysqli es 0.14ms

  • Cuando la conexión de la base de datos está casi llena, el tiempo de conexión para mysql pdo es 0.13ms y el tiempo de conexión para mysqli es 0.13ms.

Las muestras anteriores son todas de tiempo estimado, demasiado pequeñas para estimarlas. De hecho, el tiempo para establecer una conexión no es largo, entonces, ¿por qué necesita cosas como la conexión larga de mysql y el grupo de conexiones? Eso es bajo carga alta. Por ejemplo, la concurrencia de mysql aceptable para un solo servidor es de alrededor de 200, y la concurrencia de un servidor web es de alrededor de 700. Luego, cuando una gran cantidad de 500 conexiones concurrentes están saturadas, el servidor web no ha alcanzado la carga completa y mysql ha llegado antes. La carga completa hará que todas las páginas no respondan o que las páginas que han establecido conexiones de base de datos funcionen muy lentamente.

Conexión larga de MySQL en php Debido a que hay muchas formas de ejecutar PHP, también hay muchas implementaciones de conexión larga. El soporte del servidor web es necesario para lograr conexiones largas, porque PHP no tiene el concepto de grupo de procesos y grupo de conexiones. En la mayoría de los casos, la aplicación PHP en sí no es un servidor de aplicaciones (la estrella en ascenso, es un excelente servidor de aplicaciones PHP, pero es Realizado en el nivel c). Por lo tanto, la conexión larga de php es en realidad un servidor web equipado con un módulo mpm como apache. Bajo linux, apache mantendrá un grupo de procesos. Después de que la función apache mpm esté activada, apache mantendrá un grupo de procesos por defecto. La conexión después de la conexión larga de mysql, y No se cierra como una conexión socet, sino como algo no liberado, se coloca en el grupo de procesos / grupo de subprocesos. Cuando se necesita una conexión, apache elimina la conexión de socket mysql del grupo de procesos / grupo de subprocesos que mantiene, y luego la conexión se puede reutilizar.

Probemos aquí: Primero, el entorno nativo es archlinux, y el mysql httpd php usado a continuación son códigos fuente compilados por ellos mismos, todos en el directorio / home / dengpan / opt. El modelo mpm de httpd aquí es worker, el mpm de httpd (apache usado para funciones paralelas, comúnmente conocido como módulo de multiprocesamiento) en realidad tiene tres tipos: perfork, worker y event. La ventaja de mpm es que apache tiene algunos procesos secundarios de repuesto o inactivos (grupo de subprocesos del servidor) en cualquier momento, esperando nuevas solicitudes en cualquier momento, de modo que el cliente no necesita esperar la generación de procesos secundarios antes de solicitar servicios.

Qué mpm usar, debe especificar por separado para compilarlo en apache, como compilar work mpm en apache, por ejemplo, mi parámetro de compilación httpd más simplificado es

./configure \
--with-apr=/home/dengpan/opt/apr-1.5.2 \
--with-apr-util=/home/dengpan/opt/apr-util-1.5.4 \
--prefix=/home/dengpan/opt/httpd-2.4.16 \
--with-mpm=worker

Ver los módulos cargados por httpd,

Inserte la descripción de la imagen aquí

Al ver que se ha compilado worker.c,

Los parámetros de configuración de mpm son

<IfModule mpm_worker_module>
	StartServers			 15
	MinSpareThreads		 75
	MaxSpareThreads		250
	ThreadsPerChild		 10
	MaxRequestWorkers	  400
	MaxConnectionsPerChild   0
</IfModule>

Inicie apache y use pstree para ver | -httpd — 15 * [httpd — 11 * [{httpd}]], lo que indica que hay 15 procesos de servidor y que cada servidor tiene 10 subprocesos secundarios. El número mínimo de subprocesos inactivos que se mantendrá durante todo el mpm es 75 y el número máximo de subprocesos inactivos es 250. El hilo de trabajo más grande completamente cargado es 400. A continuación, prepare un script de shell para generar el número actual de conexiones activas de mysql cada segundo Hay dos formas de comprobar el número de conexiones actuales de mysql.

  • Ingrese al shell mysql, ejecute SHOW STATUS WHERE variable_name= 'Threads_connected'; pero este método requiere que ingrese el shell mysql.Cuando hay muchas conexiones, el shell mysql no puede ingresar y no puede ser consultado.

  • Consulta directa de shell, find / proc / pidof mysqld/ fd / -follow -type s | wc -l, se requiere permiso de root.La ventaja es que incluso si mysql no puede entrar en el shell debido a demasiadas conexiones, aún se puede conectar.

El método 2 se usa aquí, porque el mysql de regreso a la máquina se carga completamente más tarde. Escribe un shell de la siguiente manera:

#!/bin/bash
while(true)
do
    find /proc/`pidof mysqld`/fd/ -follow -type s | wc -l
	sleep 1
done

Después de ejecutar el shell continuamente emite el número actual de conexiones, se puede obtener la prueba

  1. Ejecute php en cli, la conexión larga no es válida, la conexión se liberará tan pronto como el script salga de cli

  2. Si apche + mod_php no abre el módulo mpm, independientemente de la conexión larga mysql mysql_pconnect o pdo_mysql, la conexión mysql se liberará después de acceder a la página.

  3. Si apche + mod_php enciende el módulo mpm (modo trabajador), no importa la conexión larga mysql mysql_pconnect, pdo_mysql, se accede a la página, la conexión mysql +1, hasta que se alcanza el número máximo de conexiones mysql, no aumenta, pero la página de acceso aún puede reutilizar la consulta de conexión al correspondiente datos.

  4. La conexión larga de MySQL bajo nginx + php-fpm básicamente no tiene ningún efecto.

La razón por la que apache puede reutilizar la conexión mysql significa que apache debe haber implementado algunas funciones y módulos para mysql, de lo contrario es imposible guardar un tipo desconocido de puntero de socket. Ver con ldd,

➜  mysql_persist  ldd /home/dengpan/opt/httpd-2.4.16/bin/httpd
        linux-vdso.so.1 (0x00007ffffcbde000)
        libpcre.so.1 => /usr/lib/libpcre.so.1 (0x00007f8e8d17c000)
        libaprutil-1.so.0 => /home/dengpan/opt/apr-util-1.5.4/lib/libaprutil-1.so.0 (0x00007f8e8cf57000)
        libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007f8e8cd2d000)
        libapr-1.so.0 => /home/dengpan/opt/apr-1.5.2/lib/libapr-1.so.0 (0x00007f8e8cafb000)
        libuuid.so.1 => /usr/lib/libuuid.so.1 (0x00007f8e8c8f6000)
        librt.so.1 => /usr/lib/librt.so.1 (0x00007f8e8c6ee000)
        libcrypt.so.1 => /usr/lib/libcrypt.so.1 (0x00007f8e8c4b6000)
        libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f8e8c299000)
        libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f8e8c095000)
        libc.so.6 => /usr/lib/libc.so.6 (0x00007f8e8bcf3000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f8e8d3ec000)

Puede adivinar /home/dengpan/opt/apr-util-1.5.4/lib/libaprutil-1.so.0 y /home/dengpan/opt/apr-1.5.2/lib/libapr-1.so.0 Se debe implementar el segmento de código relacionado con mysql. Como lo compilé localmente, es fácil encontrar la entrada de la función El archivo /home/dengpan/github/apache-httpd/apr-util-1.5.4/dbd/apr_dbd_mysql.c es en realidad el mod_dbd de apache para bases de datos comunes. Haga soporte de conexión prolongada. La relación entre nginx y php-fpm no es como la que existe entre php y apache, por lo que nginx + php-fpm no puede lograr la conexión larga correspondiente. Probablemente php-fpm no realiza el proceso mysql ni el grupo de subprocesos.

Finalmente, doy mi consejo. Generalmente, las aplicaciones PHP pequeñas no tienen problemas de rendimiento. PHP mismo se conecta a mysql muy rápidamente, y muchas de ellas tienen un rendimiento excesivo. A medida que Apache sea reemplazado gradualmente por nginx, la conexión larga de PHP a mysql solo aumentará. Costillas de pollo. En el caso de una máquina independiente, si teme que mysql tenga presión para crear conexiones, es mejor usar el modo singleton para la creación de mysql, de modo que una página solo cree una instancia de conexión de mysql. Como el siguiente código de ejemplo de singleton, y esto es más adecuado para escribir en el marco para lograr singleton.

<?php
/**
 * Created by PhpStorm.
 * User: dengpan
 * Date: 15-7-24
 * Time: 下午2:56
 */
include "./db.php";
class DB {
    
    
	private static $_instance;
	private $db;
	private function __construct()
	{
    
    
		$this->db =  new mysqli(DB_HOST, DB_USER, DB_PASSWORD, 'my', 3307);
	}
	public static function getInstance()
	{
    
    
		if (!(self::$_instance instanceof DB)) {
    
    
			self::$_instance = new self();
		}
		return self::$_instance;
	}
	private function __clone()
	{
    
    
	}
	public function getConn()
	{
    
    
		return $this->db;
	}
}
$conn = DB::getInstance()->getConn();

Presta atención, no te pierdas

Muy bien, todos, lo anterior es todo el contenido de este artículo. Las personas que pueden ver aquí son todos talentos . Como dije antes, hay muchos puntos técnicos en PHP, porque hay demasiados, es realmente imposible de escribir, y no leerás demasiado después de escribirlo, así que lo organizaré en PDF y documentos aquí, si es necesario. lata

Haga clic para ingresar el código secreto: PHP + 「Plataforma」

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí


Para obtener más contenido de aprendizaje, visite el excelente catálogo de tutoriales de arquitecto PHP de [Comparative Standard Factory], siempre que pueda leerlo para asegurarse de que el salario aumentará un paso (actualización continua)

El contenido anterior espera poder ayudarte . Muchos PHPers siempre encuentran algunos problemas y cuellos de botella cuando están avanzados. No hay sentido de dirección cuando escriben demasiado código comercial. No sé por dónde empezar a mejorar. He compilado información sobre esto, incluyendo Pero no se limita a: arquitectura distribuida, alta escalabilidad, alto rendimiento, alta concurrencia, ajuste del rendimiento del servidor, TP6, laravel, YII2, Redis, Swoole, Swoft, Kafka, optimización de Mysql, scripts de shell, Docker, microservicios, Nginx, etc. Muchos puntos de conocimiento, productos secos avanzados avanzados, se pueden compartir con todos de forma gratuita, y aquellos que lo necesiten pueden unirse a mi grupo de intercambio de tecnología PHP

Supongo que te gusta

Origin blog.csdn.net/weixin_49163826/article/details/108940141
Recomendado
Clasificación