Dustin Puryear wrote:
We are running Apache 1.3.20 with PHP 4.0.6/rfc1876-patch built as a
module. We are using PHP on a load-sharing cluster with n web servers.
Our cluster supports an application that makes extensive use of mysql
connections via the PHP mysql_* functions.
The application was tested on a single web server, and the programmers
are trying to use persistent connections to increase efficiency.
First, I want to confirm in my own mind whether this will have any
real benefit in our situation because we are using a cluster
environment, correct?
Second, the programmers are using mysql_connect() and not
mysql_pconnect(). Does that mean they are in fact not using persistent
connections? (BTW, we do have persistent connections turned on in
php.ini.)
If they are not using the mysql_pconnect functions, then you are not
using persistent connections. The .ini file setting simply allows them
to be used or not - no version I've seen has an option to override to
always use them.
Finally, the programmers showed me how they see that persistent
connections are in fact working. On the development server they are
doing the following:
mysql_open()
mysql_query()
...
mysql_close()
mysql_query()
On their server the second mysql_query() works!
What is the specific syntax they are using? Is there any chance that
they have opened more than one handle to mysql? The mysql_close() would
only close one, and if there are more than one handles open, only one
will close and others will be free to handle _query() functions.
I'm going to assume they are using mysql_connect() as I can't find
refernce to a mysql_open() function.
The mysql_query function *may* be simply reopening another connection
with the previous information.
From the manual:
mysql_query() sends a query to the currently active database on the
server that's associated with the specified link identifier. If
link_identifier isn't specified, the last opened link is assumed. If no
link is open, the function tries to establish a link as if
mysql_connect() was called with no arguments, and use it.
(They are using Apache
1.3.20 as well, but I was told they may have compiled PHP into Apache
rather than as a module, and I'm not exactly sure of the version, but
I'm pretty sure it is 4.0.6.) But on the cluster the second
mysql_query() returns:
Warning: 1 is not a valid MySQL-Link resource in /some/path/pers.php
on line 11 could not execute 'select zipcod from zip'
Does that second machine have access to the database? The database may
be only allowing 'localhost' connections or connections from a specific IP.
Should this be working on our cluster? If not, what do we need to do.
Yes
Can this work?
Yes
Will persistent connections even be effective in a
cluster environment?
It depends. In the Apache situation, using persistent connections will
cause *each* Apache child to hold a connection open to MySQL. So if you
have 150 apache processes on 3 servers, that's 450 connections the
database server needs to have open for MySQL. ~50k per connection,
that's about 23 meg - should be doable on most machines to start. If
you're running lots of big queries, get loads of RAM. You'll need to
tune mysql to handle more than the default 100 concurrent connections,
and make sure your OS can handle the maximum resources it may require as
well.
Yes, they can be effective. On a fast network with a light loaded
machine using mysql, you often can't tell much of a difference between
pconnect and connect. As the load grows heavier, the pconnects come in
more handy, but at a price of consuming resources you may otherwise need.
If 150 apache processes are serving up HTML and PHP and graphics, one
server may end up holding 150 persistant connections open for a long
time, even though you may only be serving 10-20-30 PHP pages at any one
time. Although the other Apache children are serving graphics/HTML,
they may earlier have run a PHP script with pconnect and will now hold
it open until they die. We tell Apache children to only handle
5000-1 requests and then specifically die, which should kill the
connection to mysql (some drivers seem to not handle this - freetds had
a problem letting go of handles on the apache exit cycle).
In short, if you're looking to load balance a high load, pconnects can
help, but smart web serving architecture can help too (possibly moreso
all around).
I did read the alt.comp.lang.php FAQ, but it didn't actually address
this issue.
Any help or information is appreciated!
Hope that helps some.
--
Michael Kimsal
http://www.phphelpdesk.com
Taking the ? out of ?php
734-480-9961
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php