一、 访问其他网站
① 直接以类似于访问自己硬盘上一个文本文件的方式来访问其他网站:
fopen('http://www.example.com/','r');
# fopen用来打开网页时其参数不变(仍然是'r','w'和'a'),不过现在我们访问的其他网站,所以只能和只读('r')的方式打开
## 必须在文件夹之后加一个反斜杠,因为fopen()函数不支持重定向,否则将会出错。
### PS:若是想要实现此功能并长期使用之前,我们应该先去调查一下其他网站上检索数据的合法性。大部分网站包含具有版权的信息。
② 完整例子:
<?php
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 '<div>The lastest value for <span class="quote">'.$read[0].'</span>(<span class="quote">'.$_GET['symbol'].'</span>) is $<span class="quote">'.$read[1].'</span>';
}else{
echo '<div class="error">Invalid symbol</div>';
}
}
?>
二、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)
③ 完整例子
<?php
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 "<h2>Validating URLs</h2>";
set_time_limit(0);
foreach ($urls as $url) {
list($code, $class) = check_url($url);
echo '<p><a href="\'$url\" target="\'hew\">$url</a>(<span class="\$class\">$code</span>)</p>\n';
}
?>
三、使用IP地址查询
下面的例子会使用一个与网络相关的PHP函数:gethostbyname()函数。该函数返回给定域名的IP地址。
要使用IP地址进行地理地址查询,必须连接到GeoIP数据库。这里使用由freegeoip.net提供的简单的在线服务
其请求路径格式要求为:http://freegeoip.net/(数据格式)/(要查询的IP地址)
完整示例如下:
<?php
function show_ip_info($ip){
$url = 'http:/freegeoip.net/csv/' .$ip;
$fp = fopen($fp);
$read = fgetcsv($fp);
fclose($fp);
echo "<p>IP Address: $ip<br/>
Country:$read[2]<br/>
City, State:$read[5],$read[3]<br/>
Latitude:$read[7]<br/>
Longtude:$read[8]</p>";
}
echo '<h2>Our spies tell us the following informatin about you<br/>';
show_ip_info($_SERVER['REMOTE_ADDR']);
$url = 'www.etropy.ch';
echo '<h2>Our spies tell us the following informatin about the URL $url</h2>';
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. 完整示例
<?php
$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);
?>