Description

mssql_pconnect() acts very much like
mssql_connect() with two major differences.

First, when connecting, the function would first try to find a
(persistent) link that's already open with the same host,
username and password. If one is found, an identifier for it
will be returned instead of opening a new connection.

Second, the connection to the SQL server will not be closed when
the execution of the script ends. Instead, the link will remain
open for future use (mssql_close() will not
close links established by mssql_pconnect()).

This type of links is therefore called 'persistent'.

Parameters

servername

The MS SQL server. It can also include a port number. e.g.
hostname:port.

username

The username.

password

The password.

new_link

If a second call is made to mssql_pconnect() with
the same arguments, no new link will be established, but instead, the
link identifier of the already opened link will be returned. This
parameter modifies this behavior and makes
mssql_pconnect() always open a new link, even if
mssql_pconnect() was called before with the same
parameters.

- if you restart MSSQL server while some of the connections did not time out, next pconnect() will not establish a new connection! It will return an old one, so next time you do execute() or query() your script will just _hang_ until timeouted by Apache.

All of the above I believe are FreeTDS problems, not PHP. I wonder if somebody with PHP+Sybase lib got pconnect to work.

I suspect mssql_pconnect detects a connect opened to "production-server" and just re-uses it, regardless of whether or not the credentials are the same. We did not notice this until consolidating two different MSSQL servers onto one server with two databases with different users/permissions. Reverting back to mssql_connect() solves the problem.

Please note that mssql_pconnect creates a connection for the pool for *each process*. If you have "ThreadsPerChild" set to 50 in apache, and mssql.max_procs set to 25 in php, then eventually you will get mssql_pconnect failing to give you a connection to the database. This has stumped me for quite a while, and the answer finally presented itself thanks to the people in #php.