| 本文介紹一個php實現的http請求封裝類,封裝了三種post提交方法和一個request要求方法,並提供了調用樣本,供大家學習參考。 在php編程調試時,經常需要類比提交。另外,在抓取一些頁面時,需要經常請求別人的頁面。 於是實現了一個http請求的封裝類,以方便調用。本http請求類,封裝了三種post提交方法和一個request要求方法。 1,http請求封閉類 0) { $this->init($params); } } // ----------------------- /** * 參數初始化 * * @param array $params */ public function init($params) { if(count($params) > 0) { foreach($params as $key => $val) { if(isset($this->$key)) { $this->$key = $val; } } } } // ----------------------- /** * 提交請求 * * @param string $url 請求地址 * @param mixed $data 提交的資料 * @param string $type 提交類型,curl,socket,stream可選 */ public function post($url, $data, $type = "socket") { if(!in_array($type, $this->post_type_list)) { die("undefined post type"); } $function_name = $type . "Post"; return call_user_func_array(array($this, $function_name), array($url, $data)); } // ----------------------- /** * 更改預設的ua資訊 * * 本方法常用於類比各種瀏覽器 * * @param string $ua_string UA字串 */ public function setUA($user_agent) { $this->ua_string = $user_agent; return $this; } // ----------------------- /** * 設定本地cookie檔案 * * 在用curl來類比時常需要設定此項 * * @param string $cookie_file 檔案路徑 */ public function setCookieFile($cookie_file) { $this->cookie_file = $cookie_file; return $this; } // ----------------------- /** * curl方式提交 * * @param string $url 請求地址 * @param mixed $data 提交的資料 * @param string $user_agent 自訂的UA * @return mixed */ public function curlPost($url, $data, $user_agent = '') { if($user_agent == '') { $user_agent = $this->ua_string; } if (!is_array($data)) { $data = array($data); } $data = http_build_query($data); if (!function_exists("curl_init")) { die('undefined function curl_init'); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); $rs = curl_exec($ch); curl_close($ch); return $rs; } // ----------------------- /** * 通訊端提交 * * @param string $url 請求地址 * @param mixed $data 提交的資料 * @param string $user_agent 自訂的UA * @param int $port 連接埠 * @param int $timeout 逾時限制 * @return mixed */ public function socketPost($url, $data, $user_agent = '', $port = 80, $timeout = 30) { $url_info = parse_url($url); $remote_server = $url_info['host']; $remote_path = $url_info['path']; $socket = fsockopen($remote_server, $port, $errno, $errstr, $timeout); if(!$socket) { die("$errstr($errno)"); } if($user_agent == '') { $user_agent = $this->ua_string; } if (!is_array($data)) { $data = array($data); } $data = http_build_query($data); fwrite($socket, "POST {$remote_path} HTTP/1.0\r\n"); fwrite($socket, "User-Agent: {$user_agent}\r\n"); fwrite($socket, "HOST: {$remote_server}\r\n"); fwrite($socket, "Content-type: application/x-www-form-urlencoded\r\n"); fwrite($socket, "Content-length: " . strlen($data) . "\r\n"); fwrite($socket, "Accept:*/*\r\n"); fwrite($socket, "\r\n"); fwrite($socket, "{$data}\r\n"); fwrite($socket, "\r\n"); $header = ""; while($str = trim(fgets($socket, 4096))) { $header .= $str; } $data = ""; while(!feof($socket)) { $data .= fgets($socket, 4096); } return $data; } // ----------------------- /** * 檔案流提交 * * @param string $url 提交地址 * @param string $data 資料 * @param string $user_agent 自訂的UA * @return mixed */ public function streamPost($url, $data, $user_agent = '') { if($user_agent == '') { $user_agent = $this->ua_string; } if (!is_array($data)) { $data = array($data); } $data = http_build_query($data); $context = array( 'http' => array( 'method' => 'POST', 'header' => 'Content-type: application/x-www-form-urlencoded' . "\r\n" . 'User-Agent : ' . $user_agent . "\r\n" . 'Content-length: ' . strlen($data), 'content' => $data ) ); $stream_context = stream_context_create($context); $data = file_get_contents($url, FALSE, $stream_context); return $data; } // ----------------------- /** * 發送請求 * * 本方法通過curl函數向目標伺服器發送請求 * * @param string $url 請求地址 * @return mixed */ public function request($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_USERAGENT, !empty($this->ua_string)? $this->ua_string : $_SERVER['HTTP_USER_AGENT']); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); if (isset($this->cookie_file)) { curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookie_file); } $data = curl_exec($ch); curl_close($ch); return $data; } }?>調用樣本: "socket"); $rs[] = $HttpHelper->post($url, $data); $data = array("name"=>"curl"); $rs[] = $HttpHelper->post($url, $data, "curl"); $data = array("name"=>"stream"); $rs[] = $HttpHelper->post($url, $data, "stream"); $rs[] = $HttpHelper->request($url); print_r($rs);?>3,post.php檔案: 4,輸出結果: Array ( [0] => test request:Array ( [name] => socket ) [1] => test request:Array ( [name] => curl ) [2] => test request:Array ( [name] => stream ) [3] => test request:Array ( ) ) |