0

5分ごとに次のスクリプトを実行するcronジョブがあります。ただし、スクリプトは実行後に接続を閉じないようです。このスクリプトで接続を閉じるにはどうすればよいですか?

function __construct($config)
{
    $this->server = $config['server'];
    $this->certificate = $config['certificate'];
    $this->passphrase = $config['passphrase'];

    // Create a connection to the database.
    $this->pdo = new PDO(
        'mysql:host=' . $config['db']['host'] . ';dbname=' . $config['db']['dbname'], 
        $config['db']['username'], 
        $config['db']['password'],
        array());

    // If there is an error executing database queries, we want PDO to
    // throw an exception.
    $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // We want the database to handle all strings as UTF-8.
    $this->pdo->query('SET NAMES utf8');
}

// This is the main loop for this script. It polls the database for new
// messages, sends them to APNS, sleeps for a few seconds, and repeats this
// forever (or until a fatal error occurs and the script exits).
function start()
{
    writeToLog('Connecting to ' . $this->server);

    if (!$this->connectToAPNS())
        exit;

    while (true)
    {
        // Do at most 20 messages at a time. Note: we send each message in
        // a separate packet to APNS. It would be more efficient if we 
        // combined several messages into one packet, but this script isn't
        // smart enough to do that. ;-)

        $stmt = $this->pdo->prepare('SELECT * FROM messages WHERE time_sent IS NULL LIMIT 20');
        $stmt->execute();
        $messages = $stmt->fetchAll(PDO::FETCH_OBJ);

        foreach ($messages as $message)
        {
            if ($this->sendNotification($message->id, $message->token, $message->payload))
            {
                $stmt = $this->pdo->prepare('UPDATE messages SET time_sent = NOW() WHERE id = ?');
                $stmt->execute(array($message->id));
            }
            else  // failed to deliver
            {
                $this->reconnectToAPNS();
            }
        }

        unset($messages);           
        sleep(5);
    }
}
4

1 に答える 1

1

読み間違えたかもしれませんが、5 分ごとに終了しないスクリプト (無限ループ) を起動しているようです。そのため、Earth (またはより控えめに言えば、サーバー) が最終的に爆発するまで、インスタンスをスタックしています。

あなたの質問に答えるために、スクリプトの実行が終了すると、PHP は DB 接続を含むすべてのリソースを自動的に解放します。

スクリプトが非常に長い時間 (無限など) 実行される場合、または非常に特定のメモリに関する考慮事項がある場合、unset($foo)または$foo = null.[1]を使用してリソースを手動で解放できます。

DB接続もこの方法で閉じたり解放したりできますunset($this->pdo).


[1] PHP でメモリを解放する際の優れている点: unset() または $var = nullも参照してください。

于 2013-03-11T01:49:04.857 に答える