From: fjortiz at comunet dot es
Operating system: Win2K Server
PHP version: 5.0.4
PHP Bug Type: Apache2 related
Bug description: PHP5+OLEDB(COM)+IIS pools DB connections,
PHP5+OLEDB(COM)+Apache2 does not!
Description:
------------
Ok, this seems a tricky one, so sorry for the long post. It's related to
the way Apache2 and IIS work with COM objects. So maybe some combined
Apache2/IIS/Database/COM skills are needed.
I want to connect to a DB (MSSQL in this case), but I need some features
unavailable under php_mssql (asked to F. Kromman, thanks). So I'm forced
to use COM/OLEDB via ADODB.Connection. COM works great now under PHP5
but...
I have this problem:
If I use this combination:
PHP5+OLEDB(COM)+IIS: IIS keeps a pool of persistent connections so the
next PHP scripts re-use this open connection and doesn't have to open a
new one.
PHP5+OLEDB(COM)+Apache2: Apache2 works fine with the queries but at the
end of my PHP script, the connection is closed, and every subsecuent PHP
script has to open a new connection.
It's not a critical issue as long as your DB server is on the same machine
as the Web Server:
Open new connection on Apache2: 0.02 secs.
Re-use existing connection on IIS: 0.002 secs.
But it does matter if both are on different machines and/or while on very
heavy traffic web-sites.
My theory: not a COM guru, but maybe Apache2 lacks being compiled with
some COM Apartment threading model which IIS already has. I'm really sad
about being impelled to work with this COM/OLEDB shit but I'd really like
to get this working on PHP5+Apache2 (will have to swap to PHP5+IIS if
there is no way to solve this).
Thanks in advance
Reproduce code:
---------------
<?
// Win32, need MDAC and a SQL Server
$HOST = "your-sql-server";
$USER = "user";
$PASS = "pwd";
$DB = "database";
$dsn = "Provider=SQLOLEDB;Data Source=$HOST;User
Id=$USER;Password=$PASS;Initial Catalog=$DB";
$charPage = CP_UTF8;
$db = new COM("ADODB.Connection", NULL, $charPage);
$db->Open($dsn);
// sample query to get all the SQL Server processes for your Database,
along with the App that created them
// (Apache, IIS, others...)
$query="select distinct sd.name, sp.program_name from master..sysprocesses
sp
inner join master..sysdatabases sd on sd.dbid=sp.dbid
where sd.name='$DB'
order by 1,2";
$rs = $db->Execute($query);
// some output
print "<table border=1>";
while (!$rs->EOF) {
print
"<tr><td>".$rs->Fields["program_name"]->Value."</td><td>".$rs->Fields["name"]->Value."</td></tr>\n";
$rs->MoveNext();
}
print "</table>";
$db->Close(); // doesn't really matter, IIS keeps connection open,
Apache2 closes it even if this line is commented
?>
Expected result:
----------------
We list all the SQL Server open processes, during and after PHP script
execution:
select distinct sd.name, sp.program_name from master..sysprocesses sp
inner join master..sysdatabases sd on sd.dbid=sp.dbid
where sd.name='nc208'
order by 1,2
While executing PHP5+Apache2:
database Apache HTTP Server
database SQL Query Analyzer
database SQL Query Analyzer - Object Browser
When PHP script ends:
database SQL Query Analyzer
database SQL Query Analyzer - Object Browser
PHP5+Apache2 CLOSES CONNECTION --> not there when script finishes.
While executing the same on PHP5+IIS:
database Internet Information Services
database SQL Query Analyzer
database SQL Query Analyzer - Object Browser
When PHP script ends:
database Internet Information Services
database SQL Query Analyzer
database SQL Query Analyzer - Object Browser
PHP5+IIS KEEPS CONNECTION OPEN for re-use --> at least for 60 seconds,
which is a default OLEDB driver setting I think.
--
Edit bug report at http://bugs.php.net/?id=33681&edit=1
--
Try a CVS snapshot (php4): http://bugs.php.net/fix.php?id=33681&r=trysnapshot4
Try a CVS snapshot (php5.0):
http://bugs.php.net/fix.php?id=33681&r=trysnapshot50
Try a CVS snapshot (php5.1):
http://bugs.php.net/fix.php?id=33681&r=trysnapshot51
Fixed in CVS: http://bugs.php.net/fix.php?id=33681&r=fixedcvs
Fixed in release: http://bugs.php.net/fix.php?id=33681&r=alreadyfixed
Need backtrace: http://bugs.php.net/fix.php?id=33681&r=needtrace
Need Reproduce Script: http://bugs.php.net/fix.php?id=33681&r=needscript
Try newer version: http://bugs.php.net/fix.php?id=33681&r=oldversion
Not developer issue: http://bugs.php.net/fix.php?id=33681&r=support
Expected behavior: http://bugs.php.net/fix.php?id=33681&r=notwrong
Not enough info:
http://bugs.php.net/fix.php?id=33681&r=notenoughinfo
Submitted twice:
http://bugs.php.net/fix.php?id=33681&r=submittedtwice
register_globals: http://bugs.php.net/fix.php?id=33681&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=33681&r=php3
Daylight Savings: http://bugs.php.net/fix.php?id=33681&r=dst
IIS Stability: http://bugs.php.net/fix.php?id=33681&r=isapi
Install GNU Sed: http://bugs.php.net/fix.php?id=33681&r=gnused
Floating point limitations: http://bugs.php.net/fix.php?id=33681&r=float
No Zend Extensions: http://bugs.php.net/fix.php?id=33681&r=nozend
MySQL Configuration Error: http://bugs.php.net/fix.php?id=33681&r=mysqlcfg