1

$db = Db::getInstance(); 创建数据库实例后,prestashop 1.6.1.3 中的数据库连接何时关闭?

我是否需要通过编写任何代码 db close 函数来手动关闭数据库连接?或者 prestashop 中的 db 类会处理这个?实际上,在 $db = Db::getInstance(); 创建 db 对象后,PrestaShop db 连接何时会关闭?

请参阅下面的代码,这是我的 prestashop 根目录中的一个简单 php 文件,用于更新我的一个表,该页面每分钟被 cron 作业任务调用一次,这里我没有在任何地方关闭连接,我们需要关闭它吗?

$CheckStatusSql = "select * from  ticket_status where item_id='$ItemID' and ticket_series='$TicketSeries' and status='BOOKED'  ";   
$db        = Db::getInstance();
$result    = $db->executeS($CheckStatusSql, false);     
$ChangeStatus ='';
while ($row = $db->nextRow($result)) {
    $status    = $row['status'];
    $booked_on = $row['booked_on'];
    $ticket_no = $row['ticket_no'];              
    $to_time   = strtotime(date("Y-m-d H:i:s"));// Time Now 
    $from_time = strtotime($booked_on); //Booked Time
    $time_diff_minutes=round(abs($to_time - $from_time) / 60,2);                
    if($time_diff_minutes>$checkMinutes){
    $ChangeStatus=$ChangeStatus."Booked ticket no: '".$ticket_no."' exceeds 30 Minutes and its now about ".$time_diff_minutes." minutes, status changed to AVAILABLE<br><br\>";
    $updateSql = "UPDATE ticket_status SET status = 'AVAILABLE', booked_on = NULL  WHERE item_id='$ItemID' and ticket_series='$TicketSeries' and status='BOOKED'  and ticket_no='$ticket_no'"; 
    $bookResult = $db->executeS($updateSql, false);
    }
}

那就是我只包括配置文件(需要'config/config.inc.php';)并创建一个数据库对象,然后执行我的查询,如下所示:

require 'config/config.inc.php';
$checkMinutes       = 30;//  In minutes
$checkTimeInSeconds = $checkMinutes*60;
$sql                = 'SELECT * FROM ps_ticket WHERE status=5';
$db                 = Db::getInstance();
$result             = $db->executeS($sql, false);   
$i=1;
while ($row = $db->nextRow($result)) {
    $time    = strtotime($row['hold_on']);
    $curtime = time();
    if(($curtime-$time) > $checkTimeInSeconds) { ///3600 seconds    
        $sql = 'UPDATE `'._DB_PREFIX_.'lopp_ticket`
        SET
        `id_customer` = 0,
        `hold_on`=0,
        `status` = 1
        WHERE  `ticket_id` = '.$row['ticket_id'];
        if(Db::getInstance()->execute($sql)) {
            echo $row['ticket_id'].'&nbsp;Updated'.'<br>';
        }
    }
    else {
        echo $row['ticket_no'].'No'.'<br>';
    }
    $i++;

}

所以在这里我需要在上面的代码中的任何地方关闭数据库连接,否则 PrestaShop 会自行处理?
因为服务器管理员说我们的代码打开了太多的数据库会话,所以还有没有办法检查太多的数据库会话总是从哪里打开/活动?

4

1 回答 1

2

据我所知,我从未在 Prestashop 中关闭过数据库连接。

那里的文档也没有明确说明关闭每个数据库请求。查看那里的源代码,他们也从不在数据库连接后运行关闭命令。

查看 classes\db\DbMySQLi.php 类,我们可以找到下面的函数。

/**
 * Destroys the database connection link.
 *
 * @see DbCore::disconnect()
 */
public function disconnect()
{
    @$this->link->close();
}

然后我们将查看 classes\db\Db.php,我们发现该函数$this->disconnect()被调用。所以可以肯定地说他们会自动关闭所有数据库连接。

/**
 * Closes connection to database.
 */
public function __destruct()
{
    if ($this->link) {
        $this->disconnect();
    }
}
于 2021-05-01T10:25:49.197 回答