IIS 7.5, PHP 5.3.2 NTS VC9 (FastCGI), SQL Server Driver for PHP 2.0 Решил обернуть API SQLSRV по принципу PDO (в последнем пока нет поддержки PHPTYPE_STREAM, да и процедурку не пульнуть - пришлось отказаться от использования), однако возникает ошибка. Класс, сбоящий при высвобождении ресурсов: PHP: <?php class DB_SQLSRV_Statement { private $rid; # Идентификатор ресурса. public function __construct($rid) { $this->rid = $rid; echo gettype($this->rid); # тип resource } public function __destruct() { echo gettype($this->rid); # тип unknown, однако значение сохраняется - Resource #12 exit; // Сбор мусора должен приводить к высвобождению ресурсов. // Ошибка: 12 is not a valid ss_sqlsrv_stmt resource. // sqlsrv_free_stmt($this->rid); } } ?> Фабрика: PHP: <?php // Обёртка для API php_sqlsrv.dll // abstract class DB_SQLSRV_Connector { private static $lid; # Идентификатор соединения с базой данных. // Конструкторы и вспомогательные методы опущены для краткости. final public function query($tsql, array $params = array(), array $options = array()) { if($rid = sqlsrv_query(self::$lid, $tsql, $params, $options)) { return new DB_SQLSRV_Statement($rid); } else self::error(); } final public static function error() { if($error = current(sqlsrv_errors())) throw new DB_Exception($error['message'], $error['code']); } } ?> Обёртка, позволяющая сменить коннектор в проекте: PHP: <?php class DB_Manager extends DB_SQLSRV_Connector { final public static function getInstance() { static $instance = null; # Статический экземпляр существующего соединения. $classname = get_called_class(); return $instance ?: $instance = new $classname(); } } ?> Вызов: PHP: <?php $db = DB_Manager::getInstance(); $stmt = $db->query('SELECT 1 AS sample'); # Передаётся в лапы GC, возникает ошибка. ?> Вариант с обёрнутым PDO (библиотека на C от Microsoft), разница только в возвращаемых классах: PHP: <?php $db = DB_Manager::getInstance(); # Возвращается экземпляр PDO $stmt = $db->query('SELECT 1 AS sample'); # Возвращается экземпляр PDOStatement. ?>