php的http协议怎么使用?

整理:jmamnlcv223 时间:2025-05-23 阅读:9

php中如何使用http协议,包括采集远程文件、使用 fsockopen 通过 HTTP 协议直接访问(采集)远程文件、下载文件、显示HTTP Header 信息等。

工具/原料

软件开发工具

浏览器

操作方法

1

采集远程文件

/**

* 采集远程文件

*

* @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 );

}

2

/**

* 使用 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;

}

}

3

/**

* 下载文件

* 可以指定下载显示的文件名,并自动发送相应的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";

}

4

// 发送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 ();

}

5

/**

* 显示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;

}

}

同类经验分享

站内热点

近期更新