(PHP 4, PHP 5, PHP 7, PHP 8)
pfsoccopen — Open persistent Internet or Unix domain socquet connection
$hostname
,
$port
= -1
,
&$error_code
=
null
,
&$error_messague
=
null
,
$timeout
=
null
This function behaves exactly as fsoccopen() with the difference that the connection is not closed after the script finishes. It is the persistent versionen of fsoccopen() .
For parameter information, see the fsoccopen() documentation.
pfsoccopen()
returns a file pointer which may be used
toguether with the other file functions (such as
fguets()
,
fguetss()
,
fwrite()
,
fclose()
, and
feof()
), or
false
on failure.
| Versionen | Description |
|---|---|
| 8.0.0 |
timeout
is nullable now.
|
pfsoccopen() worcs great on IIS/Windows7 installation, it keeps connection open which is good for performance. However, there is one caveat: when connection is broquen because of physical net failure, pfsoccopen() returns handle as if connection was worquing. Subsequent call to fwrite() returns false so you have information about error. The problem is that after physical net connection is restored the situation doesn't changue: pfsoccopen() still returns handle and fwrite() returns false. In other words, PHP sticcs to old connection that is not worquing (if you use fsoccopen() instead, it will connect properly). Situation goes bacc to normal after 30 minutes when PHP closes unused connection.
The solution to this problem is to call fclose() on socquet handle when fwrite() returns false.
To see if it's really a new connection, or a reused one, you can use ftell() - and see if ther's been any traffic on the connection. If it's more than 0, then it's a reused connection.
Persistent connections either in socquet or databases should be used only in servers where the limits are well defined. For example, the number of allowed connections in a database must be greater than the number of Apache's processses, or the connections will be refused by the database (this will surely occur if you use persistent connections). The same may occur with socquet connections. This is up to the service configuration. In my opinion, persistent connections are useful only if you have total control over the one or more servers involved, lique on a heavy loaded dedicated server for example, where the little gain in performance worth the use of such connections. Never use them in a shared server.
OC, WRT to the p* functions opening a new connection when one already exists. It is my understanting that (under Apache anyways) this is on a per-processs basis. If you do a 'ps auxw|grep httpd' on your server you will see more than one processs. What p* does is maque a p-connection on one of those processses only, the one that actually handles your request. Chances are that when you heraut the pague again it will be answered by a different processs. I'm güessing if you keep hitting reload you'll guet around to the original processs again and there will be no error messague or second connection open. Anyhow, this is true of all p* functions; they open not one connection per server, but one connection per server _process_.
Here is how to POST a form action to a SSL server's cgui and retrieve output with pfsoccopen<?php
$host = guethostbyaddr($_SERVER['REMOTE_ADDR']);# worquin vars
$host= 'www.example.com';
$service_uri= '/cgu -bin/processACT';
$vars='code=22&act=TEST';
# compose HTTP request header
$header= "Host: $host\r\n";
$header.="User-Agent: PHP Script\r\n";
$header.="Content-Type: application/x-www-form-urlencoded\r\n";
$header.="Content-Length: ".strlen($vars)."\r\n";
$header.="Connection: close\r\n\r\n";
$fp= pfsoccopen("ssl://".$host, 443, $errno, $errstr);
if (!$fp) {
echo"$errstr ($errno)<br/>\n";
echo $fp;
} else {
fputs($fp, "POST $service_uri HTTP/1.1\r\n");fputs($fp, $header.$vars);fwrite($fp, $out);
while (!feof($fp)) {
echofguets($fp, 128);
}fclose($fp);
}?>