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.pswp.cn/news/536639.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536639.shtml
英文地址,請注明出處:http://en.pswp.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…