PHP Doku:: Öffnet eine persistente Verbindung zum Internet oder zu einem Unix-Domainsocket - function.pfsockopen.html

Verlauf / Chronik / History: (1) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzSonstige DiensteNetworkNetzwerk-Funktionenpfsockopen

Ein Service von Reinhard Neidl - Webprogrammierung.

Netzwerk-Funktionen

<<openlog

setcookie>>

pfsockopen

(PHP 4, PHP 5)

pfsockopenÖffnet eine persistente Verbindung zum Internet oder zu einem Unix-Domainsocket

Beschreibung

resource pfsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )

Diese Funktion verhält sich genauso wie fsockopen() mit dem Unterschied, dass die Verbindung nicht geschlossen wird, wenn das Script beendet wird. Sie ist die permanente Version von fsockopen().

Parameter-Liste

Bitte schlagen Sie für Informationen über die Parameter in der Dokumentation der Funktion fsockopen() nach.

Siehe auch

  • fsockopen() - Stellt eine Internet- oder Unix-Domain-Socket-Verbindung her


7 BenutzerBeiträge:
- Beiträge aktualisieren...
k dot andris at gmail dot com
11.12.2008 19:22
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.
ludvig dot ericson at gmail dot com
27.07.2007 16:38
Confusion arises as to when PHP starts a new connection using all the
"persistent" versions of any function, and this depends entirely on how you
run your PHP.

In real CGI mode, that is, one process per script, persistent functions do the
exact same as their "temporary" equivalents. If you have a threaded Apache
MPM, this persistence will open a connection per thread, but not immediately.
Think of it as a single PHP instance for each thread.

If you run prefork, the MPM that forks the Apache server into several
accept()ing subprocesses, you'll have one PHP instance per process.

This isn't always true as I might've missed some gotchas, but in general, do
know that a persistent can only try to be persistent.

As for grey at greywyvern dot moc: A cronjob would be a lot better suited
for this, and have it periodically update the index rather than request ~200
pages each time somebody searches, at least from what you describe it as.
bimal dot das at maxartists dot com
7.06.2006 20:22
Here is how to POST a form action to a SSL server's cgi and retrieve output with pfsockopen

<?php

$host
= gethostbyaddr($_SERVER['REMOTE_ADDR']);

# working vars
$host = 'www.example.com';
$service_uri = '/cgi-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 = pfsockopen("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)) {
        echo
fgets($fp, 128);
    }
   
fclose($fp);
}

?>
grey at greywyvern dot moc
7.08.2004 6:06
pfsockopen is useful for having scripts executing others in the background.

I'm writing an intra-site search engine with spidering capabilities.  To spider a ~200 page site and index all the text takes about 60 seconds.  Because I don't want the user waiting 60s for the script to finish and thinking it's timing out, I use pfsockopen to have the server open an HTTP connection with itself to execute the script in the background.  Once the spidering is done, the connection is closed without capturing the HTTP response.  The output isn't important, the spidering is!

I just make the script execute the following:

<?php

$st
= pfsockopen($_SERVER['HTTP_HOST'], 80, $erstr, $errno, 5);
fwrite($st, "GET {$_SERVER['PHP_SELF']}?$key HTTP/1.0\r\nHost: {$_SERVER['HTTP_HOST']}\r\n\r\n");

?>

Where $key is the QUERY_STRING trigger which starts the spidering process.  This script is executed in the background while the main script is free to finish loading and display a message like: "The database is being reindexed, please wait."

BTW, I set a flag in another MySQL table which prevents searches while the spider is crawling.
pulstar at ig dot com dot br
24.09.2003 1:15
Persistent connections either in socket 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 processes, or the connections will be refused by the database (this will surely occur if you use persistent connections). The same may occur with socket 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, like 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.
dietrich at ganx4 dot com
8.05.2003 23:08
Re: persisting connections across script executions

SAPI modules allow this (i've only tried w/ ISAPI, but others might also allow).

also, Shane Caraveo's FastCGI allows this.
php dot net at domainofdarkness dot com
30.01.2001 0:26
OK, 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-process basis. If you do a 'ps auxw|grep httpd' on your server you will see more than one process. What p* does is make a p-connection on one of those processes only, the one that actually handles your request. Chances are that when you hit the page again it will be answered by a different process. I'm guessing if you keep hitting reload you'll get around to the original process again and there will be no error message 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_.



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)