Php 为什么在使用带有$factory的DB singleton时会出现Apache seg故障

Php 为什么在使用带有$factory的DB singleton时会出现Apache seg故障,php,linux,apache,pdo,unixodbc,Php,Linux,Apache,Pdo,Unixodbc,为什么在使用$factory时会出现Apache seg故障?如何修复它 我使用PHP7和unixODBC、FreeTDS和DBLib作为驱动程序,从LinuxWeb服务器(Ubuntu和CentOS)运行代码。我一直在使用下面的DB类,它一直工作得很好 <?php class DB { private static $factory; private $database; public static function getFactory() {

为什么在使用$factory时会出现Apache seg故障?如何修复它

我使用PHP7和unixODBC、FreeTDS和DBLib作为驱动程序,从LinuxWeb服务器(Ubuntu和CentOS)运行代码。我一直在使用下面的DB类,它一直工作得很好

<?php
class DB {
    private static $factory;
    private $database;

    public static function getFactory() {
        // if (!self::$factory) {
        if (!static::$factory) {
            static::$factory = new DB();
        }
        return static::$factory;
    }

    public function getConnection() {
        if (!$this->database) {
            try {
                $options = array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
                $this->database = new PDO('dblib:host=localhost;dbname=DB_NAME;port=3306;charset=utf8', 'DB_USER', 'DB_PASS', $options);
            } catch (PDOException $e) {
                echo 'Error code: ' . $e->getCode();
                exit;
            }
        }
        return $this->database;
    }
}// end of class
?>

以下查询运行时没有问题

<?php
$db = DB::getFactory()->getConnection();
$sql = "INSERT INTO ".Config::get('TBL_PREFIX')."resourceTypes (name) VALUES (:name)";
$query = $db->prepare($sql);
$query->execute(array(':name' => $name));
die('query complete.');
?>

但是,当我决定使用PDO的beginTransaction()时,下面的查询失败,Apache抛出一个seg错误([core:notice][pid 1219]AH00051:child pid 31779 exit signal Segmentation fault(11),可能是coredump in/etc/apache2)。下面是使用beginTransaction()的代码


如果我修改我的DB类,使其看起来像下面的代码,上面的查询将在没有seg故障的情况下工作

<?php
class DB {
    private static $database;

    public static function getConnection() {
        if (!Self::$database) {
            try {
                $options = array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
                Self::$database = new PDO('dblib:host=localhost;dbname=DB_NAME;port=3306;charset=utf8', 'DB_USER', 'DB_PASS', $options);
            } catch (PDOException $e) {
                echo 'Error code: ' . $e->getCode();
                exit;
            }
        }
        return Self::$database;
    }
}// End of class
?>

问题是什么

为什么工厂在Apache中创建seg故障


最重要的是,我如何以正确的方式更正此问题?

检查
$db->beginTransaction()
的返回值是真是假?我无法获得返回值,seg故障一经调用就会发生。请向Apache提交错误报告?
<?php
class DB {
    private static $database;

    public static function getConnection() {
        if (!Self::$database) {
            try {
                $options = array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
                Self::$database = new PDO('dblib:host=localhost;dbname=DB_NAME;port=3306;charset=utf8', 'DB_USER', 'DB_PASS', $options);
            } catch (PDOException $e) {
                echo 'Error code: ' . $e->getCode();
                exit;
            }
        }
        return Self::$database;
    }
}// End of class
?>