php实现httpRequest的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php实现httpRequest的方法相关的知识,希望对你有一定的参考价值。

参考技术A 这篇文章主要介绍了php实现httpRequest的方法,涉及php操作http的技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了php实现httpRequest的方法。分享给大家供大家参考。具体如下:
想从学校图书馆的网站上抓取数据处理之后在返回给浏览器,试了不少方法。首先试了http_request(),但是这个学院pecl_http支持,后来又试了网上流传甚广的class
HttpRequest,可能是我不会使用,也失败了。后来看到了函数httpRequest($url,
$post='',
$method='GET',
$limit=0,
$returnHeader=FALSE,
$cookie='',
$bysocket=FALSE,
$ip='',
$timeout=15,
$block=TRUE),用它成功了,因此贴出来分享一下。函数代码如下:
代码如下:
<?php
/**
*
Respose
A
Http
Request
*
*
@param
string
$url
*
@param
array
$post
*
@param
string
$method
*
@param
bool
$returnHeader
*
@param
string
$cookie
*
@param
bool
$bysocket
*
@param
string
$ip
*
@param
integer
$timeout
*
@param
bool
$block
*
@return
string
Response
*/
function
httpRequest($url,$post='',$method='GET',$limit=0,$returnHeader=FALSE,$cookie='',$bysocket=FALSE,$ip='',$timeout=15,$block=TRUE)

$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;
if(strtolower($method)
==
'post')

$post
=
(is_array($post)
and
!empty($post))
?
http_build_query($post)
:
$post;
$out
=
"POST
$path
HTTP/1.0rn";
$out
.=
"Accept:
*/*rn";
//$out
.=
"Referer:
$boardurlrn";
$out
.=
"Accept-Language:
zh-cnrn";
$out
.=
"Content-Type:
application/x-www-form-urlencodedrn";
$out
.=
"User-Agent:
$_SERVER[HTTP_USER_AGENT]rn";
$out
.=
"Host:
$hostrn";
$out
.=
'Content-Length:
'.strlen($post)."rn";
$out
.=
"Connection:
Closern";
$out
.=
"Cache-Control:
no-cachern";
$out
.=
"Cookie:
$cookiernrn";
$out
.=
$post;

else

$out
=
"GET
$path
HTTP/1.0rn";
$out
.=
"Accept:
*/*rn";
//$out
.=
"Referer:
$boardurlrn";
$out
.=
"Accept-Language:
zh-cnrn";
$out
.=
"User-Agent:
$_SERVER[HTTP_USER_AGENT]rn";
$out
.=
"Host:
$hostrn";
$out
.=
"Connection:
Closern";
$out
.=
"Cookie:
$cookiernrn";

$fp
=
fsockopen(($ip
?
$ip
:
$host),
$port,
$errno,
$errstr,
$timeout);
if(!$fp)
return
'';
else

$header
=
$content
=
'';
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))

$header
.=
$h
=
fgets($fp);
if($h
&&
($h
==
"rn"
||
$h
==
"n"))
break;

$stop
=
false;
while(!feof($fp)
&&
!$stop)

$data
=
fread($fp,
($limit
==
0
||
$limit
>
8192
?
8192
:
$limit));
$content
.=
$data;
if($limit)

$limit
-=
strlen($data);
$stop
=
$limit
<=
0;



fclose($fp);
return
$returnHeader
?
array($header,$content)
:
$content;


?>

调用也很简单的。简单的例子:
代码如下:
echo
httpRequest('http://www.baidu.com');

希望本文所述对大家的php程序设计有所帮助。

“PHP 致命错误:找不到类 'HttpRequest'”

【中文标题】“PHP 致命错误:找不到类 \'HttpRequest\'”【英文标题】:"PHP Fatal error: Class 'HttpRequest' not found"“PHP 致命错误:找不到类 'HttpRequest'” 【发布时间】:2014-05-08 17:12:25 【问题描述】:

我一直在尝试以多种方式解决这个问题,阅读了很多帖子,但仍然没有运气。 我在 Mac、OSX 10.7 Lion 上工作,我正在使用 MAMP 为 WordPress 网站(php 文件)编写插件,并且有一次我必须发出 HTTP 请求:

$request = new HttpRequest('something'); 
$request->setMethod(HTTP_METH_GET);

执行此请求时出现错误,当我检查日志文件时,消息如下:

"PHP Fatal error:  Class 'HttpRequest' not found in (the_php_file)"

我已经安装了 PEAR、PECL 和 HTTP 扩展 (pecl_http)、Xcode 及其命令行工具。 这就是我所做的:

修改了路径:

$ echo "export PATH=/Applications/MAMP/bin/php/php5.5.3/bin:$PATH" >> ~/.profile`

验证了php、pear、pecl的路径是否正确:

/Applications/MAMP/bin/php/php5.3.6/bin/php是php的路径 /Applications/MAMP/bin/php/php5.3.6/bin/pear for pear /Applications/MAMP/bin/php/php5.3.6/bin/pecl for pecl

我从 MAMP 页面下载了 php 的源代码(并检查了我下载的版本是否与我正在使用的版本相同,即 php5.5.3)。然后我把内容提取出来放到/Applications/MAMP/bin/php/php5.5.3/include/php

在 /Applications/MAMP/bin/php/php5.5.3/include/php 里面我跑了./configure 我执行了:pecl install pecl_http

我还在 php.ini 中添加了这些扩展(最初,我修改了 MAMP/bin/php/php5.5.3/conf/php.ini 文件):

extension=raphf.so
extension=propro.so
extension="http.so"

关于引号中的最后一个:当我手动添加扩展名时,我是这样做的:extension=http.so。然后(当试图解决我的问题时)我尝试了一个替代安装,它自动修改了 php.ini,并用引号编写了扩展名。标记,但结果还是一样,所以没有什么区别。

在这一切之后,我停止了 MAMP 服务器并重新启动它,但是当我执行 php 时,我仍然收到错误(在 php_error.log 中可见):

PHP Fatal error:  Class 'HttpRequest' not found

我大部分时间都在关注本指南,其中包括: http://www.lullabot.com/blog/article/installing-php-pear-and-pecl-extensions-mamp-mac-os-x-107-lion

我很感激任何想法,因为我已经用完了它们。

【问题讨论】:

您找到问题的解决方案了吗? 【参考方案1】:

类 HttpRequest 由这个 PECL 扩展的 v1 提供。

通过:$ pecl install -f pecl_http-1.7.6重新安装

您可以在此处找到 v2 的文档,不过: https://mdref.m6w6.name/http

【讨论】:

我执行了这个命令,但是得到了错误:No releases available for package "pecl.php.net/pecl_http" 兄弟,我应该如何解决这个问题? 取决于您的 PHP 版本。附加与您的 PHP 版本兼容的适当 pecl_http 版本。【参考方案2】:

或者,如果您无法控制某些环境变量或安装软件包,您可以尝试使用 curl,它应该返回一个 json 对象(以下是 google api 调用的工作 sn-p)。

$url = 'https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=TOKEN_DATA_123';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$json = json_decode($response, true);
curl_close($ch);
print_r($json);
$userEmail = $json["email"];

【讨论】:

以上是关于php实现httpRequest的方法的主要内容,如果未能解决你的问题,请参考以下文章

Spring常用配置 --- Bean的Scope

Curl和HttpRequest之间的PHP区别

SpringMVC RequestLoggingFilter log to file

“PHP 致命错误:找不到类 'HttpRequest'”

Python模拟HttpRequest的方法总结

JavaScript HttpRequest错误[重复]