欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php中fsockopen用法實例

 更新時間:2023年05月07日 12:11:26   投稿:shichen2014  
這篇文章主要介紹了php中fsockopen用法,實例分析了fsockopen的創(chuàng)建、寫入及關閉等具體流程,需要的朋友可以參考下

本文實例講述了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程序設計有所幫助。

相關文章

最新評論