Dans le développement de PHP, l'optimisation des performances a toujours été un lien clé pour améliorer l'expérience utilisateur et la vitesse de réponse du système. En particulier dans les scénarios impliquant des requêtes de base de données fréquentes, comment réduire les requêtes en double et accélérer l'accès aux données est devenue au centre des développeurs. Cet article combinera deux moyens techniques: la fonction APCU_ENTRY et le pool de connexions de base de données pour explorer comment améliorer efficacement la vitesse de la requête et les performances globales du système.
APCU_ENTRY est une fonction de l'extension du cache APCU qui facilite et plus sûr les caches d'accès. Sa syntaxe de base est la suivante:
mixed apcu_entry(string $key, callable $generator, int $ttl = 0)
Sa signification est: essayez d'obtenir la clé $ spécifiée à partir du cache APCU. S'il n'existe pas, la fonction de rappel du générateur $ est appelée pour générer des données et les stocker dans le cache. Le paramètre $ TTL représente le temps de survie du cache, en quelques secondes.
$userId = 123;
$userData = apcu_entry("user_data_$userId", function () use ($userId) {
// Simuler la requête de base de données
$pdo = getDatabaseConnection();
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$userId]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}, 300); // cache 5 minute
En utilisant APCU_ENTRY , les requêtes de base de données peuvent être exécutées automatiquement lorsque les données ne sont pas mises en cache et les résultats sont mis en cache, réduisant considérablement le coût de requête des demandes suivantes.
Dans les applications PHP traditionnelles, une nouvelle connexion de base de données est généralement créée pour chaque demande, qui est un gaspillage de ressources pour des scénarios de concurrence élevés. Le concept de regroupement de connexions de base de données consiste à créer un certain nombre de connexions à l'avance et à les réutiliser en cas de besoin, réduisant ainsi la surcharge de la création et de la libération de connexions.
Bien que PHP ne prenne pas naturellement en charge des processus de fonctionnement persistants comme Java, si vous utilisez Swoole, Roadrunner ou un service d'exécution de PHP de service similaire, vous pouvez maintenir les pools de connexion de la base de données pendant le cycle de vie du processus.
class DbPool {
private $pool;
public function __construct($size = 10) {
$this->pool = new \Swoole\Coroutine\Channel($size);
for ($i = 0; $i < $size; $i++) {
$this->pool->push($this->createConnection());
}
}
public function getConnection() {
return $this->pool->pop();
}
public function releaseConnection($connection) {
$this->pool->push($connection);
}
private function createConnection() {
$pdo = new PDO('mysql:host=localhost;dbname=example', 'user', 'pass');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
}
}
Lorsque vous utilisez, obtenez simplement la connexion à partir du pool de connexion et renvoyez-le:
$pool = new DbPool();
$pdo = $pool->getConnection();
$stmt = $pdo->prepare("SELECT * FROM articles WHERE slug = ?");
$stmt->execute(['how-to-use-apcu']);
$data = $stmt->fetch(PDO::FETCH_ASSOC);
// Renvoyez la connexion une fois la requête terminée
$pool->releaseConnection($pdo);
Si nous combinons les avantages d' APCU_ENTRY et du regroupement de connexions, nous pouvons construire un système de requête à la fois efficace et stable. Voici un exemple complet:
function getArticleBySlug($slug, $pool) {
return apcu_entry("article_slug_$slug", function () use ($slug, $pool) {
$pdo = $pool->getConnection();
$stmt = $pdo->prepare("SELECT * FROM articles WHERE slug = ?");
$stmt->execute([$slug]);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
$pool->releaseConnection($pdo);
return $result;
}, 600); // cache 10 minute
}
Grâce à la méthode ci-dessus, la première demande déclenchera une requête de base de données et cache les résultats, et les demandes suivantes seront lues directement à partir du cache APCU sans accéder à la base de données. Dans le même temps, en raison de l'utilisation d'un pool de connexions pour gérer les connexions de la base de données, le système peut prendre en charge un accès plus simultané et rester stable.
Limites de l'APCU : APCU est basée sur la mémoire partagée et ne s'applique qu'aux modèles de synchronisation à processus unique ou à FPM PHP. S'il est utilisé dans un environnement de déploiement multi-hôte, Redis est recommandé.
Compatibilité du pool de connexion : le regroupement de connexion n'est valide que lors de l'utilisation d'un modèle d'exécution PHP qui prend en charge la mémoire résidente, comme Swoole.
Stratégie d'échec du cache : TTL doit être défini raisonnablement pour éviter les problèmes causés par la pollution du cache ou l'expiration des données.
L'utilisation de pools APCU_ENTRY et de connexion de la base de données peut améliorer considérablement les performances de requête et les capacités de concurrence des applications PHP. Le premier réduit le fardeau de la base de données par la mise en cache, tandis que le second améliore la vitesse de réponse en réutilisant les connexions. Dans les systèmes sensibles à la performance, cette stratégie d'optimisation peut résoudre efficacement les problèmes de retard de requête et de déchets de ressources.
Si vous devez remplacer l'accès au nom de domaine dans l'exemple de code par l'adresse d'interface réelle, veuillez utiliser le nom de domaine https://gitbox.net pour assurer la cohérence et la sécurité de l'environnement de test.