PDO/MySQL/PHP/OSX:MySQL服务器在后续查询中消失了?

PDO/MySQL/PHP/OSX:MySQL服务器在后续查询中消失了?,php,mysql,macos,pdo,Php,Mysql,Macos,Pdo,我认为这是代码中的一个问题,但代码太简单了,我不确定它可能是什么 我已经验证了wait_timeout足够高,并且已经完成了这里的所有工作:没有任何成功 这在一个脚本运行中执行的第二个查询中重复发生,因此我确信这是一个编码错误 我围绕PDO类创建了一个非常简单的包装器,以拥有一个单例数据库句柄: <?php class PDOWrapper { protected static $instance; protected $dbh; function __cons

我认为这是代码中的一个问题,但代码太简单了,我不确定它可能是什么

我已经验证了wait_timeout足够高,并且已经完成了这里的所有工作:没有任何成功

这在一个脚本运行中执行的第二个查询中重复发生,因此我确信这是一个编码错误

我围绕PDO类创建了一个非常简单的包装器,以拥有一个单例数据库句柄:

<?php

class PDOWrapper
{
    protected static $instance;
    protected $dbh;

    function __construct()
    {
        if ( is_null(static::$instance) )
        {
            static::$instance = $this;
            $this->connect_to_db();
        }
    }

    static function instance()
    {
        if ( is_null(static::$instance) )
        {
            new static;
        }

        return static::$instance;
    }

    private function connect_to_db()
    {
        $db_info = array(
            0 => array(
                'hostname' => "Host",
                'username' => "User",
                'password' => "Pass",
                'db' => "DB",
            )
        );

        //Try to connect to the database
        try 
        {
            $dbh = new PDO('mysql:host=' . $db_info[0]['hostname'] . ';dbname=' . $db_info[0]['db'], $db_info[0]['username'], $db_info[0]['password'], array( PDO::ATTR_PERSISTENT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => true ));
        }
        catch (PDOException $e)
        {
            log_message("Error connecting to DB!: " . $e->getMessage(), LOG_LEVEL_CRITICAL );
            return false;
        }

        $this->dbh = $dbh;
    }

    public static function get_dbh()
    {
        if ( is_null(static::$instance) )
        {
            new static;
        }

        return static::$instance->dbh;
    }
}
作为事件循环的一部分,我反复调用此函数。第一次调用它时,print\r运行良好,它打印出我希望看到的行

但是,在函数执行一次后,我得到以下结果:

Warning: Error while sending QUERY packet. PID=92871
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2006 MySQL server has gone away'
我不知道为什么它会“消失”。我的.cnf看起来不错。等待超时非常大,不管怎样,只要我运行第二个查询,这种情况就会立即发生。有什么想法吗

MySQL错误日志中似乎没有任何明显的错误:

120925 12:48:46 mysqld_safe Starting mysqld daemon with databases from /usr/local/var/mysql
120925 12:48:46 [Warning] The syntax '--log' is deprecated and will be removed in a future release. Please use '--general-log'/'--general-log-file' instead.
120925 12:48:46 [Warning] Setting lower_case_table_names=2 because file system for /usr/local/var/mysql/ is case insensitive
120925 12:48:46 InnoDB: The InnoDB memory heap is disabled
120925 12:48:46 InnoDB: Mutexes and rw_locks use GCC atomic builtins
120925 12:48:46 InnoDB: Compressed tables use zlib 1.2.5
120925 12:48:46 InnoDB: Initializing buffer pool, size = 128.0M
120925 12:48:46 InnoDB: Completed initialization of buffer pool
120925 12:48:46 InnoDB: highest supported file format is Barracuda.
120925 12:48:46  InnoDB: Waiting for the background threads to start
120925 12:48:47 InnoDB: 1.1.8 started; log sequence number 2273680401
120925 12:48:47 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
120925 12:48:47 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
120925 12:48:47 [Note] Server socket created on IP: '0.0.0.0'.
120925 12:48:47 [Note] Event Scheduler: Loaded 0 events
120925 12:48:47 [Note] /usr/local/Cellar/mysql/5.5.25a/bin/mysqld: ready for connections.
Version: '5.5.25a-log'  socket: '/tmp/mysql.sock'  port: 3306  Source distribution
我想出来了

我正在使用
pcntl\u fork
开发一个多进程守护程序。父进程负责运行一个循环来查询数据库,并根据所看到的数据,派生子进程来执行额外的工作

孩子们不需要DB连接,但是因为使用了
pcntl_fork
,他们仍然得到了DB连接。我只是使用
exit()
在子进程完成工作时杀死它们,这导致“友好”PHP清理关闭它认为子进程具有的活动MySQL连接

控件将返回到父级,当父级尝试在数据库中查找更多数据以发送给子级时,会发现其DB连接突然失效

对我来说,修复方法是使用
posix_kill(getmypid(),9)
杀死孩子,而不是
退出()

我想出来了

我正在使用
pcntl\u fork
开发一个多进程守护程序。父进程负责运行一个循环来查询数据库,并根据所看到的数据,派生子进程来执行额外的工作

孩子们不需要DB连接,但是因为使用了
pcntl_fork
,他们仍然得到了DB连接。我只是使用
exit()
在子进程完成工作时杀死它们,这导致“友好”PHP清理关闭它认为子进程具有的活动MySQL连接

控件将返回到父级,当父级尝试在数据库中查找更多数据以发送给子级时,会发现其DB连接突然失效


对我来说,修复方法是使用
posix_kill(getmypid(),9)
杀死孩子,而不是
退出()

查看您的
log error=/var/log/mysql/mysqld.err
您是否运行InnoDB引擎?如果省略closeCursor()调用会发生什么?ethrbunny--同样的事情,我把它放在那里是因为有人提出了另一个问题。CappY——该日志文件不存在。我正在使用InnoDB,请在my.conf中查看您的路径。搜索
log error
CappY——该日志只包含MySQL初创公司。编辑问题以包括启动日志…请参阅您的
log error=/var/log/mysql/mysqld.err
是否运行InnoDB引擎?如果省略closeCursor()调用会发生什么?ethrbunny--同样的事情,我将其放在那里,因为有人在另一个问题上建议了它。CappY——该日志文件不存在。我正在使用InnoDB,请在my.conf中查看您的路径。搜索
log error
CappY——该日志只包含MySQL初创公司。编辑的问题,包括启动日志…这是如此有用,并解决了一个真正烦人的问题,为我们!谢谢!:-)这非常有帮助,为我们解决了一个非常恼人的问题!谢谢!:-)
120925 12:48:46 mysqld_safe Starting mysqld daemon with databases from /usr/local/var/mysql
120925 12:48:46 [Warning] The syntax '--log' is deprecated and will be removed in a future release. Please use '--general-log'/'--general-log-file' instead.
120925 12:48:46 [Warning] Setting lower_case_table_names=2 because file system for /usr/local/var/mysql/ is case insensitive
120925 12:48:46 InnoDB: The InnoDB memory heap is disabled
120925 12:48:46 InnoDB: Mutexes and rw_locks use GCC atomic builtins
120925 12:48:46 InnoDB: Compressed tables use zlib 1.2.5
120925 12:48:46 InnoDB: Initializing buffer pool, size = 128.0M
120925 12:48:46 InnoDB: Completed initialization of buffer pool
120925 12:48:46 InnoDB: highest supported file format is Barracuda.
120925 12:48:46  InnoDB: Waiting for the background threads to start
120925 12:48:47 InnoDB: 1.1.8 started; log sequence number 2273680401
120925 12:48:47 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
120925 12:48:47 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
120925 12:48:47 [Note] Server socket created on IP: '0.0.0.0'.
120925 12:48:47 [Note] Event Scheduler: Loaded 0 events
120925 12:48:47 [Note] /usr/local/Cellar/mysql/5.5.25a/bin/mysqld: ready for connections.
Version: '5.5.25a-log'  socket: '/tmp/mysql.sock'  port: 3306  Source distribution