yxhxj2006

          常用鏈接

          統計

          最新評論

          怎么用PHP發送HTTP請求(POST請求、GET請求)?

          /**
           * 發送post請求
           * 
          @param string $url 請求地址
           * 
          @param array $post_data post鍵值對數據
           * 
          @return string
           
          */
          function send_post($url, $post_data) {

              $postdata = http_build_query($post_data);
              $options = array(
                  'http' =>; array(
                      'method' =>; 'POST',
                      'header' =>; 'Content-type:application/x-www-form-urlencoded',
                      'content' =>; $postdata,
                      'timeout' =>; 15 * 60 // 超時時間(單位:s)
                  )
              );
              $context = stream_context_create($options);
              $result = file_get_contents($url, false, $context);

              return $result;
          }

          使用如下:
          post_data = array(
              'username' => 'stclair2201',
              'password' => 'handan'
          );
          send_post('http://blog.snsgou.com', $post_data);


          實戰經驗:

          當我利用上述代碼給另一臺服務器發送http請求時,發現,如果服務器處理請求時間過長,本地的PHP會中斷請求,即所謂的超時中斷,第一個懷疑的是PHP本身執行時間的超過限制,但想想也不應該,因為老早就按照這篇文章設置了“PHP執行時間限制”(【推薦】PHP上傳文件大小限制大全 ),仔細琢磨,想想,應該是http請求本身的一個時間限制,于是乎,就想到了怎么給http請求時間限制搞大一點。。。。。。查看PHP手冊,果真有個參數 “ timeout ”,默認不知道多大,當把它的值設大一點,問題得已解決


          Socket版本:

          /**
           * Socket版本
           * 使用方法:
           * $post_string = "app=socket&version=beta";
           * request_by_socket('blog.snsgou.com', '/restServer.php', $post_string);
           
          */
          function request_by_socket($remote_server,$remote_path,$post_string,$port = 80,$timeout = 30) {
              $socket = fsockopen($remote_server, $port, $errno, $errstr, $timeout);
              if (!$socket) die("$errstr($errno)");
              fwrite($socket, "POST $remote_path HTTP/1.0");
              fwrite($socket, "User-Agent: Socket Example");
              fwrite($socket, "HOST: $remote_server");
              fwrite($socket, "Content-type: application/x-www-form-urlencoded");
              fwrite($socket, "Content-length: " . (strlen($post_string) + 8) . "");
              fwrite($socket, "Accept:*/*");
              fwrite($socket, "");
              fwrite($socket, "mypost=$post_string");
              fwrite($socket, "");
              $header = "";
              while ($str = trim(fgets($socket, 4096))) {
                  $header .= $str;
              }

              $data = "";
              while (!feof($socket)) {
                  $data .= fgets($socket, 4096);
              }

              return $data;
          }

          Curl版本:
          /**
           * Curl版本
           * 使用方法:
           * $post_string = "app=request&version=beta";
           * request_by_curl('
          http://blog.snsgou.com/restServer.php', $post_string);
           
          */
          function request_by_curl($remote_server, $post_string) {
              $ch = curl_init();
              curl_setopt($ch, CURLOPT_URL, $remote_server);
              curl_setopt($ch, CURLOPT_POSTFIELDS, 'mypost=' . $post_string);
              curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
              curl_setopt($ch, CURLOPT_USERAGENT, "snsgou.com's CURL Example beta");
              $data = curl_exec($ch);
              curl_close($ch);

              return $data;
          }

          Curl版本(2)

          /**
           * 發送HTTP請求
           *
           * 
          @param string $url 請求地址
           * 
          @param string $method 請求方式 GET/POST
           * 
          @param string $refererUrl 請求來源地址
           * 
          @param array $data 發送數據
           * 
          @param string $contentType 
           * 
          @param string $timeout
           * 
          @param string $proxy
           * 
          @return boolean
           
          */
          function send_request($url, $data, $refererUrl = '', $method = 'GET', $contentType = 'application/json', $timeout = 30, $proxy = false) {
              $ch = null;
              if('POST' === strtoupper($method)) {
                  $ch = curl_init($url);
                  curl_setopt($ch, CURLOPT_POST, 1);
                  curl_setopt($ch, CURLOPT_HEADER,0 );
                  curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
                  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                  curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
                  curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
                  if ($refererUrl) {
                      curl_setopt($ch, CURLOPT_REFERER, $refererUrl);
                  }
                  if($contentType) {
                      curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:'.$contentType));
                  }
                  if(is_string($data)){
                      curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                  } else {
                      curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
                  }
              } else if('GET' === strtoupper($method)) {
                  if(is_string($data)) {
                      $real_url = $url. (strpos($url, '?') === false ? '?' : ''). $data;
                  } else {
                      $real_url = $url. (strpos($url, '?') === false ? '?' : ''). http_build_query($data);
                  }

                  $ch = curl_init($real_url);
                  curl_setopt($ch, CURLOPT_HEADER, 0);
                  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:'.$contentType));
                  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                  curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
                  if ($refererUrl) {
                      curl_setopt($ch, CURLOPT_REFERER, $refererUrl);
                  }
              } else {
                  $args = func_get_args();
                  return false;
              }

              if($proxy) {
                  curl_setopt($ch, CURLOPT_PROXY, $proxy);
              }
              $ret = curl_exec($ch);
              $info = curl_getinfo($ch);
              $contents = array(
                      'httpInfo' => array(
                              'send' => $data,
                              'url' => $url,
                              'ret' => $ret,
                              'http' => $info,
                      )
              );

              curl_close($ch);
              return $ret;
          }
          調用 WCF接口 的一個例子:$json = restRequest($r_url,'POST', json_encode($data));

          posted on 2014-12-31 18:57 奮斗成就男人 閱讀(485) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 齐齐哈尔市| 体育| 泾源县| 阿合奇县| 芜湖县| 玛曲县| 崇明县| 称多县| 建平县| 通城县| 新民市| 九江县| 长丰县| 抚远县| 星座| 哈巴河县| 米林县| 凯里市| 三门县| 永定县| 佛教| 安福县| 汪清县| 禄丰县| 福州市| 佛学| 会昌县| 宣威市| 五大连池市| 永仁县| 大港区| 桓台县| 云南省| 永年县| 东台市| 滕州市| 怀化市| 德格县| 万州区| 云龙县| 汕头市|