Dieser Artikel stellt hauptsächlich die Methode vor, mit der PHP Sockets zum Simulieren von POST verwendet, und analysiert die gängigen Techniken zum Simulieren von POST über Sockets anhand von Beispielen.
Fast das am häufigsten verwendete simulierte POST Ich habe PHP Curl verwendet, um es zu implementieren. Heute habe ich gesehen, dass ein Freund einen Artikel mit einem PHP-Socket geschrieben hat, der eine POST-Anfrage simuliert.
In der Vergangenheit habe ich die PHP-Curl-Erweiterung verwendet, um Post-Anfragen zu simulieren. Ich hätte nie gedacht, dass PHP-Socket auch implementiert werden könnte. Ich habe kürzlich die relevanten Informationen durchgesehen und festgestellt, dass sie nicht so tiefgreifend sind. Es ist nur so, dass ich das Prinzip und die Essenz von Post nie vollständig verstanden habe. Tatsächlich geht es darum, eine als Post markierte Protokollzeichenfolge an das Zielprogramm zu senden folgt:
POST / Zielprogramm-URL HTTP/1.1
Akzeptieren: Informationsformat empfangen
Referer: URL-Quelle
Accept-Language: Empfangssprache
Content-Type: application/ x-www-form-urlencoded
Cookie: Website-Cookie, Sie müssen nicht zu viel erklären, oder?
Benutzer- Agent: Benutzeragent, Betriebssystem und Version, CPU-Typ, Browser- und Versionsinformationen
Host: Die zu sendende Hostadresse
Content-Length : Die Länge der gesendeten Daten
Pragma: Ob es einen lokalen Cache gibt
Cache-Kontrolle: ob ein Webseiten-Cache benötigt wird
Verbindung: Verbindungsstatus
Benutzername=fengdingbo&password=jb51 .net //Per Post gesendete Daten
Ich denke, jeder sollte mit der Formular-Post-Methode zum Senden von Daten vertraut sein. Wenn wir beispielsweise den Benutzernamen und das Passwort an eine bestimmte Seite senden möchten, Füllen Sie das entsprechende Eingabefeld aus, klicken Sie auf die Schaltfläche „Senden“ und senden Sie schließlich das Formular. Die oben genannten Daten werden an das Aktionsprogramm gesendet. Wenn ich das weiß, denke ich, dass es nicht schwierig sein wird
Zu diesem Zeitpunkt müssen wir nur den PHP-Socket verwenden, um einen Port zu öffnen, z. B. Port 80, und diesen Port zum Senden der oben genannten Informationen verwenden zum Zielprogramm.
Wie richten wir einen Socket-Kanal an einem Port ein?
Es ist so einfach in PHP!
Offizieller Prototyp:
resource fsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string & $errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )
Das Folgende ist menschliches Verständnis:
fsockopen(Hostname, Portnummer, Fehlernummer und Variablen , Fehleraufforderung und Variablen, Zeitüberschreitung)
Der Hostname ist das Ziel, an das Sie Daten senden müssen.
Die Portnummer ist der Port, auf dem das Programm auf Ihre Daten wartet.
Fehler Die &-Variable Bei der Anzahl handelt es sich um die Fehlernummer, die zurückgegeben wird, wenn die Socket-Einrichtung fehlschlägt. Die &-Variable der Fehleraufforderung ist die bei Auftreten eines Fehlers zurückgegebene Fehlernummer Die andere Partei nach der Veröffentlichung der Daten keine Antwort auf die Nachricht, die maximale Wartezeit.
Wenn nichts anderes passiert (Sie haben die Parameter der Funktion fsockopen() richtig eingestellt), wurde nun ein Socket-Kanal geöffnet. Der nächste Schritt besteht darin, über diesen geöffneten Kanal zu posten. Das Anforderungsprotokoll wird an das Zielprogramm gesendet. Zu diesem Zeitpunkt können Sie entweder die Funktion fwrite oder fputs verwenden, um das Post-Anforderungsformat an das von fsockopen() geöffnete Ressourcenhandle zu senden .
<?php /** * SOCKET扩展函数 * @copyright (c) 2013 * @author Qiufeng <fengdingbo@gmail.com> * @link http://www.jb51.net * @version 1.0 */ /** * Post Request * * @param string $url * @param array $data * @param string $referer * @return array */ if ( ! function_exists('socket_post')) { function socket_post($url, $data, $referer='') { if( ! is_array($data)) { return; } $data = http_build_query($data); $url = parse_url($url); if ( ! isset($url['scheme']) || $url['scheme'] != 'http') { die('Error: Only HTTP request are supported !'); } $host = $url['host']; $path = isset($url['path']) ? $url['path'] : '/'; // open a socket connection on port 80 - timeout: 30 sec $fp = fsockopen($host, 80, $errno, $errstr, 30); if ($fp) { // send the request headers: $length = strlen($data); $POST = <<<HEADER POST {$path} HTTP/1.1 Accept: text/plain, text/html Referer: {$referer} Accept-Language: zh-CN,zh;q=0.8 Content-Type: application/x-www-form-urlencodem Cookie: token=value; pub_cookietime=2592000; pub_sauth1=value; pub_sauth2=value User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17 Host: {$host} Content-Length: {$length} Pragma: no-cache Cache-Control: no-cache Connection: closern {$data} HEADER; fwrite($fp, $POST); $result = ''; while(!feof($fp)) { // receive the results of the request $result .= fread($fp, 512); } } else { return array( 'status' => 'error', 'error' => "$errstr ($errno)" ); } // close the socket connection: fclose($fp); // split the result header from the content $result = explode("rnrn", $result, 2); // return as structured array: return array( 'status' => 'ok', 'header' => isset($result[0]) ? $result[0] : '', 'content' => isset($result[1]) ? $result[1] : '' ); } } print_r(socket_post('http://www.jb51.net/', array('name='=>'qiufeng','password'=>md5('www.jb51.net')))); /* e.g: socket_post('http://www.jb51.net', array('name='=>'qiufeng','password'=>md5('jb51.net'))); */ /* End of file socket_helper.php */
Tatsächlich wird beim Öffnen des Socket-Kanals der COOKIE, das wir übergeben, ist Wenn es korrekt ist (der im Screenshot ausgeführte PHP-Code stammt von oben und mein Benutzername wird auf der nach dem Ausführen zurückgegebenen Webseite angezeigt, was darauf hinweist, dass die andere Website erkannt hat, dass ich mich angemeldet habe), können wir dies tun viele Dinge, wie zum Beispiel erfrischende Beiträge, Antworten usw. Du verstehst, oder?
Okay, das Obige ist nicht überzeugend genug. Schauen wir uns einen PHP-Socket an, um das Hochladen von Bildern zu implementieren.
Der Anforderungsstring unter
ist für jede Sprache geeignet
Der Code lautet wie folgt
<?php $remote_server = "jb51.net"; $boundary = "---------------------".substr(md5(rand(0,32000)),0,10); // Build the header $header = "POST /api.php?action=twupload HTTP/1.0rn"; $header .= "Host: {$remote_server}rn"; $header .= "Content-type: multipart/form-data, boundary=$boundaryrn"; /* // attach post vars foreach($_POST AS $index => $value){ $data .="--$boundaryrn"; $data .= "Content-Disposition: form-data; name="".$index.""rn"; $data .= "rn".$value."rn"; $data .="--$boundaryrn"; } */ $file_name = "aaa.jpg"; $content_type = "image/jpg"; $data = ''; // and attach the file $data .= "--$boundaryrn"; $content_file = file_get_contents('aaa.jpg'); $data .="Content-Disposition: form-data; name="userfile"; filename="$file_name"rn"; $data .= "Content-Type: $content_typernrn"; $data .= "".$content_file."rn"; $data .="--$boundary--rn"; $header .= "Content-length: " . strlen($data) . "rnrn"; // Open the connection $fp = fsockopen($remote_server, 80); // then just fputs($fp, $header.$data); // reader while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp);
Zusammenfassung: Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, er wird für das Studium aller hilfreich sein.
Verwandte Empfehlungen:
phpSo erhalten Sie die aktuelle URL-Adresse
phpMethoden zur Realisierung der Hexadezimal- und Dezimalkonvertierungsfunktion
Das obige ist der detaillierte Inhalt vonPHP verwendet Socket, um die POST-Methode zu simulieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!