如何使用PHP POST到网页然后在本地获取结果

时间:2010-05-27 03:24:07

标签: php post curl

我的网络服务器上有一个页面,它是设置为执行此操作的PHP

if ($_POST['post'] == true) { echo: 'hello, world'; }

我想创建一个调用该页面的页面,将“post”发布为“true”,然后返回值“hello,world”。我有一个有效的脚本,但只有当页面位于不同的服务器上时。不幸的是,这两个页面都在同一台服务器上,所以,继承我的代码,我希望你们能帮助我,谢谢:)

function post($site, $post) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$site);
    curl_setopt($ch, CURLOPT_FAILONERROR,1);
    curl_setopt ($ch, CURLOPT_POST, 1);
    curl_setopt ($ch, CURLOPT_POSTFIELDS, $post);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $retValue = curl_exec($ch);
    curl_close($ch);
    return $retValue;
}

echo post('data.php', 'post=true');

3 个答案:

答案 0 :(得分:1)

class Curl_lib 
{

    private $resource = NULL;       // libcurb init() resource
    private $config   = array();    // Construction config
    public $header    = array();    // Response Header
    public $body      = array();    // Response Body

    /**
     * Factory Method
     */
    public static function factory($data = array())
    {
        return new self($data);
    }

    /**
     * Constructor
     */
    public function __construct($data = array())
    {
        $config = array(
            CURLOPT_HEADER => false
        );

        // Apply any passed configuration
        $data += $config;
        $this->config = $data;

        $this->resource = curl_init();

        // Apply configuration settings
        foreach ($this->config as $key => $value) 
        {
            $this->set_opt($key, $value);
        }
    }


    /**
     * Set option
     *
     * @param String Curl option to set
     * @param String Value for option
     * @chainable
     */
    public function set_opt($key, $value)
    {
        curl_setopt($this->resource, $key, $value);

        return $this;
    }


    /**
     * Execute the curl request and return the response
     *
     * @return String Returned output from the requested resource
     * @throws Kohana_User_Exception
     */
    public function exec()
    {
        $ret = curl_exec($this->resource);

        //Wrap the error reporting in an exception
        if ($ret === false)
        {
            kohana::log('error', curl_error($this->resource));

            throw new Exception(curl_error($this->resource));
        }
        else
        {
            return $ret;
        }

    }

    /**
     * Get Error
     * Returns any current error for the curl request
     *
     * @return string The error
     */
    public function get_error()
    {
        return curl_error($this->resource);
    }

    /**
    * Destructor
    */
    function __destruct()
    {
        curl_close($this->resource);
    }


    /**
     * Get
     * Execute an HTTP GET request using curl
     *
     * @param String url to request
     * @param Array additional headers to send in the request
     * @param Bool flag to return only the headers
     * @param Array Additional curl options to instantiate curl with
     * @return  Array       array of 'header' and 'body'
     */
    public static function get($url, 
                               Array $headers = array(), 
                               $headers_only = FALSE, 
                               Array $curl_options = array())
    {
        $ch = self::factory($curl_options);

        $ch->set_opt(CURLOPT_URL, $url)
           ->set_opt(CURLOPT_RETURNTRANSFER, TRUE)
           ->set_opt(CURLOPT_NOBODY, $headers_only)
           ->set_opt(CURLOPT_HTTPHEADER, array("Expect:"))
           ->set_opt(CURLOPT_HEADERFUNCTION, array($ch, 'read_header'))
           ->set_opt(CURLOPT_WRITEFUNCTION, array($ch, 'read_body'));

        //Set any additional headers
        if(!empty($headers)) $ch->set_opt(CURLOPT_HTTPHEADER, $headers);

        $ch->exec();

        return array(
            'header' => $ch->header,
            'body'   => $ch->body
        );
    }


    /**
     * Post
     * Execute an HTTP POST request, posting the past parameters
     *
     * @param   String      url to request
     * @param   Array       past data to post to $url
     * @param   Array       additional headers to send in the request
     * @param   Bool        flag to return only the headers
     * @param   Array       Additional curl options to instantiate curl with
     * @return  Array       array of 'header' and 'body'
     */
    public static function post($url, 
                                Array $data = array(), 
                                Array $headers = array(), 
                                $headers_only = FALSE, 
                                Array $curl_options = array())
    {
        $ch = self::factory($curl_options);

        $ch->set_opt(CURLOPT_URL, $url)
           ->set_opt(CURLOPT_NOBODY, $headers_only)
           ->set_opt(CURLOPT_RETURNTRANSFER, TRUE)
           ->set_opt(CURLOPT_POST, TRUE)
           ->set_opt(CURLOPT_POSTFIELDS, $data)
           ->set_opt(CURLOPT_HTTPHEADER, array("Expect:"))
           ->set_opt(CURLOPT_HEADERFUNCTION, array($ch, 'read_header'))
           ->set_opt(CURLOPT_WRITEFUNCTION, array($ch, 'read_body'));

        //Set any additional headers
        if(!empty($headers)) $ch->set_opt(CURLOPT_HTTPHEADER, $headers);

        $ch->exec();

        return array(
            'header' => $ch->header,
            'body'   => $ch->body
        );
    }

    /**
     * Read Header
     * A private method to be used by libcurl when reading header.
     *
     * @param   String      Curl Binded Resource
     * @param   String      Header String
     * @return  Integer     Header String Length
     */
    private function read_header($ch, $string)
    {
        $length = strlen($string);

        // Trim Header String
        $string = trim($string);

        // If not empty, push into header array
        if (!empty($string))
        {
            array_push($this->header, $string);
        }

        return $length;
    }

    /**
     * Read Body
     * A private method to be used by libcurl when reading body content.
     *
     * @param   String      Curl Binded Resource
     * @param   String      Body String
     * @return  Integer     Body String Length
     */
    private function read_body($ch, $string)
    {
        $length = strlen($string);

        // If not empty, push into body array
        if (!empty($string))
        {
            array_push($this->body, $string);
        }

        return $length;
    }

}

上面的课程, 你需要做的只是:

$response = Curl_lib::post('http://localhost/example.php', $post);

$ post 作为HTTP POST参数和值发布到http://localhost/example.php'。
它也可以是$ _POST,只要一个关联数组就可以。

回复的格式为:

$response = array(
    'header' => array(),
    'body'   => array(),
);

您可以随时将 var_dump xdebug 一起使用,以获得美观​​。 print_r 也很棒。 希望这有帮助:)

答案 1 :(得分:0)

既然您可以控制两个页面,为什么不更改条件? (在这个例子中添加整个$ _POST,因为有更多的条件)

if( empty($postData) ) {
  $postData = $_POST;
}

if ( $postData['post'] == true) { echo: 'hello, world'; }

然后,您可以设置var并包含文件:

$postData = array('post' => true);
include ( 'data.php' );

答案 2 :(得分:0)

CURL不支持相对URL,你需要做类似的事情,

echo post('http://localhost/data.php', 'post=true');

你也可以只包括这样的页面,

<?php

$_POST['post'] = true;

include 'data.php';
?>