php的http协议怎么使用?

php中如何使用http协议,包括采集远程文件、使用 fsockopen 通过 HTTP 协议直接访问(采集)远程文件、下载文件、显示HTTP Header 信息等。
工具/原料
软件开发工具
浏览器
操作方法
采集远程文件
/**
* 采集远程文件
*
* @access public
* @param string $remote
* 远程文件名
* @param string $local
* 本地保存文件名
* @return mixed
*/
static public function curlDownload($remote, $local) {
$cp = curl_init ( $remote );
$fp = fopen ( $local, "w" );
curl_setopt ( $cp, CURLOPT_FILE, $fp );
curl_setopt ( $cp, CURLOPT_HEADER, 0 );
curl_exec ( $cp );
curl_close ( $cp );
fclose ( $fp );
}

/**
* 使用 fsockopen 通过 HTTP 协议直接访问(采集)远程文件
* 如果主机或服务器没有开启 CURL 扩展可考虑使用
* fsockopen 比 CURL 稍慢,但性能稳定
*
* @static
*
* @access public
* @param string $url
* 远程URL
* @param array $conf
* 其他配置信息
* int limit 分段读取字符个数
* string post post的内容,字符串或数组,key=value&形式
* string cookie 携带cookie访问,该参数是cookie内容
* string ip 如果该参数传入,$url将不被使用,ip访问优先
* int timeout 采集超时时间
* bool block 是否阻塞访问,默认为true
* @return mixed
*/
static public function fsockopenDownload($url, $conf = array()) {
$return = '';
if (! is_array ( $conf ))
return $return;
$matches = parse_url ( $url );
! isset ( $matches ['host'] ) && $matches ['host'] = '';
! isset ( $matches ['path'] ) && $matches ['path'] = '';
! isset ( $matches ['query'] ) && $matches ['query'] = '';
! isset ( $matches ['port'] ) && $matches ['port'] = '';
$host = $matches ['host'];
$path = $matches ['path'] ? $matches ['path'] . ($matches ['query'] ? '?' . $matches ['query'] : '') : '/';
$port = ! empty ( $matches ['port'] ) ? $matches ['port'] : 80;
$conf_arr = array (
'limit' => 0,
'post' => '',
'cookie' => '',
'ip' => '',
'timeout' => 15,
'block' => TRUE
);
foreach ( array_merge ( $conf_arr, $conf ) as $k => $v )
${$k} = $v;
if ($post) {
if (is_array ( $post )) {
$post = http_build_query ( $post );
}
$out = "POST $path HTTP/1.0 ";
$out .= "Accept: */* ";
// $out .= "Referer: $boardurl ";
$out .= "Accept-Language: zh-cn ";
$out .= "Content-Type: lication/x-www-form-urlencoded ";
$out .= "User-Agent: $_SERVER[HTTP_USER_AGENT] ";
$out .= "Host: $host ";
$out .= 'Content-Length: ' . strlen ( $post ) . " ";
$out .= "Connection: Close ";
$out .= "Cache-Control: no-cache ";
$out .= "Cookie: $cookie ";
$out .= $post;
} else {
$out = "GET $path HTTP/1.0 ";
$out .= "Accept: */* ";
// $out .= "Referer: $boardurl ";
$out .= "Accept-Language: zh-cn ";
$out .= "User-Agent: $_SERVER[HTTP_USER_AGENT] ";
$out .= "Host: $host ";
$out .= "Connection: Close ";
$out .= "Cookie: $cookie ";
}
$fp = @fsockopen ( ($ip ? $ip : $host), $port, $errno, $errstr, $timeout );
if (! $fp) {
return '';
} else {
stream_set_blocking ( $fp, $block );
stream_set_timeout ( $fp, $timeout );
@fwrite ( $fp, $out );
$status = stream_get_meta_data ( $fp );
if (! $status ['timed_out']) {
while ( ! feof ( $fp ) ) {
if (($header = @fgets ( $fp )) && ($header == " " || $header == " ")) {
break;
}
}
$stop = false;
while ( ! feof ( $fp ) && ! $stop ) {
$data = fread ( $fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit) );
$return .= $data;
if ($limit) {
$limit -= strlen ( $data );
$stop = $limit <= 0;
}
}
}
@fclose ( $fp );
return $return;
}
}

