php中fsockopen用法實例
本文實例講述了php中fsockopen用法。分享給大家供大家參考。
函數說明:fsockopen — 打開一個網絡連接或者一個Unix套接字連接
語法:
resource fsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )
參數:
- hostname 如果安裝了OpenSSL,那么你也許應該在你的主機名地址前面添加訪問協(xié)議ssl://或者是tls://,從而可以使用基于TCP/IP協(xié)議的SSL或者TLS的客戶端連接到遠程主機。
- port 端口號。如果對該參數傳一個-1,則表示不使用端口,例如unix://。
- errno 如果errno的返回值為0,而且這個函數的返回值為 FALSE ,那么這表明該錯誤發(fā)生在套接字連接(connect())調用之前,導致連接失敗的原因最大的可能是初始化套接字的時候發(fā)生了錯誤。
- errstr 錯誤信息將以字符串的信息返回。
- timeout 設置連接的時限,單位為秒。
返回值:
fsockopen() 將返回一個文件句柄,之后可以被其他文件類函數調用(例如: fgets() , fgetss() , fwrite() , fclose() 還有 feof() )。如果調用失敗,將返回 FALSE 。
php fsockopen使用案例
1、fsockopen 來模擬生成 HTTP 連接
$url="http://www.dbjr.com.cn";
$port=80;
$t=30;
/**fsockopen 抓取頁面
* @parem $url 網頁地址
* @parem $port 端口 默認 80
* @parem $t 設置連接的時間 默認30s
* */
function fsock($url,$port=80,$t=30)
{ $info=parse_url($url);
$fp = fsockopen($info['host'],$port,$errno,$errstr,$t);
if (!$fp)
{
echo "$errstr ($errno)<br />\n";
}
else
{
$out = "GET ".$info['path']." HTTP/1.1".PHP_EOL; $out .= "Host: ".$info['host'].".PHP_EOL; $out .= "Connection: Close".PHP_EOL.PHP_EOL;
fwrite($fp, $out);
$content = '';
while (!feof($fp))
{
$content .= fgets($fp);
}
echo $content;
fclose($fp);
}
}// 函數調用
fsock($url, $port,$t);2、PHP fsockopen模擬POST/GET方法
fsockopen除了像上面實例模擬生成 HTTP 連接之外,還能實現很多功能,比如模擬post 和 get 傳送數據的方法?!?/p>
$url = "http://localhost/test/test.php"; #url 地址必須 http://xxxxx
$port=80;
$t=30;
$data = array(
'foo'=>'bar',
'baz'=>'boom',
'site'=>'www.dbjr.com.cn',
'name'=>'nowa magic');
/**fsockopen 抓取頁面
* @parem $url 網頁地址 host 主機地址 * @parem $port 網址端口 默認80 * @parem $t 腳本請求時間 默認30s
* @parem $method 請求方式 get/post
* @parem $data 如果單獨傳數據為 post 方式
* @return 返回請求回的數據
* */
function sock_data($url,$port=80,$t=30,$method='get',$data=null)
{
$info=parse_url($url);
$fp = fsockopen($info["host"],$port, $errno, $errstr,$t);
// 判斷是否有數據
if(isset($data) && !empty($data))
{
$query = http_build_query($data); // 數組轉url 字符串形式
}else
{
$query=null;
}
// 如果用戶的$url "http://www.dbjr.com.cn/"; 缺少 最后的反斜杠
if(!isset($info['path']) || empty($info['path']))
{
$info['path']="/index.html";
}
// 判斷 請求方式
if($method=='post')
{
$head = "POST ".$info['path']." HTTP/1.0".PHP_EOL;
}else
{
$head = "GET ".$info['path']."?".$query." HTTP/1.0".PHP_EOL;
}
$head .= "Host: ".$info['host'].PHP_EOL; // 請求主機地址
$head .= "Referer: http://".$info['host'].$info['path'].PHP_EOL;
if(isset($data) && !empty($data) && ($method=='post'))
{
$head .= "Content-type: application/x-www-form-urlencoded".PHP_EOL;
$head .= "Content-Length: ".strlen(trim($query)).PHP_EOL;
$head .= PHP_EOL;
$head .= trim($query);
}else
{
$head .= PHP_EOL;
}
$write = fputs($fp, $head); //寫入文件(可安全用于二進制文件)。 fputs() 函數是 fwrite() 函數的別名
while (!feof($fp))
{
$line = fread($fp,4096);
echo $line;
}
}
// 函數調用
sock_data($url,$port,$t,'post',$data);3、fsockopen以Socket方式模擬HTTP下載文件
PHP設置腳本最大執(zhí)行時間的三種方法
1.php.ini文件中 max_execution_time = 120;
2、通過PHP的ini_set函數設置
ini_set("max_execution_time", "120");
3、通過set_time_limit 函數設置
set_time_limit(120);
以上幾個數字設置為0則無限制,腳本會一直執(zhí)行下去,直到執(zhí)行結束。
set_time_limit(0);
$url = 'http://localhost/test/img.zip';
$port = '80';
/** sockopen 下載文件
* @parem $url 訪問文件的url 地址
* @parem $port 默認 80 * @parem $down_name 下載指定路徑文件名稱 例如 ../aa.zip
* */
function sock_down($url,$port=80,$down_name=null)
{
$info=parse_url($url);
# 建立連接
$fp = fsockopen($info["host"],$port,$errno,$errstr,$t);
/*
為資源流設置阻塞或者阻塞模式 參數:資源流(),0是非阻塞,1是阻塞
bool stream_set_blocking ( resource $stream , int $mode )
阻塞的好處是,排除其它非正常因素,阻塞的是按順序執(zhí)行的同步的讀取。將會一直等到從資源流里面獲取到數據才能返回
而非阻塞,因為不必等待內容,所以能異步的執(zhí)行,現在讀到讀不到都沒關系,執(zhí)行讀取操作后會立即返回數據
* */
stream_set_blocking($fp, 1);
if(!$fp)
{
echo "$errno : $errstr<br/>";
}
else
{
# 發(fā)送一個HTTP請求信息頭
$request_header="GET ".$info['path']." HTTP/1.1".PHP_EOL;
# 起始行
# 頭域
$request_header.="Host: ".$info["host"].PHP_EOL;
# 再一個回車換行表示頭信息結束
$request_header.=PHP_EOL;
# 發(fā)送請求到服務器
fputs($fp,$request_header);
if(!isset($down_name) || empty($down_name))
{
$down_name=basename($url); //默認當前文件同目錄
}
# 接受響應
$fp2=fopen($down_name,'w'); // 要下載的文件名 下載到指定目錄
$line='';
while (!feof($fp))
{
$line.= fputs($fp2,fgets($fp));
}
if(feof($fp))
{
echo "<script>alert('已下載到當前目錄')</script>";
}
# 關閉
fclose($fp2);
fclose($fp);
}
}
//函數調用
sock_down($url,$port);4、使用 fsockopen 偽造來源網址、路徑
http://www.dbjr.com.cn/article/93173.htm
下面是其他網友的補充
具體實現方法如下:
實例一
$fp=fsockopen("127.0.0.1",80);???? //打開數據流
if(!$fp)?????????? //如果打開出錯
{
? echo "unable to openn";?????? //輸出內容
}
else??????????? //如果成功打開
{
? fwrite($fp,"get / http/1.0rnrn");???? //向數據流寫入內容
? stream_set_timeout($fp,2);?????? //進行超時設置
? $res=fread($fp,2000);??????? //讀取內容
? $info=stream_get_meta_data($fp);????? //獲取數據流報頭
? fclose($fp);????????? //關閉數據流
? if($info['timed_out'])??????? //如果超時
? {
??? echo 'connection timed out!';????? //輸出內容
? }
? else
? {
??? echo $res;????????? //輸出讀取內容
? }
}實例二
//創(chuàng)建服務端
$socket=stream_socket_server("tcp://0.0.0.0:8000",$errno,$errstr);
//如果創(chuàng)建失敗
if(!$socket)
{
? echo "$errstr ($errno)<br />n";
}
//如果創(chuàng)建成功
else
{
? //接受連接
? while($conn=stream_socket_accept($socket))
? {
??? //寫入數據
??? fwrite($conn,'the local time is '.date('n/j/y g:i a')."n");
??? //關閉連接
??? fclose($conn);
? }
? //關閉socket
? fclose($socket);
}
//
$file="test.txt";?????? //定義文件
$fp=fopen($file,"w");????? //打開數據流
if($fp)??????? //如果成功打開
{
? stream_set_write_buffer($fp,0);?? //設置緩沖區(qū)
? fwrite($fp,$output);????? //寫入內容
? fclose($fp);?????? //關閉數據流
}希望本文所述對大家的php程序設計有所幫助。
相關文章
php正則取img標記中任意屬性(正則替換去掉或改變圖片img標記中的任意屬性)
因有一項目新聞發(fā)布系統(tǒng),數據庫內容字段中存儲的是原圖的路徑(當然還有其他文字內容啦,內容里插圖時,存的是圖片路徑),但前臺想使用縮略圖,琢磨1小時余,得到以下結果,可解決問題2013-08-08
基于HBase Thrift接口的一些使用問題及相關注意事項的詳解
本篇文章是對HBase Thrift接口的一些使用問題及相關注意事項進行了詳細的分析介紹,需要的朋友參考下2013-06-06

