【问题标题】:PDO not closing databasePDO 不关闭数据库
【发布时间】:2015-03-26 00:16:10
【问题描述】:

我在保持连接的 PDO 数据库连接方面遇到了一些小问题。

我正在运行的代码正在向 twitter 自动发布一些帖子。 我每小时通过 CRON 运行一次代码,但为了节省一次性将所有消息发布到 twitter,我在每个循环后使用 sleep()。

这 (sleep()) 导致数据库连接保持打开状态,直到脚本完成运行。 为了尝试阻止这种情况,我添加了各种方法来“强制关闭”连接,但它们似乎都不起作用。 返回结果后就不需要连接了。

下面是我正在使用的代码(为这篇文章做了一点简化)

$escort_obj = new MLE_Escort();
if($result = $escort_obj->getRandomEscortsSearch($limit = 5)){

    foreach ($result AS $row) {

        // set the data we need //

        // assign image
        $image = '..'.$row->PhotoURL;

        // build tags
        $tags = '#Escorts ';
        if(!empty($row->InCallLocation)) {
            $tags .=  '#'.str_replace(' ', '', $row->InCallLocation).' ';
        }

        // join the data into the $tweet
        $tweet =  strip_tags($row->Description).' '.$tags;

        // call function to post to twitter
        postToTwitter($image, $tweet, $tmhOAuth);

        sleep(500); // sleep a while
    }
}

带有查询的类文件(提取)

    /*
     * get random profiles for posting to twitter
     * @return result of the mySQL query
     */
    public function getRandomEscortsSearch($limit)
    {
        try
        {

            $query = "SELECT 
                        e.EscortID,
                        e.EscortName,
                        e.DateModified,         
                        LEFT(e.InCallLocation, 25) AS InCallLocation,
                        e.InCallLocation AS FULLInCallLocation,
                        e.HairColour,
                        LEFT(e.EscortProfile, 85) AS Description,
                        p.PhotoURL
                        FROM tEscort e
                        INNER JOIN (tEscortPhoto ep INNER JOIN tPhoto p ON (ep.tPhoto_PhotoID = p.PhotoID AND p.Enabled=1)) 
                            ON e.EscortID = ep.tEscort_EscortID AND ep.ProfilePhoto = 1
                        INNER JOIN tUser u ON u.UserName = e.PrivateEmail
                        INNER JOIN tmembers m ON m.tUser_UserID = u.UserID
                        WHERE e.Enabled = 1
                        AND e.Active = 1
                        AND m.tMemberStatuses_MemberStatusID = 2
                        AND e.tEscortMembership_MembershipID != 6
                        ORDER BY rand()
                        LIMIT ?";       
            $stmt = $this->conn->prepare($query);
            $stmt->execute(array($limit));
            $result = $stmt->FetchAll(PDO::FETCH_OBJ);
            $this->conn = NULL; // force close DB
            $stmt = NULL; // empty $stmt
            $dbPDO = NULL; // force close this too in case it was open
            return $result; // return reults
        }
        catch (PDOException $ex) {
            // do some stuff (removed to keep this question clean)
            return false;
        }
    }

任何关于我如何做我想做的事但在查询运行后关闭连接的建议,将不胜感激! 谢谢!

【问题讨论】:

标签: php mysql pdo


【解决方案1】:

如果你不这样做,这并不是那么严重。成功连接到数据库后,PDO 类的实例将返回到您的脚本。该连接在该PDO 对象的生命周期内保持活动状态。要关闭连接,您需要通过确保删除对它的所有剩余引用来销毁该对象——您通过将 NULL 分配给保存该对象的变量来做到这一点。如果您没有明确地这样做,PHP 将在您的脚本结束时自动关闭连接。

http://php.net/manual/en/pdo.connections.php

所以答案是否定的,除非您出于某种原因需要在脚本执行期间显式关闭连接,否则您无需执行任何操作,在这种情况下,只需将您的 PDO 对象设置为 null

【讨论】:

  • 我也是这么想的。但是,请查看您链接到的文档页面上“Vicente”的评论 (php.net/manual/en/pdo.connections.php)
  • 是否将结果分配给 $result 仍归类为需要分配 NULL 的对象?问题是我在循环中仍然需要 $result
  • 我也不认为这是一个问题,但主机建议它导致数据库服务器没有响应......我不相信这是原因,但我必须先修复它证明自己
  • hmn.. 如果您能够从连接中提取数据,您应该能够关闭它。例如,如果您有 $link = new PDO("mysql:dbname=$dbname;host=$servername",$username,$password);作为一个连接,你应该能够做到 $link = null;关闭连接。
  • @unixmiah。在我这样做之后我无法重新连接(如你所说) $link = NULL;但是从以前的连接来看,数据库连接仍然是“活动的”(我假设)。我可以在 MySQL Administrator 中看到连接处于“活动状态”。一旦脚本完成,它就会关闭。我尝试将 SQL 结果分配给带有 foreach 循环和 $result_arr[] = $row... 的数组,但在脚本完成之前,连接再次保持“活动”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 2018-05-18
  • 2020-12-24
  • 2022-01-02
  • 2014-11-05
相关资源
最近更新 更多