faqts : Computers : Programming : Languages : PHP : Database Backed Sites : MySQL

+ Search
Add Entry AlertManage Folder Edit Entry Add page to http://del.icio.us/
Did You Find This Entry Useful?

133 of 139 people (96%) answered Yes
Recently 9 of 10 people (90%) answered Yes

Entry

Can I close a persistent connection?
Are persistent connections ever closed?
What causes the error 'MySQL Connection Failed: Too many connections' ?

Jul 2nd, 1999 18:57
Nathan Wallace,


You cannot close a persistent connection in PHP.  Closing a persistent
link in a script defeats the purpose of having a persistent link. If you
want to close it, just open the connection with mysql_connect() so that
you can close it.

One persistent connection is established for each Apache child process
the first time that the database connect is called in the lifetime of
that process.  For more info about persistent connections see:

    http://www.php.net/manual/features.persistent-connections.php3

In Apache the child process only serves a certain number of requests
before it is killed and a new child started.  When the process is killed
the connection to the database that it held will be closed.  Hence, your
database connections do have a finite lifetime.

Here is an excerpt from:

    http://www.apache.org/docs/mod/core.html#maxrequestsperchild

    The MaxRequestsPerChild directive sets the limit on the number of
    requests that an individual child server process will handle. After
    MaxRequestsPerChild requests, the child process will die. If 
    MaxRequestsPerChild is 0, then the process will never expire.

    Setting MaxRequestsPerChild to a non-zero limit has two beneficial
    effects: 

      * it limits the amount of memory that process can consume by
        (accidental) memory leakage; 

      * by giving processes a finite lifetime, it helps reduce the
        number of processes when the server load reduces.

If you run an extremely high traffic site which does a lot of database
requests then you may need to be careful.  Although Apache/PHP has lost
the connection to the database and no longer uses it, MySQL does not
necessary close the connection.  Your timeout settings for httpd
processes and MySQL persistent connections need to be configured
properly.

The time the connection stays open relies on mysql settings. If you do:

    mysqladmin variables

you will see something like this:

+----------------------------+---------------------------------------+
| Variable_name              | Value                                 |
+----------------------------+---------------------------------------+
| back_log                   | 5                                     |
| connect_timeout            | 5                                     |
.
.
| max_allowed_packet         | 1048576                               |
| max_connections            | 100                                   |
| max_connect_errors         | 10                                    |
.
.
| wait_timeout               | 28800                                 |
+----------------------------+---------------------------------------+

wait_timeout is the time in seconds that a persistent connection will
wait on a new connection.  For some reason this is default to 28800 (8
hours).

If a httpd process dies and had a persistent connection, that connection
sits there for 8 hours after its last use and is eating up your
max_connections.  I have seen this render a server with heavy mysql use
inoperable.  The httpd was set to 300 seconds and the connection timeout
to 28800.  Apache processes died and did not take pconnects with them.
Basically, no new connects could be made and all the old ones did not
belong to an httpd process.

The main thing is to have your wait_timeout set lower and closer to the
timeout of your Apache Processes.