zoukankan      html  css  js  c++  java
  • 使用PHP模拟post提交数据

    使用PHP模拟post提交数据

    分类: PHP LAMP

    这也是个老生常谈的话题了,上午花了点时间把这个问题整理了一下。

    一般来说用PHP来模拟post提交数据有三种方法,file_get_contents、curl和socket。

    写了个公用函数,专门用来打印post数据:

    [php] view plaincopyprint?
    1. <?php  
    2. function pr() {  
    3.     $params = func_get_args();  
    4.     foreach ($params as $key => $value) {  
    5.         echo "<pre>";  
    6.         print_r($value);  
    7.         echo "</pre>";  
    8.     }  
    9. }  
    <?php
    function pr() {
        $params = func_get_args();
        foreach ($params as $key => $value) {
            echo "<pre>";
            print_r($value);
            echo "</pre>";
        }
    }

    先写一个post.php,用来接收post数据并打印出来:
    1. <?php  
    2. require dirname(__FILE__).'/function.php';  
    3.   
    4. if (isset($_POST) && !empty($_POST)) {  
    5.     pr($_POST);  
    6. else {  
    7.     pr("NO POST DATA!");  
    8. }  
    <?php
    require dirname(__FILE__).'/function.php';
    
    if (isset($_POST) && !empty($_POST)) {
        pr($_POST);
    } else {
        pr("NO POST DATA!");
    }

    下面是用file_get_contents来模拟post:
    1. <?php  
    2. require dirname(__FILE__).'/function.php';  
    3.   
    4. function file_get_contents_post($url, $post) {  
    5.     $options = array(  
    6.         'http' => array(  
    7.             'method' => 'POST',  
    8.             // 'content' => 'name=caiknife&email=caiknife@gmail.com',   
    9.             'content' => http_build_query($post),  
    10.         ),  
    11.     );  
    12.   
    13.     $result = file_get_contents($url, false, stream_context_create($options));  
    14.   
    15.     return $result;  
    16. }  
    17.   
    18. $data = file_get_contents_post("http://www.a.com/post/post.php", array('name'=>'caiknife', 'email'=>'caiknife@gmail.com'));  
    19.   
    20. var_dump($data);  
    <?php
    require dirname(__FILE__).'/function.php';
    
    function file_get_contents_post($url, $post) {
        $options = array(
            'http' => array(
                'method' => 'POST',
                // 'content' => 'name=caiknife&email=caiknife@gmail.com',
                'content' => http_build_query($post),
            ),
        );
    
        $result = file_get_contents($url, false, stream_context_create($options));
    
        return $result;
    }
    
    $data = file_get_contents_post("http://www.a.com/post/post.php", array('name'=>'caiknife', 'email'=>'caiknife@gmail.com'));
    
    var_dump($data);

    很简单是吧?再来看看curl模拟post:
    1. <?php  
    2. require dirname(__FILE__).'/function.php';  
    3.   
    4. function curl_post($url, $post) {  
    5.     $options = array(  
    6.         CURLOPT_RETURNTRANSFER => true,  
    7.         CURLOPT_HEADER         => false,  
    8.         CURLOPT_POST           => true,  
    9.         CURLOPT_POSTFIELDS     => $post,  
    10.     );  
    11.   
    12.     $ch = curl_init($url);  
    13.     curl_setopt_array($ch, $options);  
    14.     $result = curl_exec($ch);  
    15.     curl_close($ch);  
    16.     return $result;  
    17. }  
    18.   
    19. $data = curl_post("http://www.a.com/post/post.php", array('name'=>'caiknife', 'email'=>'caiknife@gmail.com'));  
    20.   
    21. var_dump($data);  
    <?php
    require dirname(__FILE__).'/function.php';
    
    function curl_post($url, $post) {
        $options = array(
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HEADER         => false,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => $post,
        );
    
        $ch = curl_init($url);
        curl_setopt_array($ch, $options);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }
    
    $data = curl_post("http://www.a.com/post/post.php", array('name'=>'caiknife', 'email'=>'caiknife@gmail.com'));
    
    var_dump($data);
    

    最后是用socket来模拟post:
    1. <?php  
    2. require dirname(__FILE__).'/function.php';  
    3.   
    4. function socket_post($url, $post) {  
    5.     $urls = parse_url($url);  
    6.     if (!isset($urls['port'])) {  
    7.         $urls['port'] = 80;  
    8.     }  
    9.   
    10.     $fp = fsockopen($urls['host'], $urls['port'], $errno, $errstr);  
    11.     if (!$fp) {  
    12.         echo "$errno, $errstr";  
    13.         exit();  
    14.     }  
    15.   
    16.     $post = http_build_query($post);  
    17.     $length = strlen($post);  
    18.     $header = <<<HEADER  
    19. POST {$urls['path']} HTTP/1.1  
    20. Host: {$urls['host']}  
    21. Content-Type: application/x-www-form-urlencoded  
    22. Content-Length: {$length}  
    23. Connection: close  
    24.   
    25. {$post}  
    26. HEADER;  
    27.   
    28.     fwrite($fp, $header);  
    29.     $result = '';  
    30.     while (!feof($fp)) {  
    31.         // receive the results of the request   
    32.         $result .= fread($fp, 512);  
    33.     }  
    34.     $result = explode(" ", $result, 2);  
    35.     return $result[1];  
    36. }  
    37.   
    38. $data = socket_post("http://www.a.com/post/post.php", array('name'=>'caiknife', 'email'=>'caiknife@gmail.com'));  
    39.   
    40. var_dump($data);  
    <?php
    require dirname(__FILE__).'/function.php';
    
    function socket_post($url, $post) {
        $urls = parse_url($url);
        if (!isset($urls['port'])) {
            $urls['port'] = 80;
        }
    
        $fp = fsockopen($urls['host'], $urls['port'], $errno, $errstr);
        if (!$fp) {
            echo "$errno, $errstr";
            exit();
        }
    
        $post = http_build_query($post);
        $length = strlen($post);
        $header = <<<HEADER
    POST {$urls['path']} HTTP/1.1
    Host: {$urls['host']}
    Content-Type: application/x-www-form-urlencoded
    Content-Length: {$length}
    Connection: close
    
    {$post}
    HEADER;
    
        fwrite($fp, $header);
        $result = '';
        while (!feof($fp)) {
            // receive the results of the request
            $result .= fread($fp, 512);
        }
        $result = explode("
    
    ", $result, 2);
        return $result[1];
    }
    
    $data = socket_post("http://www.a.com/post/post.php", array('name'=>'caiknife', 'email'=>'caiknife@gmail.com'));
    
    var_dump($data);
    

    这三种方法最后看到的内容都是一样的,但是在是用socket的时候,发送header信息时必须要注意header的完整信息,比如content type和content length必须要有,connection: close和post数据之间要空一行,等等;而通过socket取得的内容是包含了header信息的,要处理一下才能获得真正的内容。
  • 相关阅读:
    左孩子右兄弟的字典树
    UVA 1401 Remember the Word
    HDOJ 4770 Lights Against Dudely
    UvaLA 3938 "Ray, Pass me the dishes!"
    UVA
    Codeforces 215A A.Sereja and Coat Rack
    Codeforces 215B B.Sereja and Suffixes
    HDU 4788 Hard Disk Drive
    HDU 2095 find your present (2)
    图的连通性问题—学习笔记
  • 原文地址:https://www.cnblogs.com/honeynm/p/4155529.html
Copyright © 2011-2022 走看看