PDO 연결 닫기
MySQLi에 비해 PDO에 관한 간단한 질문입니다.
MySQLi를 사용하여 연결을 닫으려면 다음 작업을 수행합니다.
$this->connection->close();
단, PDO에서는 다음을 사용하여 연결을 엽니다.
$this->connection = new PDO();
설정한 연결을 닫으려면null
.
$this->connection = null;
이것이 맞습니까?이렇게 하면 실제로 PDO 접속이 해방됩니까?(설정대로 동작하는 것을 알고 있습니다).null
MySQLi에서는 함수를 호출해야 합니다.close
)를 클릭하여 연결을 닫습니다.PDO는 다음과 같이 간단합니까?= null
연결 해제하시겠습니까?아니면 연결을 끊는 기능이 있나요?
매뉴얼에 따르면 고객님이 옳습니다(http://php.net/manual/en/pdo.connections.php):
접속은 PDO 오브젝트의 라이프 타임 동안 액티브한 상태로 유지됩니다.연결을 종료하려면 해당 개체에 대한 나머지 참조를 모두 삭제하여 개체를 삭제해야 합니다. 이 작업을 수행하려면 개체를 유지하는 변수에 NULL을 할당해야 합니다.이를 명시적으로 실행하지 않으면 스크립트가 종료될 때 PHP가 자동으로 연결을 종료합니다.
PDO 개체를 영구 연결로 초기화할 경우 연결이 자동으로 닫히지 않습니다.
$conn=new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
// If this is your connection then you have to assign null
// to your connection variable as follows:
$conn=null;
// By this way you can close connection in PDO.
단순히 연결을 null로 설정하는 것 이상입니다.문서에는 그렇게 기재되어 있지만 mysql에 대해서는 사실이 아닙니다.연결은 조금 더 오래 지속됩니다(60대는 들어봤지만 테스트한 적은 없습니다).
상세한 것에 대하여는, 다음의 접속 코멘트를 참조해 주세요.https://www.php.net/manual/en/pdo.connections.php#114822
연결을 강제로 닫으려면 다음과 같은 작업을 수행해야 합니다.
$this->connection = new PDO();
$this->connection->query('KILL CONNECTION_ID()');
$this->connection = null;
파생 클래스를 만들어, 보다 자기 문서화된 지시를 취득했습니다.$conn=null;
.
class CMyPDO extends PDO {
public function __construct($dsn, $username = null, $password = null, array $options = null) {
parent::__construct($dsn, $username, $password, $options);
}
static function getNewConnection() {
$conn=null;
try {
$conn = new CMyPDO("mysql:host=$host;dbname=$dbname",$user,$pass);
}
catch (PDOException $exc) {
echo $exc->getMessage();
}
return $conn;
}
static function closeConnection(&$conn) {
$conn=null;
}
}
다음 사이에 코드를 호출할 수 있습니다.
$conn=CMyPDO::getNewConnection();
// my code
CMyPDO::closeConnection($conn);
<?php if(!class_exists('PDO2')) {
class PDO2 {
private static $_instance;
public static function getInstance() {
if (!isset(self::$_instance)) {
try {
self::$_instance = new PDO(
'mysql:host=***;dbname=***',
'***',
'***',
array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_general_ci",
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
)
);
} catch (PDOException $e) {
throw new PDOException($e->getMessage(), (int) $e->getCode());
}
}
return self::$_instance;
}
public static function closeInstance() {
return self::$_instance = null;
}
}
}
$req = PDO2::getInstance()->prepare('SELECT * FROM table');
$req->execute();
$count = $req->rowCount();
$results = $req->fetchAll(PDO::FETCH_ASSOC);
$req->closeCursor();
// Do other requests maybe
// And close connection
PDO2::closeInstance();
// print output
커스텀 클래스 PDO2의 완전한 예.
언급URL : https://stackoverflow.com/questions/18277233/pdo-closing-connection
'source' 카테고리의 다른 글
JVM은 테일콜 최적화를 방해합니까? (0) | 2023.01.15 |
---|---|
Okhttp3 - RequestBody.create(contentType, content)가 폐지되었습니다. (0) | 2023.01.15 |
GROUP BY 및 ORDER BY를 사용한 MySQL 및 MariaDB의 다른 결과 세트 (0) | 2023.01.09 |
MySql에서 잘못된 조합 오류입니다. (0) | 2023.01.09 |
MySQL 설정 및 Dockerfile 내 덤프 가져오기 (0) | 2023.01.09 |