fsockopen 实现模拟网站请求
可以使用fsockopen实现简单的异步请求,模拟http报文请求,这里是关于 post请求的例子:
client.php
<?php header('Content-type: text/html;charset=utf8'); $url = 'http://h5.cleey.com/home/index/index'; $post = array( 'mid' => 23, 'more'=> 'hello' ); sock_post($url,$post); function sock_post($url,$post){ $info = parse_url($url); // 解析url $text = http_build_query($post); // 与服务器建立连接 // 参数意义:h5.cleey.com(也可以直接写IP),端口,错误编号,错误信息,超时时间. // 利用超时时间可以很短的退出。而目标地址,可以ignore user abort,继续执行。 $fp = fsockopen($info['host'], 80, $errno, $errstr, 1000) ; if (!$fp) { echo "$errstr ($errno)<br />\n";return; } // 模拟http 报文了。 $out = "POST {$info['path']}?{$info['query']} HTTP/1.1\r\n"; $out .= "Host: {$info['host']}\r\n"; $out .= "Content-type:application/x-www-form-urlencoded\r\n"; $out .= "Content-length: ".strlen($text)."\r\n"; $out .= "Connection: close\r\n\r\n"; $out .= $text; fputs($fp, $out); // 做请求。 /*执行结果 可以直接忽略,我们只需通知目标地址就行了,不需要知道执行结果*/ echo '<pre>'; while (!feof($fp)) { echo fgets($fp, 1024); } /*执行结果 结束*/ fclose($fp); } ?>
sever.php
echo 'Welcome to use PhpPoem!'; echo '<pre>'; echo '$_REQUEST 变量为:<br>'; var_export($_REQUEST); exit;
执行 client.php 的结果如下:
HTTP/1.1 200 OK Server: nginx/1.0.15 Date: Mon, 14 Mar 2016 03:30:31 GMT Content-Type: text/html;charset=utf-8 Transfer-Encoding: chunked Connection: close X-Powered-By: PhpPoem_v2.0 63 Welcome to use PhpPoem! $_REQUEST 变量为: array ( 'mid' => '23', 'more' => 'hello', ) 0