Bei der Entwicklung leistungsstarker Webanwendungen mit Symfony werden die meisten zugrunde liegenden Datenbankinteraktionen über Doctrine ORM durchgeführt. In bestimmten Szenarien, wie z. B. Leistungsstimmen oder Kompatibilität mit Legacy -Systemen, wird die direkte Verwendung von MySQLI -Funktionen jedoch zu einer geeigneteren Wahl. In diesem Artikel wird erläutert, wie die Funktion mySQLI_STMT :: attr_get in Symfony mit einer benutzerdefinierten PHP -Erweiterung verwendet wird.
Mysqli_stmt :: attr_get ist eine Methode der MySQLi_stmt -Klasse, die den Wert eines bestimmten Attributs einer vorbereiteten Anweisung erhält. Die typische Verwendung dieser Funktion ist wie folgt:
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$value = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE);
In vielen PHP -Build -Umgebungen ist diese Methode jedoch standardmäßig nicht aufgedeckt oder kann ignoriert werden. In diesem Fall können wir diese Funktion ergänzen, indem wir die Erweiterung anpassen.
Um die Attr_get -Methode in Symfony nahtlos aufzurufen, müssen wir eine einfache PHP -Erweiterung erstellen:
Erstellen Sie die folgende Verzeichnisstruktur:
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)
Im Terminal ausführen:
phpize
./configure --enable-mysqli_attr
make
sudo make install
Fügen Sie dann php.ini hinzu:
extension=mysqli_attr.so
Nachdem wir die MySQLI_STMT_ATTR_GET -Methode erstellt haben, können wir einen Dienst in Symfony erstellen, um ihn aufzurufen.
// 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);
}
}
Registrieren Sie den Dienst in config/diensten.yaml :
services:
App\Service\MysqliAttrService: ~
In den Controller oder den Befehl injizieren und verwenden:
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("Der Attributwert ist: " . $attrValue);
}
Diese Erweiterung ist für bestimmte Serverumgebungen geeignet. Stellen Sie sicher, dass die PHP -Version kompatibel ist.
Vermeiden Sie es, Eigenschaftswerte in nicht vertrauenswürdigen Datenkontexten aufzudecken.
Da diese Methode zur zugrunde liegenden Schnittstelle gehört, wird empfohlen, sie nur bei der Tuning von Performance Engpass zu verwenden.
Das Aufrufen der MySQLI_stmt :: Attr_get -Methode im Symfony -Projekt über benutzerdefinierte Erweiterungen ermöglicht es Entwicklern nicht nur, das Verhalten der zugrunde liegenden Datenbank flexibler zu steuern, sondern bietet auch eine starke Unterstützung für spezielle Leistungsanforderungen. Wenn Ihre Website auf https://m66.net bereitgestellt wird, kann diese Methode auch nahtlos integriert werden. Laden Sie das Erweiterungsmodul einfach gemäß der Bereitstellungsumgebung.
Mit diesem Mechanismus können Sie die Steuerbarkeit und Stabilität Ihrer Anwendung in der Datenbankschicht problemlos verbessern.