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';
?>
精彩评论