php 异步处理类,php异步处理类

该类可以请求HTTP和HTTPS协议,还可以处理301、302重定向以及GZIP压缩等。

[PHP]代码

//使用方法

require('asynHandle.class.php');

$obj = new asynHandle();

$result = $obj->Request('http://baidu.com');

$result2 = $obj->Get('https://mail.google.com/');

echo "{$result}
";

echo "{$result2}
";

asynHandle.class.php ~ 7KB    下载(10)

/*

* 异步处理类

* @author lkk/lianq.net

* @create on 10:05 2012-7-30

* @example:

* $obj = new asynHandle();

* $obj->Request('http://google.com');

* $obj->Get('http://google.com');

*/

class asynHandle {

public $url = ''; //传入的完整请求url,包括"http://"或"https://"

public $cookie = array(); //传入的cookie数组,须是键值对

public $post = array(); //传入的post数组,须是键值对

public $timeout = 30; //超时秒数

public $result = ''; //获取到的数据

private $gzip = true; //是否开启gzip压缩

private $fop = NULL; //fsockopen资源句柄

private $host = ''; //主机

private $port = ''; //端口

private $referer = ''; //伪造来路

private $requestUri = ''; //实际请求uri

private $header = ''; //头信息

private $block = 1; //网络流状态.1为阻塞,0为非阻塞

private $limit = 128; //读取的最大字节数

//构造函数

public function __construct(){

ignore_user_abort(TRUE);//忽略用户中断.如果客户端断开连接,不会引起脚本abort

//set_time_limit(0);//取消脚本执行延时上限

}

//解析URL并创建资源句柄

private function analyzeUrl(){

if ($this->url == ''){return false;}

$url_array = parse_url($this->url);

!isset($url_array['host']) && $url_array['host'] = '';

!isset($url_array['path']) && $url_array['path'] = '';

!isset($url_array['query']) && $url_array['query'] = '';

!isset($url_array['port']) && $url_array['port'] = 80;

$this->host = $url_array['host'];

$this->port = $url_array['port'];

$this->referer = $url_array['scheme'].'://'.$this->host.'/';

$this->requestUri = $url_array['path'] ?

$url_array['path'].($url_array['query'] ? '?'.$url_array['query'] : '') : '/';

switch($url_array['scheme']){

case 'https':

$this->fop = fsockopen('ssl://'.$this->host, 443, $errno, $errstr, $this->timeout);

break;

default:

$this->fop = fsockopen($this->host, $this->port, $errno, $errstr, $this->timeout);

break;

}

if(!$this->fop){

$this->result = "$errstr ($errno)
\n";

return false;

}

return true;

}//analyzeUrl end

//拼装HTTP的header

private function assHeader(){

$method = empty($this->post) ? 'GET' : 'POST';

$gzip = $this->gzip ? 'gzip, ' : '';

//cookie数据

if(!empty($htis->cookie)){

$htis->cookie = http_build_cookie($htis->cookie);

}

//post数据

if(!empty($this->post)){

$this->post = http_build_query($this->post);

}

$header = "$method $this->requestUri HTTP/1.0\r\n";

$header .= "Accept: */*\r\n";

$header .= "Referer: $this->referer\r\n";

$header .= "Accept-Language: zh-cn\r\n";

if(!empty($this->post)){

$header .= "Content-Type: application/x-www-form-urlencoded\r\n";

}

$header .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";

$header .= "Host: $this->host\r\n";

if(!empty($this->post)){

$header .= 'Content-Length: '.strlen($this->post)."\r\n";

}

$header .= "Connection: Close\r\n";

$header .= "Accept-Encoding: {$gzip}deflate\r\n";

$header .= "Cookie: $this->cookie\r\n\r\n";

$header .= $this->post;

$this->header = $header;

}//assHeader end

//返回状态检测,301、302重定向处理

private function checkRecvHeader($header){

if(strstr($header,' 301 ') || strstr($header,' 302 ')){//重定向处理

preg_match("/Location:(.*?)$/im",$header,$match);

$url = trim($match[1]);

preg_match("/Set-Cookie:(.*?)$/im",$header,$match);

$cookie = (empty($match)) ? '' : $match[1];

$obj = new asynHandle();

$result = $obj->Get($url, $cookie, $this->post);

$this->result = $result;

return $result;

}elseif(!strstr($header,' 200 ')){

//找不到域名或网址

return false;

}else return 200;

}//checkRecvHeader end

//gzip解压

private function gzdecode($data){

$flags = ord(substr($data, 3, 1));

$headerlen = 10;

$extralen = 0;

$filenamelen = 0;

if ($flags & 4) {

$extralen = unpack('v' ,substr($data, 10, 2));

$extralen = $extralen[1];

$headerlen += 2 + $extralen;

}

if ($flags & 8) $headerlen = strpos($data, chr(0), $headerlen) + 1;

if ($flags & 16) $headerlen = strpos($data, chr(0), $headerlen) + 1;

if ($flags & 2) $headerlen += 2;

$unpacked = @gzinflate(substr($data, $headerlen));

if ($unpacked === FALSE) $unpacked = $data;

return $unpacked;

}//gzdecode end

//请求函数,只请求,不返回

public function Request($url, $cookie=array(), $post=array(), $timeout=3){

$this->url = $url;

$this->cookie = $cookie;

$this->post = $post;

$this->timeout = $timeout;

if(!$this->analyzeUrl()){

return $this->result;

}

$this->assHeader();

stream_set_blocking($this->fop, 0);//非阻塞,无须等待

fwrite($this->fop, $this->header);

fclose($this->fop);

return true;

}//Request end

//获取函数,请求并返回

public function Get($url, $cookie=array(), $post=array(), $timeout=30){

$this->url = $url;

$this->cookie = $cookie;

$this->post = $post;

$this->timeout = $timeout;

if(!$this->analyzeUrl()){

return $this->result;

}

$this->assHeader();

stream_set_blocking($this->fop, $this->block);

stream_set_timeout($this->fop, $this->timeout);

fwrite($this->fop, $this->header);

$status = stream_get_meta_data($this->fop);

if(!$status['timed_out']){

$h='';

while(!feof($this->fop)){

if(($header = @fgets($this->fop)) && ($header == "\r\n" || $header == "\n")){

break;

}

$h .= $header;

}

$checkHttp = $this->checkRecvHeader($h);

if($checkHttp!=200){return $checkHttp;}

$stop = false;

$return = '';

$this->gzip = false;

if(strstr($h,'gzip')) $this->gzip = true;

while(!($stop && $status['timed_out'] && feof($this->fop))){

if($status['timed_out']) return false;

$data = fread($this->fop, ($this->limit == 0 || $this->limit > 128 ? 128 : $this->limit));

if($data == ''){//有些服务器不行,须自行判断FOEF

break;

}

$return .= $data;

if($this->limit){

$this->limit -= strlen($data);

$stop = $this->limit <= 0;

}

}

@fclose($this->fop);

$this->result = $this->gzip ? $this->gzdecode($return) : $return;

return $this->result;

}else{

return false;

}

}//Get end

}

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com