/**
* 下载文件
* 可以指定下载显示的文件名,并自动发送相应的Header信息
* 如果指定了content参数,则下载该参数的内容
*
* @static
*
* @access public
* @param string $filename
* 下载文件名
* @param string $showname
* 下载显示的文件名
* @param string $content
* 下载的内容
* @param integer $expire
* 下载内容浏览器缓存时间
* @return void
*/
static public function download($filename, $showname = '', $content = '', $expire = 180) {
if (is_file ( $filename )) {
$length = filesize ( $filename );
} elseif (is_file ( UPLOAD_PATH . $filename )) {
$filename = UPLOAD_PATH . $filename;
$length = filesize ( $filename );
} elseif ($content != '') {
$length = strlen ( $content );
} else {
E ( $filename . L ( '下载文件不存在!' ) );
}
if (empty ( $showname )) {
$showname = $filename;
}
$showname = basename ( $showname );
if (! empty ( $filename )) {
$finfo = new finfo ( FILEINFO_MIME );
$type = $finfo->file ( $filename );
} else {
$type = "lication/octet-stream";
}

// 发送Http Header信息 开始下载
header ( "Pragma: public" );
header ( "Cache-control: max-age=" . $expire );
// header('Cache-Control: no-store, no-cache, must-revalidate');
header ( "Expires: " . gmdate ( "D, d M Y H:i:s", time () + $expire ) . "GMT" );
header ( "Last-Modified: " . gmdate ( "D, d M Y H:i:s", time () ) . "GMT" );
header ( "Content-Disposition: attachment; filename=" . $showname );
header ( "Content-Length: " . $length );
header ( "Content-type: " . $type );
header ( 'Content-Encoding: none' );
header ( "Content-Transfer-Encoding: binary" );
if ($content == '') {
readfile ( $filename );
} else {
echo ($content);
}
exit ();
}

/**
* 显示HTTP Header 信息
*
* @return string
*/
static function getHeaderInfo($header = '', $echo = true) {
ob_start ();
$headers = getallheaders ();
if (! empty ( $header )) {
$info = $headers [$header];
echo ($header . ':' . $info . " ");
;
} else {
foreach ( $headers as $key => $val ) {
echo ("$key:$val ");
}
}
$output = ob_get_clean ();
if ($echo) {
echo (nl2br ( $output ));
} else {
return $output;
}
}

同类经验分享
- www是什么意思05-03
- 钉钉如何设置允许非好友查看我的企业认证信息?11-19
- 如何更好地处理婆媳矛盾11-19
- 萌妆的打造方法11-19
- 家具设计之客厅电视柜家具手绘举例11-17
- 怎么做美人鱼手工制作11-26
- 小孩很不听话怎么办?11-17
- 汽车美容知识全攻略11-26
- 批量确认收货如何使用11-26
- 如何轻松地学习一门语言11-26
站内热点
- www是什么意思05-03
- 钉钉如何设置允许非好友查看我的企业认证信息?11-19
- 如何更好地处理婆媳矛盾11-19
- 萌妆的打造方法11-19
- 家具设计之客厅电视柜家具手绘举例11-17
- 怎么做美人鱼手工制作11-26
- 小孩很不听话怎么办?11-17
- 汽车美容知识全攻略11-26
- 批量确认收货如何使用11-26
- 如何轻松地学习一门语言11-26
近期更新
- 如何听歌识曲05-23
- 怎样教育孩子(年龄段篇)05-23
- 怎样美白皮肤05-23
- 别墅装修好坏的六个坐标05-23
- 常吃什么对皮肤好?8种水果必不可少。05-23
- 怎样饲养金毛狗?05-23
- 这样学英语更简单—英语学习有技巧05-22
- 木耳炒肉片怎么做05-22
- 海尔“净卫”HSW-PF2前置过滤净水器开箱晒物05-22
- 简单好吃的高丽菜饭05-22
- 如何让自己的皮肤越来越白?05-22
- 怎么折叠爱心(超详细)05-22