php用fsockopen发post

教程大全 2026-01-18 12:04:38 浏览

PHP使用fsockopen函数发送POST和GET请求获取网页内容的方法

在PHP开发中,有时需要直接通过代码向其他网站发送HTTP请求并获取响应内容,虽然cURL是更常用的工具,但fsockopen函数提供了另一种底层实现方式,适合在特定场景下使用,本文将详细介绍如何使用fsockopen发送GET和POST请求,并解析返回的网页内容。

fsockopen函数简介

fsockopen是PHP中一个用于打开网络连接或Unix域套接字的函数,它支持TCP和UDP协议,常用于实现HTTP、FTP等协议的客户端功能,其基本语法为:

resource fsockopen(string $hostname, int $port, int &$errno, string &$errstr, int $timeout = ini_get("default_socket_timeout"))

参数说明:

使用fsockopen发送GET请求

GET请求是最简单的HTTP请求方式,适合获取网页内容,以下是实现步骤:

1 建立连接

使用fsockopen与目标服务器建立TCP连接:

$host = 'www.example.com';$port = 80;$timeout = 10;$fp = fsockopen($host, $port, $errno, $errstr, $timeout);if (!$fp) {die("连接失败: $errstr ($errno)");}

2 构造GET请求头

GET请求需要构造完整的HTTP请求头,包括请求方法、路径、协议版本以及Host头等信息

$method = 'GET';$path = '/index.html';$httpVersion = 'HTTP/1.1';$request = "$method $path $httpVersionrn";$request .= "Host: $hostrn";$request .= "Connection: Closernrn";

3 发送请求并读取响应

将构造的请求头发送到服务器,然后读取响应内容:

fwrite($fp, $request);$response = '';while (!feof($fp)) {$response .= fread($fp, 1024);}fclose($fp);echo $response;

使用fsockopen发送POST请求

POST请求常用于提交表单数据,与GET请求的主要区别在于需要构造请求体和Content-Length头。

1 构造POST请求体

假设要提交表单数据 username=admin&password=123456 ,需要将其作为请求体:

$postData = 'username=admin&password=123456';

2 构造完整的POST请求头

POST请求头需要包含Content-Type和Content-Length字段:

$method = 'POST';$path = '/login.php';$request = "$method $path $httpVersionrn";$request .= "Host: $hostrn";$request .= "Content-Type: application/x-www-form-urlencodedrn";$request .= "Content-Length: " . strlen($postData) . "rn";$request .= "Connection: Closernrn";$request .= $postData;

3 发送请求并解析响应

与GET请求类似,发送请求头和数据,然后读取响应:

fwrite($fp, $request);$response = '';while (!feof($fp)) {$response .= fread($fp, 1024);}fclose($fp);echo $response;

处理HTTPS请求

fsockopen默认不支持HTTPS协议,但可以通过加密套接字扩展(OpenSSL)实现。

$host = 'ssl://www.example.com';$port = 443;$fp = fsockopen($host, $port, $errno, $errstr, $timeout);

注意:使用HTTPS时,需确保PHP已启用OpenSSL扩展。

解析响应内容

HTTP响应通常包含响应头和响应体,可以通过分割来分离两者:

list($headers, $body) = explode("rnrn", $response, 2);echo "响应头:n$headersnn";echo "响应体:n$body";

错误处理与优化

相关问答FAQs

Q1: fsockopen与cURL有什么区别? A1: fsockopen是底层函数,需手动构造HTTP协议,灵活性高但复杂;cURL是高级封装,支持更多功能(如Cookie、代理等),使用更简单,cURL适合大多数场景,而fsockopen适合需要精细控制的底层操作。

Q2: 如何通过fsockopen处理重定向? A2: HTTP响应头中的字段表示重定向地址,需解析响应头,提取值,然后重新发送请求,可以循环处理,但需设置最大重定向次数以避免死循环。


PHP高手进 邮件发送

mail($to,$obj,$ct,$from);

就mail函数就可以发右键了

$to 是发送到 $obj是标题 $ct是右键内容 $from是哪个发的

IIS配置邮件服务器SMTP

在配置邮件地址参数

php用fsockopen发post

用PHP发送电子邮件的方法?

username = substr( $from, 0, strpos( $from , @ ) );$this->password = $password;$this->smtp = $smtp ? $smtp : $this->smtp;$this->check = $check;$this->s_from = $from;}}/** 功能:发送邮件* $to 目标邮箱* $from 来源邮箱* $subject 邮件标题* $message 邮件内容*/function send ( $to, $from, $subject, $message ) {//连接服务器$fp = fsockopen ( $this->smtp, 25, $errno, $errstr, 60);if (!$fp ) return 联接服务器失败.__LINE__;set_socket_blocking($fp, true );$lastmessage=fgets($fp,512);if ( substr($lastmessage,0,3) != 220 ) return 错误信息1:$lastmessage.__LINE__;//HELO$yourname = YOURNAME;if($this->check == 1) $lastact=EHLO .$yourname.\r\n;else $lastact=HELO .$yourname.\r\n;fputs($fp, $lastact);$lastmessage == fgets($fp,512);if (substr($lastmessage,0,3) != 220 ) return 错误信息2:$lastmessage.__LINE__;while (true) {$lastmessage = fgets($fp,512);if ( (substr($lastmessage,3,1) != -) or (empty($lastmessage)) )break;}//身份验证if ($this->check==1) {//验证开始$lastact=AUTH LOGIN.\r\n;fputs( $fp, $lastact);$lastmessage = fgets ($fp,512);if (substr($lastmessage,0,3) != 334) return 错误信息3:$lastmessage.__LINE__;//用户姓名$lastact=base64_encode($this->username).\r\n;fputs( $fp, $lastact);$lastmessage = fgets ($fp,512);if (substr($lastmessage,0,3) != 334) return 错误信息4:$lastmessage.__LINE__;//用户密码$lastact=base64_encode($this->password).\r\n;fputs( $fp, $lastact);$lastmessage = fgets ($fp,512);if (substr($lastmessage,0,3) != 235) return 错误信息5:$lastmessage.__LINE__;}//FROM:$lastact=MAIL FROM: <. $this->s_from . >\r\n;fputs( $fp, $lastact);$lastmessage = fgets ($fp,512);if (substr($lastmessage,0,3) != 250) return 错误信息6:$lastmessage.__LINE__;//TO:$lastact=RCPT TO: <. $to .> \r\n;fputs( $fp, $lastact);$lastmessage = fgets ($fp,512);if (substr($lastmessage,0,3) != 250) return 错误信息7:$lastmessage.__LINE__;//DATA$lastact=DATA\r\n;fputs($fp, $lastact);$lastmessage = fgets ($fp,512);if (substr($lastmessage,0,3) != 354) return 错误信息8:$lastmessage.__LINE__; //处理Subject头$head=Subject: $subject\r\n;$message = $head.\r\n.$message; //处理From头$head=From: $from\r\n;$message = $head.$message;//处理To头$head=To: $to\r\n;$message = $head.$message; //加上结束串$message .= \r\n.\r\n;//发送信息fputs($fp, $message);$lastact=QUIT\r\n;fputs($fp,$lastace);fclose($fp);return 0;} } /*发送示例 $sm = new smail( 用户, 密码, ); $end = $sm->send( 目标邮箱, 来源邮箱, 这是标题, 这是邮件内容 ); if( $end ) echo $end; else echo 发送成功!; */ ?>

php发送邮件如何解析html

$mailstr.=Content-Type:text/html;charset=utf-8\n;邮件内容开始时候加上 改为你指定的编码

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