ID:               33681
 Updated by:       [EMAIL PROTECTED]
 Reported By:      fjortiz at comunet dot es
-Status:           Assigned
+Status:           Bogus
 Bug Type:         COM related
 Operating System: Win2K Server
 PHP Version:      5CVS-2005-07-13
 Assigned To:      wez
 New Comment:

This isn't really a PHP bug.  It's more of an Apache bug, but even
then, it's not really Apaches fault either.

Assuming that the OLE DB stuff is actually routing out over ODBC, then
connection pooling much be explicitly enabled in the application by
making a couple of ODBC API calls.  Nothing in the PHP core nor in
Apache does this for you, because it can't possibly know that it
should.

I'm going to suggest a workaround for you; if it doesn't work, then
there is nothing more we can do to help.

Possible Workaround - load the PDO ODBC driver.
Using the latest PHP 5.1 snap (the one you have already will do):

Edit your php.ini file and add this line
extension=php_pdo_odbc.dll

Restart apache and re-run your tests

Why might this work? the php_pdo_odbc.dll makes the API calls that
enable connection ODBC pooling.

If it doesn't work, you can try migrating your script to use PDO and
the odbc driver itself.




Previous Comments:
------------------------------------------------------------------------

[2005-07-13 19:04:32] [EMAIL PROTECTED]

Assigned to the maintainer.


------------------------------------------------------------------------

[2005-07-13 18:23:02] fjortiz at comunet dot es

tried with latest version (5.1.0-dev) on Win32 but still the same.
Sorry.

------------------------------------------------------------------------

[2005-07-13 17:54:23] [EMAIL PROTECTED]

Please try using this CVS snapshot:

  http://snaps.php.net/php5-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5-win32-latest.zip



------------------------------------------------------------------------

[2005-07-13 17:06:44] fjortiz at comunet dot es

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 this bug report at http://bugs.php.net/?id=33681&edit=1

Reply via email to