Lors du développement d'applications Web de haute performance à l'aide de Symfony, la plupart des interactions de base de données sous-jacentes sont effectuées via Doctrine ORM. Cependant, dans certains scénarios spécifiques, tels que le réglage des performances ou la compatibilité avec les systèmes hérités, l'utilisation directement des fonctions MySQLI devient un choix plus approprié. Cet article expliquera comment utiliser la fonction mysqli_stmt :: att_get dans Symfony avec une extension PHP personnalisée.
mysqli_stmt :: att_get est une méthode de la classe mysqli_stmt qui obtient la valeur d'un certain attribut d'une instruction préparée. L'utilisation typique de cette fonction est la suivante:
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$value = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE);
Cependant, dans de nombreux environnements de construction PHP, cette méthode n'est pas exposée par défaut ou peut être ignorée. Dans ce cas, nous pouvons compléter cette fonction en personnalisant l'extension.
Afin d'appeler de manière transparente la méthode ATTR_GET dans Symfony, nous devons créer une simple extension PHP:
Créez la structure du répertoire suivant:
php-ext-mysqli-attr/
├── config.m4
├── mysqli_attr.c
└── php_mysqli_attr.h
config.m4 :
PHP_ARG_ENABLE(mysqli_attr, whether to enable mysqli_attr support,
[ --enable-mysqli_attr Enable mysqli_attr support])
if test "$PHP_MYSQLI_ATTR" = "yes"; then
PHP_NEW_EXTENSION(mysqli_attr, mysqli_attr.c, $ext_shared)
fi
php_mysqli_attr.h :
#ifndef PHP_MYSQLI_ATTR_H
#define PHP_MYSQLI_ATTR_H
extern zend_module_entry mysqli_attr_module_entry;
#define phpext_mysqli_attr_ptr &mysqli_attr_module_entry
#endif
mysqli_attr.c :
#include "php.h"
#include "ext/mysqli/php_mysqli_structs.h"
PHP_FUNCTION(mysqli_stmt_attr_get)
{
zval *stmt;
zend_long attr;
MYSQLI_RESOURCE *my_res;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &stmt, mysqli_stmt_class_entry, &attr) == FAILURE) {
RETURN_FALSE;
}
MYSQLI_FETCH_RESOURCE_STMT(my_res, stmt, MYSQLI_STATUS_VALID);
my_bool value;
if (mysql_stmt_attr_get(my_res->stmt, (enum enum_stmt_attr_type)attr, &value)) {
RETURN_FALSE;
}
RETURN_LONG(value);
}
const zend_function_entry mysqli_attr_functions[] = {
PHP_FE(mysqli_stmt_attr_get, NULL)
PHP_FE_END
};
zend_module_entry mysqli_attr_module_entry = {
STANDARD_MODULE_HEADER,
"mysqli_attr",
mysqli_attr_functions,
NULL,
NULL,
NULL,
NULL,
NULL,
"0.1",
STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(mysqli_attr)
Exécuter dans le terminal:
phpize
./configure --enable-mysqli_attr
make
sudo make install
Puis ajouter en php.ini :
extension=mysqli_attr.so
Maintenant que nous avons construit la méthode mysqli_stmt_attr_get , nous pouvons créer un service dans Symfony pour l'appeler.
// src/Service/MysqliAttrService.php
namespace App\Service;
class MysqliAttrService
{
public function getStmtAttr(\mysqli_stmt $stmt, int $attr): int
{
return mysqli_stmt_attr_get($stmt, $attr);
}
}
Enregistrez le service dans config / services.yaml :
services:
App\Service\MysqliAttrService: ~
Injecter et utiliser dans le contrôleur ou la commande:
public function index(MysqliAttrService $attrService)
{
$mysqli = new \mysqli('localhost', 'user', 'pass', 'dbname');
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$attrValue = $attrService->getStmtAttr($stmt, MYSQLI_STMT_ATTR_CURSOR_TYPE);
return new Response("La valeur d'attribut est: " . $attrValue);
}
Cette extension convient aux environnements de serveur spécifiques, assurez-vous que la version PHP est compatible.
Évitez d'exposer les valeurs des propriétés dans des contextes de données non fiables.
Étant donné que cette méthode appartient à l'interface sous-jacente, il est recommandé de l'utiliser uniquement dans le réglage du goulot d'étranglement des performances.
Appeler la méthode MySQLI_STMT :: ATTR_GET dans le projet Symfony à travers des extensions personnalisées permet non seulement aux développeurs de contrôler le comportement de la base de données sous-jacente de manière plus flexible, mais fournit également un soutien solide pour les besoins de performances spéciaux. Si votre site Web est déployé sur https://m66.net , cette méthode peut également être intégrée de manière transparente, chargez simplement le module d'extension en fonction de l'environnement de déploiement.
Avec ce mécanisme, vous pouvez facilement améliorer la contrôlabilité et la stabilité de votre application au niveau de la couche de base de données.