用PHP来模拟post提交数据的方法整理,一般有三种方法,file_get_contents、curl和socket。
写了个公用函数,专门用来打印post数据:

<?php
function pr() {
    $params = func_get_args();
    foreach ($params as $key => $value) {
        echo "<pre>";
        print_r($value);
        echo "</pre>";
    }
}

先写一个post.php,用来接收post数据并打印出来:

<?php
require dirname(__FILE__).'/function.php';

if (isset($_) && !empty($_)) {
    pr($_);
} else {
    pr("NO  DATA!");
}

下面是用file_get_contents来模拟post:

<?php
require dirname(__FILE__).'/function.php';

function file_get_contents_($url, $) {
    $options = array(
        'http' => array(
            'method' => '',
            // 'content' => 'name=caiknife&email=caiknife@gmail.com',
            'content' => http_build_query($),
        ),
    );

    $result = file_get_contents($url, false, stream_context_create($options));

    return $result;
}

$data = file_get_contents_("http://www.a.com//post.php", array('name'=>'caiknife', 'email'=>'caiknife@gmail.com'));

var_dump($data);

很简单是吧?再来看看curl模拟post:

<?php
require dirname(__FILE__).'/function.php';

function curl_($url, $) {
    $options = array(
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HEADER         => false,
        CURLOPT_           => true,
        CURLOPT_POSTFIELDS     => $,
    );

    $ch = curl_init($url);
    curl_setopt_array($ch, $options);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

$data = curl_("http://www.a.com//post.php", array('name'=>'caiknife', 'email'=>'caiknife@gmail.com'));

var_dump($data);

最后是用socket来模拟post:

<?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("\r\n\r\n", $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信息的,要处理一下才能获得真正的内容。

转载原文点此进入

随机文章

自用Angularjs开发环境搭建(国内通用)
自用Angularjs开发环境搭建(国内通用)

Android BlueStacksAppPlayer最新测试版发布
Android BlueStacksAppPlayer最新测试版发布

Java基础第五讲:流程控制(一)
Java基础第五讲:流程控制(一)

android4.0下使用yesvpn访问facebook
android4.0下使用yesvpn访问facebook

相关文章

用java swing画直升飞机
用java swing画直升飞机

终于实现win主机wordpress评论回复发送邮件通知
终于实现win主机wordpress评论回复发送邮件通知

终于等到工行推出android客户端了
终于等到工行推出android客户端了

java编写五子棋
java编写五子棋

你创建的wordpress页面(非默认模板)没问题吗
你创建的wordpress页面(非默认模板)没问题吗

百度开放云BAE下周四扩容
百度开放云BAE下周四扩容

内容分享:道招
本文链接:PHP模拟post提交数结的三种方法
道招声明:除特别标注或作者不详外,本站所有文章均为原创,转载请注明。欢迎共同关注互联网!