Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 关闭函数内部的PDO连接_Php_Mysql_Pdo - Fatal编程技术网

Php 关闭函数内部的PDO连接

Php 关闭函数内部的PDO连接,php,mysql,pdo,Php,Mysql,Pdo,中给出了如何关闭连接的以下示例: $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); // use the connection here // and now we're done; close it $dbh = null; 但是,如果我在一个函数中使用它,$dbh只有局部作用域,我是否必须将它设置为null,或者在函数返回时连接会关闭 在下面的示例中,连接是否关闭 public function doDB

中给出了如何关闭连接的以下示例:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// use the connection here


// and now we're done; close it
$dbh = null;
但是,如果我在一个函数中使用它,
$dbh
只有局部作用域,我是否必须将它设置为null,或者在函数返回时连接会关闭

在下面的示例中,连接是否关闭

public function doDBWork(){
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    // use the connection here

    return true;
}
根据文件:

通过将
NULL
赋值给保存对象的变量,可以[关闭连接]。如果不显式地执行此操作,PHP将在脚本结束时自动关闭连接

因此,连接不会在函数结束时关闭,因为您没有分配
null
。虽然它是不可访问的,因为它的作用域是函数的局部,但从技术上讲,它在脚本结束之前不会关闭

注意:一般来说,我不建议在函数调用中建立和关闭数据库连接。

根据文档:

通过将
NULL
赋值给保存对象的变量,可以[关闭连接]。如果不显式地执行此操作,PHP将在脚本结束时自动关闭连接

因此,连接不会在函数结束时关闭,因为您没有分配
null
。虽然它是不可访问的,因为它的作用域是函数的局部,但从技术上讲,它在脚本结束之前不会关闭


注意:一般来说,我不建议在函数调用中建立和关闭数据库连接。

您可以将DB句柄作为参数传递给全局函数(或静态方法)。但这真的没有必要。当代码执行结束时,DB句柄将自动关闭。不需要显式关闭它

function close_connection(PDO $dbh) {
   $dbh = null;
}

可以将DB句柄作为参数传递给全局函数(或静态方法)。但这真的没有必要。当代码执行结束时,DB句柄将自动关闭。不需要显式关闭它

function close_connection(PDO $dbh) {
   $dbh = null;
}

PHP PDO为您管理连接。您可以确保将null设置为PDO连接对象时连接将关闭。但是没有必要


在您的情况下,您没有使用连接进行查询,当方法结束时,连接将关闭。

PHP PDO为您管理连接。您可以确保将null设置为PDO连接对象时连接将关闭。但是没有必要


在您的情况下,您没有使用连接进行查询,当方法结束时,连接将关闭。

严格地说,将
$dbh
设置为null不会关闭连接。这将使PDO实例符合垃圾收集的条件(只要没有对该对象的任何其他引用)。大概PDO的析构函数会清理连接


为了回答您的问题,您的示例将关闭连接(或至少以与第一个示例相同的方式操作),因为再次
$dbh
将符合垃圾收集的条件。

严格来说,将
$dbh
设置为null不会关闭连接。这将使PDO实例符合垃圾收集的条件(只要没有对该对象的任何其他引用)。大概PDO的析构函数会清理连接


为了回答您的问题,您的示例将关闭连接(或者至少以与第一个示例相同的方式操作),因为再次
$dbh
将符合垃圾收集的条件。

更好的方法可能是依赖项注入,这样您就不必打开多个连接

class MyClass {
    protected $PDO;

    public function __construct(PDO $PDO) {
        $this->PDO = $PDO;
    }

    public function DoDbWork() {
        $this->PDO->Query(); //uses same PDO instance that was supplied outside class
    }
}

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

//call multiple functions, do stuff procedurely, etc.
$t = new MyClass($dbh);
$t->DoDbWork();

$dbh = null;

更好的方法可能是依赖项注入,这样您就不必打开多个连接

class MyClass {
    protected $PDO;

    public function __construct(PDO $PDO) {
        $this->PDO = $PDO;
    }

    public function DoDbWork() {
        $this->PDO->Query(); //uses same PDO instance that was supplied outside class
    }
}

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

//call multiple functions, do stuff procedurely, etc.
$t = new MyClass($dbh);
$t->DoDbWork();

$dbh = null;

我正在编写一个数据库连接受限的脚本(由于服务器负载限制)。所以连接应该只打开一小段时间(在函数中)。因此,连接只能打开一小段时间(在函数中)。