php fsockopen使用


函數說明:fsockopen — 打開一個網絡連接或者一個Unix套接字連接

語法:

resource fsockopen  ( string $hostname  [, int $port  = -1  [, int &$errno  [, string &$errstr  [, float $timeout  = ini_get("default_socket_timeout")  ]]]] )

參數:

  1. hostname 如果安裝了OpenSSL,那么你也許應該在你的主機名地址前面添加訪問協議ssl://或者是tls://,從而可以使用基於TCP/IP協議的SSL或者TLS的客戶端連接到遠程主機。 
  2. port 端口號。如果對該參數傳一個-1,則表示不使用端口,例如unix://。 
  3. errno 如果errno的返回值為0,而且這個函數的返回值為 FALSE ,那么這表明該錯誤發生在套接字連接(connect())調用之前,導致連接失敗的原因最大的可能是初始化套接字的時候發生了錯誤。 
  4. errstr 錯誤信息將以字符串的信息返回。 
  5. timeout 設置連接的時限,單位為秒。

返回值:

  fsockopen() 將返回一個文件句柄,之后可以被其他文件類函數調用(例如: fgets() , fgetss() , fwrite() , fclose() 還有 feof() )。如果調用失敗,將返回 FALSE 。

php fsockopen使用案例

  1、fsockopen 來模擬生成 HTTP 連接 

$url="http://www.manongjc.com";
$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 傳送數據的方法。 

$url = "http://localhost/test/test.php"; #url 地址必須 http://xxxxx $port=80;
$t=30;
$data = array(
    'foo'=>'bar',
    'baz'=>'boom',
    'site'=>'www.manongjc.com',
    '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.manongjc.com/"; 缺少 最后的反斜杠 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設置腳本最大執行時間的三種方法    1、在php.ini里面設置

/** 
PHP設置腳本最大執行時間的三種方法
   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則無限制,腳本會一直執行下去,直到執行結束。 *
*/ 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 ) 阻塞的好處是,排除其它非正常因素,阻塞的是按順序執行的同步的讀取。將會一直等到從資源流里面獲取到數據才能返回 而非阻塞,因為不必等待內容,所以能異步的執行,現在讀到讀不到都沒關系,執行讀取操作后會立即返回數據 * */ stream_set_blocking($fp, 1); if(!$fp) { echo "$errno : $errstr<br/>"; } else { # 發送一個HTTP請求信息頭 $request_header="GET ".$info['path']." HTTP/1.1".PHP_EOL; # 起始行 # 頭域 $request_header.="Host: ".$info["host"].PHP_EOL; # 再一個回車換行表示頭信息結束 $request_header.=PHP_EOL; # 發送請求到服務器 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 偽造來源網址、路徑

  php 偽造HTTP_REFERER頁面URL來源的三種方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM