Heim > Backend-Entwicklung > PHP-Tutorial > Detaillierte Erklärung der PHP-Funktion fsockopen

Detaillierte Erklärung der PHP-Funktion fsockopen

Freigeben: 2023-04-08 13:20:01
nach vorne
7277 Leute haben es durchsucht

Detaillierte Erklärung der PHP-Funktion fsockopen

PHP fsockopen ist eine relativ leistungsstarke Funktion. In diesem Artikel geben wir eine detaillierte Einführung in diese Funktion und hoffen, dass sie für alle hilfreich ist. Ich erinnere mich, dass frühere B2C-Websites diese Funktion nutzten, um die Interaktion zwischen der Rezeption und dem Bestellabwicklungssystem zu realisieren.

PHP fsockopen-Funktionsbeschreibung:

Syntax:

resource fsockopen ( string $hostname [, int KaTeX-Analysefehler: Erwartet 'EOF', bekam '&' an Position 20 : … = -1 [, int &̲errno [, string &$errstr [, float $timeout = ini_get(“default_socket_timeout”) ]]]] )

PHP fsockopen-Funktion aktivieren

PHP fsockopen erfordert, dass die Option „allow_url_fopen“ in PHP.ini aktiviert ist.

allow_url_fopen = On
Nach dem Login kopieren

Parameter:

Hostname: Wenn OpenSSL installiert ist, möchten Sie möglicherweise das Zugriffsprotokoll ssl:// oder tls:// vor Ihrer Hostnamen-Adresse hinzufügen, damit Sie es verwenden können Ein auf dem TCP/IP-Protokoll basierender SSL- oder TLS-Client stellt eine Verbindung zu einem Remote-Host her.

Port: Portnummer. Wenn an diesen Parameter -1 übergeben wird, bedeutet dies, dass der Port nicht verwendet wird, z. B. unix://.

errno: Wenn der Rückgabewert von errno 0 ist und der Rückgabewert dieser Funktion FALSE ist, deutet dies darauf hin, dass der Fehler vor dem Aufruf der Socket-Verbindung (connect()) aufgetreten ist, was der Hauptgrund ist für den Verbindungsfehler Möglicherweise ist beim Initialisieren des Sockets ein Fehler aufgetreten.

errstr: Die Fehlermeldung wird als String zurückgegeben.

Timeout: Legen Sie das Verbindungszeitlimit in Sekunden fest.

Rückgabewert:

fsockopen() gibt ein Dateihandle zurück, das später von anderen Dateiklassenfunktionen aufgerufen werden kann (zum Beispiel: fgets(), fgetss(), fwrite(), fclose() Es gibt auch feof()). Wenn der Aufruf fehlschlägt, wird FALSE zurückgegeben.

php fsockopen-Anwendungsfall

1. fsockopen zur Simulation der Generierung einer HTTP-Verbindung

<?php
    $fp = fsockopen("127.0.0.1",80,$errno,$errstr,30);
    if(!$fp){
        echo "$errstr ($errno)<br />\n";
    }else{
        $out = "GET / HTTP/1.1\r\n";
        $out .= "Host: 127.0.0.1\r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($fp,$out);
        $content = &#39;&#39;;
        while(!feof($fp)){
            $content .= fgets($fp,128);
        }
        echo $content;
        fclose($fp);
    }
?>
Nach dem Login kopieren

Ausführungsergebnisse:

Detaillierte Erklärung der PHP-Funktion fsockopen

2. PHP fsockopen simuliert die POST/GET-Methode

Zusätzlich zur Simulation der Generierung von HTTP-Verbindungen wie im obigen Beispiel kann fsockopen auch viele Funktionen implementieren, wie zum Beispiel die Simulation der Post- und Get-Methoden der Datenübertragung.
get :

<?php
$url = "http://localhost/test2.php?site=www.tbrer.com";
print_r(parse_url($url));// 解析 URL,返回其组成部分

