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를 사용한 전체 예제.