使用PHP模拟post提交数据
这也是个老生常谈的话题了,上午花了点时间把这个问题整理了一下。
一般来说用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($_POST) && !empty($_POST)) { pr($_POST); } else { pr("NO POST DATA!"); }
下面是用file_get_contents来模拟post:
<?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:
<?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:
<?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信息的,要处理一下才能获得真正的内容。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。