特别注意:本站所有转载文章言论不代表本站观点!

本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

恶意软件盯上了加密货币,两家以色列公司受到攻击

近日&#xff0c;网络安全公司Palo Alto Networks威胁研究部门Unit 42发博称&#xff0c;已确认Cardinal RAT自2017年4月起对两家从事外汇和加密交易软件开发的以色列金融科技公司发起过攻击。 Cardinal RAT是可远程访问特洛伊木马&#xff08;RAT&#xff09;&#xff0c;攻击…

php 自定义打印模板下载,PHP – 创建自定义模板系统?

我已经在这里搜索过,令人惊讶的是我找不到答案.我发现了一个类似的线程,但没有真正的解决方案.复杂的部分是循环,如果我不需要循环我可以只是做一个常规替换.所以,我有一个带有一些标记的.html文件,如下所示&#xff1a;{{startloop}}{{imgname}}{{endLoop}}我想要做的是用其他…

腾讯财报中“最大秘密”:2018云收入91亿元,交首份TO B答卷

腾讯财报中“最大秘密”云业务收入又一次被公开了&#xff1a;2018年&#xff0c;腾讯云收入91亿元&#xff0c;增长100%。 3月21日&#xff0c;腾讯发布2018年Q4及全年财报&#xff0c;2018全年收入3126.94亿元同比增长32%&#xff0c;净利润(Non-GAAP)774.69亿元。而被列进“…

根据坐标如何在matlab中l连成曲线,matlab中,如何将两条曲线画在一个坐标系里,plot(x1,x2,y1,y2)还是怎样...

matlab中&#xff0c;如何将两条曲线画在一个坐标系里&#xff0c;plot(x1,x2,y1,y2)还是怎样以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;matlab中&#xff0c;如何将两条曲线画在一个坐…

Android 物联网 传感器

前几天做了一个嵌入式课设。将传感器收集到的数据传到手机制作的APP里。 项目中涉及到的主要的java代码和xml布局文件上传到了github&#xff0c;https://github.com/123JACK123jack/Android转载于:https://www.cnblogs.com/libin123/p/10578601.html

java已被弱化签名,高效Java第四十条建议:谨慎设计方法签名

作用有助于设计易于学习和使用的API。如何做——谨慎地选择方法的名称1.选择易于理解的&#xff0c;并且与同一个包中的其他名称风格一致的名称。2.选择与大众认可的名称相一致的名称。如何做——不要过于追求提供便利的方法每个方法都应该尽其所能。方法太多会使类难以学习、使…

curl有php内存缓存,PHP CURL内存泄露的解决方法

PHP CURL内存泄露的解决方法curl配置平淡无奇&#xff0c;长时间运行发现一个严重问题&#xff0c;内存泄露&#xff01;不论用单线程和多线程都无法避免&#xff01;是curl访问https站点的时候有bug&#xff01;内存泄露可以通过linux的top命令发现&#xff0c;使用php函数mem…

MySQL学习【第五篇SQL语句上】