/* get提交 */
sock_get($url,&#39;user=gonn&#39;);

// fsocket模拟get提交
function sock_get($url,$query){
    $data = array(
        &#39;foo&#39; => &#39;bar&#39;,
        &#39;baz&#39; => &#39;boom&#39;,
        &#39;site&#39; => &#39;www.tbrer.com&#39;,
        &#39;name&#39; => &#39;nowa magic&#39;
    );

    $query_str = http_build_query($data);// http_build_query()函数的作用是使用给出的关联(或下标)数组生成一个经过 URL-encode 的请求字符串

    $info = parse_url($url);
    $fp = fsockopen($info["host"],80,$errno,$errstr,30);
    $head = "GET " . $info[&#39;path&#39;] . &#39;?&#39; . $query_str . " HTTP/1.0\r\n";
    $head .= "Host: " . $info[&#39;host&#39;] . "\r\n";
    $head .= "\r\n";
    $write = fputs($fp,$head);
    while(!feof($fp)){
        $line = fread($fp,4096);
        echo $line;
    }
}
?>
Nach dem Login kopieren

post :

<?php
$url = "http://localhost/test2.php?site=www.tbrer.com";
print_r(parse_url($url));// 解析 URL,返回其组成部分

/* get提交 */
sock_post($url,&#39;user=gonn&#39;);

// fsocket模拟get提交
function sock_post($url,$query){
    $info = parse_url($url);
    $fp = fsockopen($info["host"],80,$errno,$errstr,30);
    $head = "POST " . $info[&#39;path&#39;] . "?" . $info["query"] . " HTTP/1.0\r\n";
    $head .= "Host: " . $info[&#39;host&#39;] . "\r\n";
    $head .= "Referer: http://" . $info[&#39;host&#39;] . $info[&#39;path&#39;] . "\r\n";
    $head .= "Content-type: application/x-www-form-urlencoded\r\n";
    $head .= "Content-Length: ". strlen(trim($query)) . "\r\n";
    $head .= "\r\n";
    $head  .= trim($query);
    $write = fputs($fp,$head);
    while(!feof($fp)){
        $line = fread($fp,4096);
        echo $line;
    }
}
?>
Nach dem Login kopieren

Der Code für den Empfang der Seite test2.php lautet:

<?php
    $data = $_REQUEST;

    echo &#39;<pre class="brush:php;toolbar:false">&#39;;
    print_r($data);
    echo &#39;
Nach dem Login kopieren
Nach dem Login kopieren
'; ?>

3. fsockopen simuliert HTTP-Download-Dateien im Socket-Modus

<?php
    /* 
        *   Socket 模拟HTTP协议传输文件
        *   Http是应用层协议使用80端口
    */
    $hostname = &#39;127.0.0.1&#39;;
    $port = &#39;80&#39;;

    // 建立连接
    $fp = fsockopen($hostname,$port,$errno,$errstr);
    stream_set_blocking($fp,true);
    if(!$fp){
        echo "$errno : $errstr<br />";
    }else{
        // 发送一个HTTP请求信息头
        $request_header = "GET /aaa.txt";

        // 起始行
        // 头域 
        $request_header .= "Host: $hostname\n";
        
        // 再一个回车换行表示头信息结束
        $request_header .= "\n";

        // 发送请求到服务器
        fputs($fp,$request_header);

        // 接受响应
        $fp2 = fopen(&#39;aaa.txt&#39;,&#39;w&#39;);

        while(!feof($fp)){
            $line = fputs($fp2,fgets($fp,128));
            echo $line;
        }

        // 关闭
        fclose($fp2);
        fclose($fp);
    }
?>
Nach dem Login kopieren

Führen Sie das Programm aus und Sie werden feststellen, dass die Datei, die Sie herunterladen müssen, im selben Verzeichnis wie die Programmdatei erscheint.

Dies ist im Wesentlichen ein Socket, der das HTTP-Protokoll zum Übertragen von Dateien simuliert. Achten Sie dabei auf das Timeout-Limit von PHP. Hier stelle ich das Timeout meines PHP-Servers auf unbegrenzt ein, um den Download korrekt durchführen zu können. Andernfalls wird der Download möglicherweise nicht abgeschlossen und das PHP-Programm stoppt.

Hinweis:

bool stream_set_blocking ( resources $stream , int $mode )

Blockierung oder Blockierungsmodus für Stream festlegen.

Diese Funktion funktioniert mit jedem Ressourcenstream, der den nicht blockierenden Modus unterstützt (normale Datei, Socket-Ressourcenstream usw.).

Parameter

stream: Ressourcenstream.

Modus: Wenn der Modus 0 ist, wird der Ressourcenfluss in den nicht blockierenden Modus umgewandelt. Wenn er 1 ist, wird der Ressourcenfluss in den blockierenden Modus umgewandelt. Die Einstellung dieses Parameters wirkt sich auf Funktionen wie fgets() und fread() aus, die Daten aus Ressourcenströmen lesen. Im nicht blockierenden Modus kehrt der Aufruf von fgets() immer sofort zurück; im blockierenden Modus wird vor der Rückkehr gewartet, bis Daten aus dem Ressourcenstrom abgerufen werden.

Rückgabewert

Gibt TRUE bei Erfolg oder FALSE bei Fehler zurück.

4. Verwenden Sie fsockopen, um die Quelle zu fälschen

<?php
$host = "127.0.0.1"; //你要访问的域名
$ip = &#39;127.0.0.1&#39;;
$target = "/test2.php"; //你要访问的页面地址
$referer = "http://www.tbrer.com/"; //伪造来路页面
//$fp = fsockopen($host, 80, $errno, $errstr, 30);
$fp = fsockopen($ip, 80, $errno, $errstr, 30);
if(!$fp)
{
    echo "$errstr($errno)<br />\n";
}
else
{
	$end = "\r\n";
    $out = "GET $target HTTP/1.1$end";
	$out .= "Host: $ip$end";
	$out .= "Referer: $referer$end";
	$out .= "Connection: Close$end";
	$out .= "$end";
    fwrite($fp, $out);
    while(!feof($fp))
    {
        echo fgets($fp, 1024);
    }
    fclose($fp);
}
?>
Nach dem Login kopieren

Der Code von test2.php lautet:

<?php
    $data = $_REQUEST;

    echo &#39;<pre class="brush:php;toolbar:false">&#39;;
    print_r($data);
    echo &#39;
Nach dem Login kopieren
Nach dem Login kopieren
'; ?>

Sie können sehen, dass der Wert von HTTP_REFERER http://www ist .tribrer.com /, das heißt, der Ursprung wurde erfolgreich gefälscht.

Verwandte Empfehlungen:

PHP-Video-Tutorial: https://www.php.cn/course/list/29/type/2.html

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung der PHP-Funktion fsockopen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage