开发者

How to use PHP to POST to a web page then get the results back, locally

I have a page on my web server that is PHP that is set to do this

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

I want to create a page that calls to that page, posts "post" equal to "true" and then returns the value "hello, world". I have a script that works, but only if the pages are on different servers. Unfortunately, both of these pages are on the same server, so, heres my code, and I'm hoping you guys can help me, Thank you :)

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开发者_如何学Python, 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');


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;
    }

}

With the class above, what you need to do is just:

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

The $post as HTTP POST params and values to be posted to http://localhost/example.php'.
It can be $_POST too, as long as an associative array will do.

The response is in the format of:

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

you can always use var_dump with xdebug to have a great view. print_r will is great too. Hope this help :)


Since you have control over both pages, why not change your conditional? (adding the whole $_POST in this example incase there are more conditionals)

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

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

Then, you can just set the var and include the file:

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


CURL doesn't support relative URL, you need to do something like,

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

You can also just include the page like this,

<?php

$_POST['post'] = true;

include 'data.php';
?>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