현재 위치: > 최신 기사 목록> Symfony의 사용자 정의 확장을 통해 attr_get을 사용하십시오

Symfony의 사용자 정의 확장을 통해 attr_get을 사용하십시오

M66 2025-06-02

Symfony를 사용하여 고성능 웹 애플리케이션을 개발할 때 대부분의 기본 데이터베이스 상호 작용은 교리 ORM을 통해 수행됩니다. 그러나 성능 조정 또는 레거시 시스템과의 호환성과 같은 특정 시나리오에서 MySQLI 기능을 직접 사용하는 것이 더 적합한 선택이됩니다. 이 기사에서는 사용자 정의 PHP 확장으로 Symfony에서 mysqli_stmt :: attr_get 함수를 사용하는 방법을 설명합니다.

1. mysqli_stmt :: attr_get 함수를 이해하십시오

mysqli_stmt :: attr_get은 준비된 문의 특정 속성의 값을 얻는 mysqli_stmt 클래스의 메소드입니다. 이 기능의 일반적인 사용량은 다음과 같습니다.

 $stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$value = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE);

그러나 많은 PHP 빌드 환경 에서이 방법은 기본적으로 노출되지 않거나 무시 될 수 있습니다. 이 경우 확장자를 사용자 정의 하여이 기능을 보충 할 수 있습니다.

2. 사용자 정의 PHP 확장을 만듭니다

Symfony에서 Att_get 메소드를 원활하게 호출하려면 간단한 PHP 확장을 구축해야합니다.

2.1 확장 코드 구조

다음 디렉토리 구조 만들기 :

 php-ext-mysqli-attr/
├── config.m4
├── mysqli_attr.c
└── php_mysqli_attr.h

2.2 확장 코드 작성

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)

2.3 컴파일 확장

터미널에서 실행 :

 phpize
./configure --enable-mysqli_attr
make
sudo make install

그런 다음 php.ini 를 추가하십시오.

 extension=mysqli_attr.so

3. Symfony에서 서비스 호출을 캡슐화하십시오

이제 mysqli_stmt_attr_get 메소드를 구축 했으므로 Symfony에서 서비스를 만들 수 있습니다.

3.1 서비스 클래스를 만듭니다

 // 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);
    }
}

3.2 등록 서비스

config/services.yaml 에 서비스 등록 :

 services:
    App\Service\MysqliAttrService: ~

3.3 서비스 사용

컨트롤러 또는 명령에 주입 및 사용 :

 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("속성 값은입니다: " . $attrValue);
}

4. 안전 및 호환성 고려 사항

  • 이 확장은 특정 서버 환경에 적합하므로 PHP 버전이 호환되는지 확인하십시오.

  • 신뢰할 수없는 데이터 컨텍스트에서 속성 값을 드러내지 마십시오.

  • 이 메소드는 기본 인터페이스에 속하므로 성능 병목 튜닝에서만 사용하는 것이 좋습니다.

5. 요약

사용자 정의 확장을 통해 Symfony 프로젝트에서 mysqli_stmt :: attr_get 메소드를 호출하면 개발자가 기본 데이터베이스의 동작을보다 유연하게 제어 할 수있을뿐만 아니라 특수 성능 요구에 대한 강력한 지원을 제공 할 수 있습니다. 웹 사이트가 https://m66.net 에 배포 된 경우이 방법은 원활하게 통합 될 수 있습니다. 배포 환경에 따라 확장 모듈을로드하십시오.

이 메커니즘을 통해 데이터베이스 계층에서 응용 프로그램의 제어 성과 안정성을 쉽게 향상시킬 수 있습니다.