一.mysql命令 1.连接服务端命令 1.mysql -uroot -p123 -h127.0.0.1 2.mysql -uroot -p123 -S /tmp/mysql.sock 3.mysql -uroot -p123 -hlocalhost 4.mysql -uroot -p123 2.mysql登陆后的一些命令 1.\h或者help   查看帮助 2.\G       格式化查看数据&#xff08;以k…

phpexcel.php linux,phpexcel在linux系统报错如何解决

最近有个tp3.2的项目迁移到linux系统上了&#xff0c;突然有天发现原本在win server 2008上运行没问题的excel导出功能在新的系统上不能使用了。报错如下&#xff1a;说是1762行有问题&#xff0c;找到这个文件的代码看看&#xff1a;/*** Get an instance of this class** acc…

优雅的redux异步中间件 redux-effect

不吹不黑&#xff0c;redux蛮好用。只是有时略显繁琐&#xff0c;叫我定义每一个action、action type、使用时还要在组件上绑定一遍&#xff0c;臣妾做不到呀&#xff01;下面分享一种个人比较倾向的极简写法&#xff0c;仍有待完善&#xff0c;望讨论。 github: github.com/li…

oracle 中累加函数,Oracle 分析函数分组累加!

用户号码 登陆时间13000000002010-01-0113000000012010-01-0113000000022010-01-0213000000012010-01-0213000000032010-01-0313000000022010-01-0313000000042010-01-0413000000032010-01-0413000000042010-01-0213000000062011-01-0413000000012011-01-04剔除重复登陆的用户,…

asp.net core系列 48 Identity 身份模型自定义

一.概述 ASP.NET Core Identity提供了一个框架&#xff0c;用于管理和存储在 ASP.NET Core 应用中的用户帐户。 Identity添加到项目时单个用户帐户选择作为身份验证机制。 默认情况下&#xff0c;Identity可以使用的 Entity Framework (EF) Core 数据模型。 本文介绍如何自定义…

oracle中创建游标,oracle 存储过程创建游标

Oracle与Sql Server差异点详解1、create函数或存储过程异同点Oracle 创建函数或存储过程一般是 create or replace ……SQL SERVER 则是在创建之前加一条语句&#xff0c;先判断是否已经存在&#xff0c;如果存在删除已有的函数或存储过程。函数语句&#xff1a;if exists (sel…

hosts文件不起作用

突然发现电脑的hosts文件不起作用了。之前用的狠正常&#xff0c;近期也没有修改过。首先排除什么格式、DNS、注册表之类的问题。最终解决办法&#xff08;权限问题&#xff1a;有问题的hosts文件图标上有个锁&#xff09;&#xff1a;1.C:\Windows\System32\drivers\etc下复制…

oracle面临的挑战,未来数据库管理员面临的三大挑战

原标题&#xff1a;未来数据库管理员面临的三大挑战前言今天的数据库管理员面临着三大挑战&#xff1a;工作重心向以应用程序为中心转移、支持多个数据库平台的需求、在云端以及在本地管理数据库性能的责任不断扩大。为了在今天和未来都能站稳脚跟&#xff0c;数据库管理员需要…

Reducer拆分

看到Redux官网上Reducer拆分后&#xff0c;最后生成的state的组合有点懵&#xff0c;主要是对combineReducers()这个工具类不了解&#xff0c;其实该方法是消除了一些样板代码。 如todoApp事例&#xff1a; import { combineReducers } from reduxconst todoApp combineReduce…

oracle中asmcmd,ASM工具asmcmd

Oracle的ASM一直不够透明&#xff0c;但Oracle还是提供了一些工具来访问ASM磁盘组的&#xff0c;asmcdm就是其中一个工具,本文将对其进行详细介绍。感觉Oracle的ASM一直很不透明&#xff0c;不过Oracle还是提供了一些工具来访问ASM磁盘组的&#xff0c;asmcdm就是其中一个工具。…

php页面底部信息居中,css底部如何局中?css三种居中方法

本篇文章给大家带来的内容是关于css底部如何局中&#xff1f;css三种居中方法&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。某天组长让我改一个表格的样式&#xff0c;要求底部局中。当时想很简单的嘛&#xff0c;哼哧哼哧…

打造汽车“安卓平台”,大众或亲手干掉传统汽车产业

干掉传统汽车产业的&#xff0c;很可能是大众&#xff0c;而不是特斯拉。 于无声处听惊雷。 2019年的日内瓦车展&#xff0c;看起来并没有传出太大的新闻。汽车世界的目光&#xff0c;依然被特斯拉的喧嚣所吸引。 然而&#xff0c;大众汽车展台上发生的一件看似不起眼的小事情&…

php返回101,PHP 101:变量与函数

功能很好.我看到功能徽标()比$logo更好. echo不占用太多内存,但$logo确实如此.即使函数logo()需要一些东西,它也将由PHP自己的垃圾收集器处理.您还可以使用这些函数来确保不会滥用分配的内存.> memory_get_peak_usage();> memory_get_usage();说明&#xff1a;Upon the e…