L'extension MySQL est un outil très courant lors de l'utilisation de PHP pour manipuler les bases de données MySQL. Parfois, nous devons appeler $ mysqli-> get_charset () pour obtenir les informations de jeu de caractères utilisées par la connexion actuelle.
Bien que Get_Charset () ne prenne pas beaucoup de temps à interroger une base de données, il peut toujours apporter des frais généraux inutiles s'il est appelé fréquemment dans des demandes ou des boucles à haute fréquence. Pour optimiser les performances, nous pouvons considérer Cache le résultat de get_charset () pour éviter les appels répétés.
Cet article expliquera comment améliorer l'efficacité des opérations de base de données en mettant en cache les résultats de la fonction mysqli :: get_charset () .
La fonction mysqli :: get_charset () renvoie un objet contenant les informations de jeu de caractères utilisées par la connexion actuelle, telles que le charse , la collation , le commentaire , etc.
Par exemple:
$mysqli = new mysqli('localhost', 'user', 'password', 'database');
$charsetInfo = $mysqli->get_charset();
echo $charsetInfo->charset; // Sortie par exemple:utf8mb4
Dans la plupart des cas, nous n'avons pas besoin de l'appeler à chaque fois, car le jeu de caractères ne change généralement pas une fois la connexion établie.
Dans des applications complexes, en particulier dans les grands cadres ou les scénarios de concurrence élevés, si le code appelle get_charset () une fois dans chaque opération de base de données, un grand nombre d'appels d'objets répétés et de fonction seront générés, gaspillant le processeur et les ressources de mémoire.
Avec une mise en cache simple (par exemple avec des variables statiques, des variables globales, le mode Singleton), nous ne pouvons obtenir ces informations qu'une seule fois, puis réutilisées tout au long du cycle de vie du script.
Voici une solution de mise en œuvre simple:
class DatabaseConnection {
private $mysqli;
private $charsetInfo = null;
public function __construct($host, $user, $password, $database) {
$this->mysqli = new mysqli($host, $user, $password, $database);
if ($this->mysqli->connect_error) {
die('Échec de la connexion:' . $this->mysqli->connect_error);
}
}
public function getCharsetInfo() {
if ($this->charsetInfo === null) {
$this->charsetInfo = $this->mysqli->get_charset();
}
return $this->charsetInfo;
}
public function query($sql) {
return $this->mysqli->query($sql);
}
public function close() {
$this->mysqli->close();
}
}
// Exemple d'utilisation
$db = new DatabaseConnection('localhost', 'user', 'password', 'database');
// Premier appel,Exécutera get_charset()
$charset = $db->getCharsetInfo();
echo 'Jeu de caractères actuel:' . $charset->charset . '<br>';
// Appels ultérieurs,Utilisez directement des valeurs mises en cache
$charsetAgain = $db->getCharsetInfo();
echo 'Obtenez à nouveau le jeu de caractères(cache):' . $charsetAgain->charset . '<br>';
// Effectuer d'autres requêtes
$result = $db->query('SELECT * FROM users');
while ($row = $result->fetch_assoc()) {
echo $row['username'] . '<br>';
}
$db->close();
Réduire les frais généraux d'appel de fonction <br> Réduisez le nombre de fois que vous appelez fréquemment get_charset () , en particulier dans les boucles ou les scénarios de concurrence élevés.
Améliorer la maintenabilité du code <br> Gérer de manière centralisée les informations du jeu de caractères. Si vous devez développer ou modifier la politique de cache à l'avenir, vous n'avez qu'à modifier un seul endroit.
Facile à déboguer et à surveiller <br> La couche de cache peut facilement ajouter des journaux, déboguer la sortie ou des mécanismes de défaillance du cache.
Si votre application est distribuée ou des connexions longues (telles que Swoole, Workerman, etc.), il est recommandé d'étendre le cache au pool de connexions ou Global Manager.
Par exemple, vous pouvez mettre en cache des configurations de connexion avec APCU, Memcached ou Redis, et partager entre les processus en cas de besoin, réduisant encore les coûts d'initialisation.
Dans le même temps, Remarque: Dans les scénarios multi-thread ou multi-processus, le cache des variables statiques et des attributs d'objets n'est valide que dans le processus actuel, et la stratégie doit être ajustée en combinaison avec l'architecture d'application.