PHP网络编程(与网络互联)

一、 访问其他网站

① 直接以类似于访问自己硬盘上一个文本文件的方式来访问其他网站:

fopen('http://www.example.com/','r');

# fopen用来打开网页时其参数不变(仍然是'r','w'和'a'),不过现在我们访问的其他网站,所以只能和只读('r')的方式打开

## 必须在文件夹之后加一个反斜杠,因为fopen()函数不支持重定向,否则将会出错。

### PS:若是想要实现此功能并长期使用之前,我们应该先去调查一下其他网站上检索数据的合法性。大部分网站包含具有版权的信息。

② 完整例子:

if(isset($_GET['symbol']) && !empty($_GET['symnol'])) {
      $url = sprintf('http://quote.yahoo.com/d/quotes.csv/s=%s&f=nl1',$_GET['symbol']);
$fp = fopen($url,'r');
$read = fgetcsv($fp);
fclose($fp);
if(strcasecmp($read[0], $_GET['symbol'] != 0 )){
echo '
The lastest value for '.$read[0].'('.$_GET['symbol'].') is $'.$read[1].'';
}else{
    echo '
Invalid symbol
';
}
}
?>

二、PHP scoket编程

1. 含义

    即两台计算机相互通信的通道

2. 使用

① 打开一个socket

$fp = fsockopen($url,$port,$error_number,$error_string,$timeout);

# 参数对应

fsockopen(URL,端口号,一个存放错误编号的变量,一个存放错误信息字符串的变量,超时等待时间));

## 只有第一个参数是必要的

② purse_url()

这个函数输入一个URL,通过将其结构分解成几个部分来将其转变为一个关联数组

# 组成URL的几个基本部分分别为:协议名(scheme)、主机名(host)、端口号(port)、文件路径(path)、查询参数(query)

③ 完整例子

function check_url($url){
$url_parse = parse_url($url);
$path = (isset($url_parse['path'])) ? $url_parse['path'] : '/';
$port = (isset($url_parse['port'])) ? $url_parse['port'] : '80';
if($fp = fsockopen($url_parse['host'], $port, $errno, $error, 30)){
$send = "HEAD $path HTTP/1.1\r\n";
$send .= "HOST:{$url_parse['host']}\r\n";
$send .= "CONNECTION:Close\r\n\r\n";
fwrite($fp, $send);
$data = fget($fp,128);
fclose($fp);
list($response,$code) = explode(' ', $data);
if($code == 200){
return array($code, 'good');
}else{
return array($code, 'bad');
}
}else{
return array($code, 'bad');
}
}
$urls = array(
'http://www.larryullman.com/',
'http://www.larryullman.com/wp-admin/',
'http://www.yiiframework.com/tutorials/',
'http://video.google.com/videoplay?docid=5137581991288263801&q=loose+change'
);
echo "

Validating URLs

";
set_time_limit(0);
foreach ($urls as $url) {
list($code, $class) = check_url($url);
echo '

$url($code)

\n';
}
?>

三、使用IP地址查询

  下面的例子会使用一个与网络相关的PHP函数:gethostbyname()函数。该函数返回给定域名的IP地址。

  要使用IP地址进行地理地址查询,必须连接到GeoIP数据库。这里使用由freegeoip.net提供的简单的在线服务

  其请求路径格式要求为:http://freegeoip.net/(数据格式)/(要查询的IP地址)

  完整示例如下:

function show_ip_info($ip){
$url = 'http:/freegeoip.net/csv/' .$ip;
$fp = fopen($fp);
$read = fgetcsv($fp);
fclose($fp);
echo "

IP Address: $ip

Country:$read[2]

City, State:$read[5],$read[3]

Latitude:$read[7]

Longtude:$read[8]

";
}
echo '

Our spies tell us the following informatin about you
';
show_ip_info($_SERVER['REMOTE_ADDR']);
$url = 'www.etropy.ch';
echo '

Our spies tell us the following informatin about the URL $url

';
show_ip_info(gethostbyname($url));
  ?>

  四、使用CURL

  1. 初始化

curl_init('www.example.com'); 或 curl_init();

  2. 执行函数

curl_exec($curl);

  3. CURL方法:

  ① 如果发生错误,直接运行失败:CURLOPT_FAILONERROR

curl_setopt($curl, CURLOPT_FOLLOWERROR,1);

  ② 支持重定向:CURLOPT_FOLLOWLOCATION

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);

  ③ 设置是否将处理结果存入一个变量的选项:CURLOPT_RETURNTRANSFER

curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);

  ④ 设置超时时间:CURLOPT_TIMEOUT

# 设置尝试执行该事务的时长,以秒为单位,在互联网的时间时,5秒简直就是“无限长”了

  curl_setopt($curl, CURLOPT_TIMEOUT, 5);

  ⑥ 设置curl使用POST方法:CURLOPT_POST

  curl_setopt($curl, CURLOPT_POST, 1);

  ⑦ 设置POST数据:CURLOPT_POSTFIELED

curl_setopt($curl, CURLOPT_POSTFIELED, 'name=foo&pass=bar&format=csv');

  ⑧ 如果网页有HTTP身份验证保护,请使用如下设置:CURLOPT_USERPWD

curl_setopt($curl, CURLOPT_USERPWD, 'username:password');

  4. 完整示例

$url = 'http://localhost/service.php';
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_FAILONERROR, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);;
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, 'name=foo&pass=bar&format=csv');
$r = curl_exec($curl);
curl_close();
print_r($r);
?>

你可能感兴趣的:(PHP网络编程(与网络互联))