Php 为什么在使用带有$factory的DB singleton时会出现Apache seg故障
为什么在使用$factory时会出现Apache seg故障?如何修复它 我使用PHP7和unixODBC、FreeTDS和DBLib作为驱动程序,从LinuxWeb服务器(Ubuntu和CentOS)运行代码。我一直在使用下面的DB类,它一直工作得很好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() {
<?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
?>