您当前的位置:首页 > 网站建设笔记 >

PHP的网络应用-利用PHP fopen()读取Web站点

来源:PHP5高级应用开发实践0

PHP所做大部分工作是从服务程序(比如数据库或文本文件)获取信息再发送到客户端(用户的Web浏览器),或是相反的过程。但PHP还支持另外一些特性,能够与其他Web站点进行交互,与其他服务程序通信,甚至能够通过FTP传输文件。本章将着重介绍与网络相关的PHP功能与函数。

第一个范例将展示如何从其他Web站点读取文本文件,第二个范例会创建一个URL检验程序(用于检查链接是否依然有效)。如何判断用户从哪个国家连接到我们的服务器。最后,我们将简要介绍一下cURL,这是一个功能强大的网络工具。

访问其他Web站点

虽然PHP本身通常被用于创建Web页面,但它也能够访问页面并与页面进行交互。这种功能在很多场合都能发挥作用,比如获取信息、编写搜索程序(在互联网上快速扫描来寻找特定数据的程序)等。令人惊奇的是,通过使用fopen()函数,访问其他Web站点就像访问本地硬盘一样方便。

fopen("http://www.wangzhanchengxu.com/","r");

fopen()函数不仅能够打开文件,还能够打开Web页面,因为后者也是服务器上的文件。虽然在实际应用时,页面文件一般是只读的,除非其权限是完全开放的(希望不要这样),但可以用于fopen()函数的参数是一样的(r、w和a)。需要提醒的一点是,在使用fopen()函数时,目录名后面必须有斜线,因为这个函数不支持重定向。前面的范例代码及下面这一行都是正确的:

fopen("http://www.wangzhanchengxu.com/index.php","r");

但下面这一行就不行。

fopen("http://www.wangzhanchengxu.com/dir","r");

(很多人并不会意识到www.wangzhanchengxu.com/dir会被重定向为www.wangzhanchengxu.com/dir/)。在打开文件之后,我们就可以像平常一样对其进行操作,使用file()、fgets()等函数来获取(或写入)数据。为了展示这个概念,我将利用雅虎的财经页面获取纽约股市上不同股票的报价。在进行实际操作之前需要说明一点,从其他Web站点获取信息的合法性是首先要考虑的问题。大多数站点包含了受版权保护的信息,未经允许使用它们是一种违法行为。这个利用雅虎的范例只是一个范例,并不是鼓励大家养成这种使用习惯!

利用PHP读取Web站点
这段代码将打开雅虎的报价页面,分析其中的数据,从而获得股票报价

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<?php
if(isset($_GET['symbol']) and !empty($_GET['symbol'])){
	$url=sprintf('http://quote.yahoo.com/d/quotes.csv?s=%s&f=nl1',$_GET['symbol']);
	$fp=fopen($url,'r') or die('Cannot access Yahoo!</body></html>');
	$read=fgetcsv($fp);
	fclose($fp);
	if(strcasecmp($read[0], $_GET['symbol'])!=0){
		echo '<p>The latest value for '.$read[0].'('.$_GET['symbol'].') is $'.$read[1].'</p>';
	}else{
		echo '<p>Invalid symbol!</p>';
	}
}
?>
<p>Enter a NYSE stock symbol to get the latest price</p>
<form action="get_quote.php" method="get">
<label for="symbol">Symbol(股票的代号) <input type="text" name="symbol" size="5" maxlength="5" placeholder="AAPL"></label>
<input type="submit" name="submit" value="Fetch the Quote">
</form>
</body>
</html>
  • 查看表单是否被提交:这个页面既显示表单又处理它。表单本身只有一个输入字段:股票的代号。由于表单使用GET方法,所以处理表单的代码会查看$_GET['symbol']是否存在。
  • 定义要打开的URL:$url=sprintf('http://quote.yahoo.com/d/quotes.csv?s=%s&f=nl1', $_GET['symbol']);
    在访问和读取其他Web页面时,最重要的是需要知道其中包含什么数据、其格式是什么。换句话说,除非我们要拷贝整个页面,否则就需要开发某种系统,根据数据的组织结构搜集页面里有用的部分。在这个范例里,URL(比如http://quote.yahoo.com/d/quotes.csv)接收两个参数:要查看的股票(一个或多个)和格式参数,然后它就会返回一个CSV(逗号分隔数值)文件。对于这个范例,我们想知道股票的名称和最新报价,所以格式应该是nl1(参见www.gummy-stuff.org/Yahoo-data.htm来了解不同的选项及其含义)。把订单符号传递进去,得到的结果会是如下格式的(其中XX.XX是报价)。
    “股票名称”, XX.XX
    在知道了这是个逗号分隔的股票名称及最新价格列表之后,我就能够准确地提取出需要的信息。对于一些更复杂的Web页面来说,可能需要使用正则表达式来获取特定的内容。
  • 打开Web页面并且读取数据:在定义了URL之后,就可以打开这个“文件”进行读取了。由于已知返回的数据是CSV格式,所以脚本用fgetcsv()来读取它。这个函数能够自动以逗号为分隔符,把读取的行转化到一个数组里。之后脚本关闭了文件指针。需要说明的是,如果读取的URL是个标准HTML文档(本例中不是),读取的第一行内容应该类似于<!DOCTYPE html>。
顶部中部底部