demo如下:
//fsockopen()用于打开一个socket网络连接,类似与python中以下代码:
"""
# 初始化socket
client = socket.socket()
# 链接服务端
client.connect(('127.0.0.1', 8000))
# 向服务端发送信息
client.send(b'this is client')
# 接受服务端消息,一次最多1024个字节
recive_msg = client.recv(1024)
"""
$fp = fsockopen("www.baidu.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo '<pre>';
echo '*****************************************';
echo "$errstr ($errno)<br />\n";
echo '*****************************************';
echo '</pre>';
} else {
//构建响应给浏览器的http头信息
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: baidu.com\r\n";
$out .= "name:longqiqi\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
echo '<pre>';
echo '------------------------------------------------';
while (!feof($fp)) {
echo fgets($fp, 128);
}
echo '------------------------------------------------';
echo '</pre>';
fclose($fp);
}
else结构体中的$out是构建响应给浏览器的http头信息格式, 不能缺少。
拼接上HTTP头信息后,把fsockopen获取到的网页内容相应给浏览器
demo2
$url = "http://localhost/test/test.php"; #url 地址必须 http://xxxxx
$port = 80;
$t = 30;
$data = array(
'foo' => 'bar',
'baz' => 'boom',
'site' => 'www.manongjc.com',
'name' => 'nowa magic');
/**fsockopen 抓取页面
* @parem $url 网页地址 host 主机地址
* @parem $port 网址端口 默认80
* @parem $t 脚本请求时间 默认30s
* @parem $method 请求方式 get/post
* @parem $data 如果单独传数据为 post 方式
* @return 返回请求回的数据
* */
function sock_data($url, $port = 80, $t = 30, $method = 'get', $data = null)
{
$info = parse_url($url);
$fp = fsockopen($info["host"], $port, $errno, $errstr, $t);
// 判断是否有数据
if (isset($data) && !empty($data)) {
$query = http_build_query($data); // 数组转url 字符串形式
} else {
$query = null;
}
// 如果用户的$url "http://www.manongjc.com/"; 缺少 最后的反斜杠
if (!isset($info['path']) || empty($info['path'])) {
$info['path'] = "/index.html";
}
// 判断 请求方式
if ($method == 'post') {
$head = "POST " . $info['path'] . " HTTP/1.0" . PHP_EOL;
} else {
$head = "GET " . $info['path'] . "?" . $query . " HTTP/1.0" . PHP_EOL;
}
$head .= "Host: " . $info['host'] . PHP_EOL; // 请求主机地址
$head .= "Referer: http://" . $info['host'] . $info['path'] . PHP_EOL;
if (isset($data) && !empty($data) && ($method == 'post')) {
$head .= "Content-type: application/x-www-form-urlencoded" . PHP_EOL;
$head .= "Content-Length: " . strlen(trim($query)) . PHP_EOL;
$head .= PHP_EOL;
$head .= trim($query);
} else {
$head .= PHP_EOL;
}
$write = fputs($fp, $head); //写入文件(可安全用于二进制文件)。 fputs() 函数是 fwrite() 函数的别名
while (!feof($fp)) {
$line = fread($fp, 4096);
echo $line;
}
}
// 函数调用
sock_data($url, $port, $t, 'post', $data);