用php生成excel文件

nbsp;用php生成excel文件
哈哈,今天又学一招。php生成excel文档太简单了,估计大家都会用到,所以
共享出来。
大家来看代码:
<?
         header("Content-type:application/vnd.ms-excel");
         header("Content-Disposition:filename=test.xls");
         echo "test1 ";
         echo "test2 ";
         echo "test1 ";
         echo "test2 ";
         echo "test1 ";
         echo "test2 ";
         echo "test1 ";
         echo "test2 ";
         echo "test1 ";
         echo "test2 ";
         echo "test1 ";
         echo "test2 ";
?>
在php环境运行上面的代码,大家就可以看到浏览器询问用户是否下载excel
文档,点击保存,硬盘上就多了一个excel的文件,使用excel打开就会看到
最终的结果,怎么样不错吧。
其实在做真正的应用的时候,大家可以将数据从数据库中取出,然后按照每
一列数据结束后加 ,每一行数据结束后加的方法echo出来,在php的开头
用header("Content-type:application/vnd.ms-excel");表示输出的是
excel文件,用header("Content-Disposition:filename=test.xls");表
示输出的文件名为text.xls。这样就ok了。
我们更可以修改header让他输出更多格式的文件,这样php在处理各种类型
文件方面就更加方便了。
 
Yorgo Sun (yorgo@163.net)
2000/11/14
欢迎转载,但请保证文档完整,通知作者。谢谢 :-)


阅读全文

PHP实现文件上传的一种好方法

P>         网上很的免费支持PHP的个人主页空间现在不少,这时可能会想到来个上传什么的,但毕竟属于免费的,当然会有很多的限制,不允许上传,这个很正常,有的连Mail()函数都不给用呢。遇到这种情况,也不是没有办法上传的哦,PHP支持强大的socket,当然少不了直接操作ftp了,看看函数表上就有了,通过ftp实现文件上传。不是很好,我们上传主页不是用ftp上传吗。
     实现代码如下:
//upload.php
<html>
<body>
<form enctype="multipart/form-data" action=upload.php method=post> 
上传文件:  <input type=file name=upload_file> 
<input type=submit name=action value=OK> 
</form> 
<?php 
$ftp_server="ftp服务器(最好用IP)"; 
$ftp_username="ftp用户名"; 
$ftp_password="登录密码"; 
$ftp_dir="目录(如设置为 /)";
if ($action == "OK") 

  $con = ftp_connect($ftp_server);  //连接ftp
  ftp_login($con, $ftp_username, $ftp_password); //用户登录
  $suss=$con;
  ftp_chdir($suss, $ftp_dir);  //cd到指定目录
  $ok_code = ftp_put($suss, $upload_file_name, $upload_file, FTP_BINARY); //put文件
 
  if ($ok_code == 1) 
  { 
      echo "文件上传成功!"; 
  } 
  else 
  { 
     echo "文件上传失败!"; 
  } 
      ftp_quit($suss);  // 关闭ftp连接

?> 
</body>
</html>


阅读全文

比较两种php调用Java对象的方法

P>Java语言功能强大,因此在许多情况下在php中来调用Java的功能将十分有用。在php中调用Java语言有两种方法,一种是使用php中的Java扩展模块,另一种是使用minij2ee应用服务器提供的SJOP协议实现。下面我们来比较一下这两种方法各自的特点。
1.php的Java模块
php发布版中包含一个Java扩展模块,可以用来调用Java对象,例如:
<?php
$system=new Java("java.lang.System");
print "Java version=".$system->getProperty("java.version")." <br>";
?>
使用这种方法的优点是比较方便,只要用new Java()来创建一个Java对象,就可以同php类一样来调用Java对象。但是这种方法也有以下明显的缺点:
1.由于php的Java模块根据php的数据类型选择最适合的Java方法,因此无法调用Java过载的函数。
2.php的Java模块将在当前Web Server的进程中载入JVM(Java虚拟机),因此系统开销极大,影响Web Server进程的执行效率。
3.在某些操作系统和Web Server环境中,php的Java模块将使Web Server进程僵死。见http://www.php.net/bugs.php?id=6122。
由于这些原因,php的Java模块一直无法应用到实际的的软件系统中。
2.minij2ee应用服务器SJOP协议实现
在介绍minij2ee应用服务器SJOP协议实现之前,先简单介绍一下minij2ee应用服务器。minij2ee应用服务器是第一款支持php的J2EE应用服务器产品,使php能够用于开发企业级应用系统。SJOP全称是Sample Java ORB Protocol(简单Java对象请求代理协议),是一种简单高效的对象请求代理协议。比如:
<?php
$conn=minij2ee_fetch_connection();
print "Java version=".minij2ee_callstatic_javaobj($conn,"java.lang.System","getProperty","java.lang.String","java.version")." <br>";
?>
minij2ee应用服务器实现SJOP协议的主要目的是使php中能够访问EJB企业级组件,因此minij2ee提供了一个EJB-PHP编译器,可以把EJB组件编译成php的类,使php程序中能够方便的调用EJB组件,例如:
<?php
require("Cart.php"); file://Cart.php是编译Cart EJB后生成的Cart EJB的php类定义。
$home=new CartHome(); file://创建EJB的Home接口。

阅读全文

PHP的 GB2312-UTF-8 转换函数

以下是一段gb2312 -> UTF-8 的函数,我抄了
unicode -> UTF-8 的算法,所以实际比GB2312->unicode
没多多少东西,请大家注意调用gb2utf8()时不能中英文混用
程序需要的GB2312.txt文件
<?
//Program writen by sadly www.phpx.com
//gb2utf8.php
function gb2utf8($gb)
{
if(!trim($gb))
return $gb;
$filename="gb2312.txt";
$tmp=file($filename);
$codetable=array();
while(list($key,$value)=each($tmp))
$codetable[hexdec(substr($value,0,6))]=substr($value,7,6);
$utf8="";
while($gb)
{
if (ord(substr($gb,0,1))>127)
{
$this=substr($gb,0,2);
$gb=substr($gb,2,strlen($gb));
$utf8.=u2utf8(hexdec($codetable[hexdec(bin2hex($this))-0x8080]));
}
else
{
$gb=substr($gb,1,strlen($gb));
$utf8.=u2utf8(substr($gb,0,1));
}
}
$ret="";
for($i=0;$i<strlen($utf8);$i+=3)
$ret.=chr(substr($utf8,$i,3));
return $ret;
}
function u2utf8($c)
{
for($i=0;$i<count($c);$i++)
$str="";
if ($c < 0x80) {
$str.=$c;
}
else if ($c < 0x800) {
$str.=(0xC0 $c>>6);
$str.=(0x80 $c & 0x3F);
}
else if ($c < 0x10000) {
$str.=(0xE0 $c>>12);
$str.=(0x80 $c>>6 & 0x3F);
$str.=(0x80 $c & 0x3F);
}
else if ($c < 0x200000) {
$str.=(0xF0 $c>>18);
$str.=(0x80 $c>>12 & 0x3F);
$str.=(0x80 $c>>6 & 0x3F);
$str.=(0x80 $c & 0x3F);
}
return $str;
}
?>
调用举例:通过GD输出 "中国" 两个汉字
example.php
<?
//Header("Content-type: image/gif");
$im = imagecreate(400,300);
$bkg = ImageColorAllocate($im, 0,0,0);
$clr = ImageColorAllocate($im, 255,255,255);
$fnt = "d:/winnt/fonts/simhei.ttf";
include("gb2utf8.php");
$str = gb2utf8("中国");
ImageTTFText($im, 20, 0, 10, 20, $clr, $fnt, $str);
ImageGif($im);
ImageDestroy($im);
?>
====================================


阅读全文

[walkerlee原作]对PHP之函数sprintf()的学习研究笔记

P>对 PHP 之 函数 sprintf() 的学习研究笔记
sprintf
将字串格式化
语法: string sprintf(string format, mixed [args]...);
传回值: 字串
函式种类: 资料处理
 
内容说明
本函式用来将字串格式化。参数 format 是转换的格式,以百分比符号 % 开始到转换字符为止。而在转换的格式间依序包括了
1. 填空字元。0 的话表示空格填 0;空格是内定值,表示空格就放着。
2. 对齐方式。内定值为向右对齐,负号表向左对齐。
3. 栏位宽度。为最小宽度。
4. 精确度。指在小数点后的浮点数位数。
型态,见下表
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
转换字符
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
% 印出百分比符号,不转换。
b 整数转成二进位。
c 整数转成对应的 ASCII 字元。
d 整数转成十进位。
f 倍精确度数字转成浮点数。
o 整数转成八进位。
s 整数转成字串。
x 整数转成小写十六进位。
X 整数转成大写十六进位。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
例子
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
使用范例
<?
$money1 = 68.75;
$money2 = 54.35;
$money = $money1 + $money2;
// 此时变数 $money 值为 "123.1";
$formatted = sprintf ("%01.2f", $money);
// 此时变数 $ formatted 值为 "123.10"
?>
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
这个 %01.2f 是什么意思呢?
首先 这个 % 符号是开始的意思,他写在最前面表示指定格式要开始了。
 也就是 "起始字符", 直到出现 "转换字符" 为止,就算格式终止。
然后 跟在 % 符号 后面的是 0 这个零是 "填空字元" 表示,如果位置空着 就用0来填满。
在 0 后面的是 1 这个 1 是规定,小数点前面的数字占位要有1位以上。
如果把 1 改成 2 如果 $money 的值为 1.23 ,则 $formatted 的值将为 01.23
因为,在小数点前面的数字只占了1位,按照上面所规定的格式,小数点前数字应该占2位,现在只有1位,所以,用0来填满。
到目前,在 %01 后面的 .2 (点2) 就很好理解了,它的意思是,规定,小数点后的数字,必需占2位. 如果这时候,$money 的值为 1.234,则 $formatted 的值将为 1.23。

阅读全文

一个全PHP编写的树型目录结构

树型目录看起来新颖别致,而网上的大多是JAVASCRIPT和PHP的结合,本人这一个是用全用PHP4写的,用了SESSION功能,请大家看了多提意见。(本人在WIN98/PWS/PHP4下测试通过)
<?
// 2001/02/23
//ZHANGHEXUN
//树型目录
session_start(); //开始一个SESSION
if (!session_is_registered("$office_action")){
$office_action=0;
session_register("$office_action");//注册一个SESSION
}
if(!session_is_registered("$pho_action")){
$pho_action=0;
session_register("$pho_action");
}
if (!session_is_registered("$web_action")){
$web_action=0;
session_register("$web_action");
}
$office=array(wps,office2000,北大方正); //办公之星项目
$pho=array(photoshop,3D MAX,fish,Firworks);
$web=array(php,asp,jsp,html,javascript,perl);
?>
<HTML><HEAD><TITLE>张贺勋的树型目录</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type></HEAD>
<BODY>
<TABLE border=0 width="100%" bgcolor=#8cc9ec cellpadding=1 cellspacing=1>
<TBODY>
<TR>
<TD width=180 bgcolor=#8cc9ec>
<TABLE>
<TR><TD><FONT class=font6>学习中心</FONT></TD></TR>
<TR><TD>·<A href=<?
if ($acte==1000){
$office_action= 1-$office_action;
}
print ""$php_self?acte=1000&office_action=$office_action"";
?>>办公之星</a><br>
<?if ($office_action==1){
print"<talbe> <tbody> <tr> ";
for ($i=0;$i<count($office);$i++){
print"<td>&nbsp&nbsp&nbsp|-<a href="$php_self?acte=".(1005+$i*5)."">$office[$i]</a></td></tr>";
}
print"</tbody></table> ";

阅读全文

如何开发一个虚拟域名系统

大家在使用诸如yourname.yeah.net这样的简记域名时都感到十分方便,有很多人在想:我要是能让自己的服务器也能够实现简记域名就好了。其实这并不复杂。看完了本文,你也可以做一个简记域名系统。
  简记域名系统的关键技术在于:实现Web页面的重定向(Redirctory)。在本质上,简记域名系统和虚拟机系统完全不同。虚拟机的虚拟域名和IP是存在一一对应关系的。而简记域名系统不需要将域名和IP做一一映射。也就是说,它根本不需要复杂的域名解析机制和虚拟机来完成,它所做的事情就是当你在请求yourname.somedomain时,将你的浏览器重新定向到你本来存放Html页面的地方。
  为了说明的更完善,下面图例:
  我提供的源程序是运行环境是:RedHat 5.1 Linux下的Apache1.3.6 Web服务器+PHP3语言。
 在编写程序之前,我们首先要设置好我们的服务器。首先要让Apache服务器支持php3。到ftp.redhat.com下载mod_php-2.0.1-9.i386.rpm,安装后,修改/etc/httpd/conf/http.conf文件,去掉
  设置DNS服务器,使其能对泛域名解析。一般的Unix和Linux系统的DNS解析都是由Bind守护程序完成的,Bind4和Bind8的配置文件分别/etc/named.boot和name.conf,配置时根据你的系统修改。设置Bind的配置文件/etc/named.boot,在其中加入“primary domain.com db.domain”一句,添加一个新的域记录。在/etc/name.conf中加入:
  zone "domain.com" {
  type master;
  file "db.domain”;
  };
  在/var/name/中新建主域记录文件db.domain,其格式为:
  N SOA dns.domain.com root.domain.com (
  199811291 ;Serial
  28800 ;refresh
  7200 ;retry
  604800 ;expire
  86400) ;minimum
  dns
  MX 10 dns.domain.com.
  dns A 202.115.135.50
  www A 202.115.135.50
  * A 202.115.135.50
  关键是最后一句,即将整个域可能出现未做标记的所有Hostname全部指向同一IP。
 执行/usr/sbin/ndc reload,重新加载域名数据库。测试一下,此时应该随便ping一个domain域内的主机(除已经标记的),都指向了指定的IP,那么DNS服务器设置完成。
  最后一步是编制PHP3脚本。我们刚才已经在图中详细的说明了整个的原理,所以写一个重新定向的程序就不是很难了。

阅读全文

PHP 使用者状态管理功能的应用

使用者状态管理(session support)是 PHP 4.0 一个让大家期待已久的新功能。在 PHP 3.0 的时代,程序设计员必须使用其它人写好的函式库来实作状态管理功能,或者就干脆放弃这项功能不用算了。而状态管理功能的缺乏事实上是 PHP 3.0 最让人感到失望的地方之一。不过现在状况已经得到改变,从 PHP 4.0 的早期测试版开始,使用者状态管理便已经成为 PHP 内建的功能之一了。
你可以使用状态管理功能来管理使用者从进入网站开始一直到离开网站为止这段期间内的所有相关变量(只要使用者没有离开网站,那么这些变量就都可以取用,不会因为使用者离开某个单一页面而造成资料消失),而不需要储存许多cookie 或者使用隐藏窗体字段,甚至将这些变量储存在数据库里面,造成数据库服务器的大量负荷。
一旦你在网站中的某一页激活状态管理,PHP 引擎便会开始纪录使用者状态(如果对这个使用者来说系统还没开始纪录该访问者的状态的话),或者继续纪录某个先前已经激活的使用者状态。要激活 PHP 的状态管理功能,你可以使用下面这个语法:
session_start();
一旦激活状态管理,PHP 会通过 cookie 传送一个独一无二的状态代码(这个代码看起来会像是:940f8b05a40d5119c030c9c7745aead9)给使用者,同时在服务器这端,PHP 引擎会自动产生一个档名与状态代码相对应的暂存文本文件(如:sess_940f8b05a40d5119c030c9c7745aead9),该档案会用来储存程序设计员在这个使用者状态纪录中所注册的所有变量。
谈到使用者状态管理,最常使用的例子便是一个页面存取计数器(access counter)了:现在我就开始教大家撰写 PHP 程序代码。
特别注意
在你尝试激活使用者状态纪录之前,千万不能够输出任何内容(不能有空格,TAB 甚至换行等等空格符,也不能有任何 HTML 卷标,任何内容都不行)给浏览器。这是因为状态管理相关函数会送出 HTTP 表头(header)信息给浏览器,如果在送出 HTTP 表头信息给浏览器之前已经有其它内容被输出的话,系统将会出现错误讯息。
如果该使用者的状态管理尚未被激活的话,下面这行程序便会激活该使用者的状态管理:
session_start();
接下来,注册一个名为count的变量:
session_register(count);
一旦你注册了一个变量,PHP 便会在从使用者进入网站一直到离开网站的整个浏览过程中自动替你维护这个变量的值,你可以随时取用这些注册过的变量。刚注册好的变量并没有指定任何值给它,不过一旦我们增加 count 变量的值,它的值便会是 1 了:

阅读全文

php实现ping

<?php

// created by joe lumbroso
// see some other good php3 scripts
// goto http://www.dtheatre.com/scripts
echo <font color=red><blink><b>Pinging</b></blink></font><br>;
$to_ping = dtheatre.com;
$count = 3;
$psize = 65;
echo Please be patient, this can take a few moments...<br><br>;
flush();
while (1) {
?>
<pre>
<?
exec(ping -c $count -s $psize $to_ping, $list);
for ($i=0;$i < count($list);$i ) {
print $list[$i].;
}
?>
</pre>
<?
flush();
sleep(3);
}
?>

阅读全文

PHP4调用JavaBean的摸索

棣栧厛澹版槑,鍐欐鏂囨椂,鎴戝杩欎釜涔熶笉鎳?鍙槸鑷繁浠巔hp.net涓婁笅浜嗕緥瀛?璇曠潃鍋氫簡涓€涓?鑰屼笖鏄湪 win2000 apache php4p12閰嶇疆涓? 鍏蜂綋姝ラ濡備笅锛 涓€銆佸畨瑁呭ソJVM(java virtual machine)(鎴戠敤鐨勬槸jdk122)

褰撶劧锛屾偍涓嶄竴瀹氳鐢╦dk122,鐢氳嚦涓嶇敤jdk,鐢ㄥ叾瀹冪殑,姣斿:
JVM=Kaffe 1.0.4 (as delivered with OS), OS=Redhat Linux 6.1
JVM=Kaffe 1.0.5 (built from source), OS=Redhat Linux 6.1
JVM=IBM 1.1.8, OS=Redhat Linux 6.1
JVM=Blackdown 1.2.2 RC4, OS=Redhat Linux 6.1
JVM=Sun JDK 1.1.8, OS=Windows NT 4/win2000
浣嗘槸,鍦ㄨ繖閲屾垜鍙鎴戠殑鍋氭硶,鍏跺畠鐨勬垜娌℃湁璇曡繃,涓嶈闂垜,杩欓噷瑕佺壒鍒敞鎰忕殑鏄? 鏍规嵁php瀹樻柟绔欑偣鐨勮鏄?绔熺劧涓嶆敮鎸乯dk122 linux
浜屻€佽缃幆澧冨彉閲
鍦╳in2000涓?鎴戠殑鐢佃剳->灞炴€?->楂樼骇->鐜鍙橀噺
璁剧疆JAVA_HOME
涓国jdk璺緞,姣斿鎴戠殑jdk122瑁呭湪e:jspjdk122涓?閭d箞灏辫缃负e:jspjdk122
涓夈€佷笅杞界浉鍏虫枃浠?濡傛灉鎮ㄦ病鏈夌殑璇?
涓嬭浇鍦板潃:http://www.php.net/downloads.php
鎴戜笅杞戒簡:php-4.0.1-Win32-java-jdk122.zip鏂囦欢,瑙e帇鍚庢湁鍑犱釜渚嬪瓙,骞朵笖鏈堹php_java.dll鍜宲hp_java.jar鏂囦欢.
鍥涖€侀厤缃畃hp.ini鏂囦欢
[java]
java.class.path=E:PHP4php_java.jar
java.home=E:jspjdk122in
extension=php_java.dll
java.library.path=E:PHP4ext
java.library=E:Program FilesJavaSoftJRE1.2inclassicjvm.dll
浠ヤ笂鏄垜鐨勯厤缃?璇存槑涓€涓?鎴戠殑php4鍦╡:php4鐩綍涓?鎴戠殑鎵€鏈夋墿鍏呯殑dll鏂囦欢 鏀惧湪e:php4ext鐩綍涓?褰撶劧php_java.dll涔熷氨搴旇copy鍒拌繖涓洰褰曚簡.鏈€鍚庣‘璁や綘鐨 win2000涓嬫湁jvm.dll鏂囦欢,濡傛灉娌℃湁,瀹夎涓€涓媣isual studio灏卞彲浠ヤ簡(鎴戠敤瑁呬簡涓猇C 6,鎵€浠ヤ笉鐢ㄨ€冭檻浜?
浜斻€佹祴璇
杩愯phpinfo()灏卞彲浠ョ湅鍒版湁java浜?濡傛灉娌℃湁锛岃鏄庝綘娌℃湁鎴愬姛.瀹冪殑鏄剧ず濡備笅:
java
Directive Local Value Master Value
java.class.path
E:PHP4php_java.jar E:PHP4php_java.jar
java.home
E:jspjdk122in E:jspjdk122in
java.library
E:Program FilesJavaSoftJRE1.2inclassicjvm.dll jvm.dll
java.library.path
E:PHP4ext no value
鍏€佹祴璇曚緥瀛
鎴戠敤鐨勬槸涓嬭浇鐨勬枃浠朵腑鍖呭惈鐨勪緥瀛忷jver.php,濡傛灉鎴愬姛,灏嗘湁濡備笅缁撴灉:
Java version=1.2.2
Java vendor=Sun Microsystems Inc.
OS=Windows NT 5.0 on x86
鏄熸湡涓? 涓冩湀 19, 2000 at 10:32:53 涓嬪崍 GMT 08:00

阅读全文

如何将PHP的结果输出到非PHP页面中

这个问题是当我自已实现了统计计数之后,我想将它的输出用在我的不支持PHP功能的页面中,那么应该如何做呢?主要的解决办法是输出一段javascript脚本即可。这个是很有用的,比如实现动态新闻, 广告轮询,当然这里是讲如何把某个程序的下载计数输出到非PHP页面中去。

  先让我们设想一下:我已经有了一个程序下载计数文件在我的网站上,如../count/download.db。
 
文件格式为:
  索引|文件名提示|链接|计数
注意,这里用|线分隔。我采用的是文本文件进行处理。里面可能某一行数据为:
  file1|测试文件1|../download/file1.zip|10
可以看到,下载次数可能已经是10次了。现在我就想把这个10次输出到其它的页面中。
 
  第一步:写Javascript脚本
  很简单:
<script language=javascript src=../bin/output.php?id=file1></script>
  是不是!src后面是指输出的脚本程序,?后面是传入脚本的参数。那么output.php应该输出什么数据
才能被执行呢?应该输出javascript语句,如document.write()之类的语句。这样,浏览器就会把output.php
的输出结果看成一段javascript程序再进行处理,就好象直接写的脚本一样,只不过这段脚本是从别的地方
得到的。
 
  好了,知道应该输出什么样的内容了,就可以写php程序了。
 
  第二步:输出结果

<?
$fp=fopen(../count/download.db, r);
$flag=FALSE;
while(!feof($fp))
{
$line=fgets($fp, 256);
list($index, $title, $url, $count)=split(|, $line);
if (strtolower($index)==strtolower($id))
{
$flag=TRUE;
break;
}
}
fclose($fp);
if ($flag)
{
echo document.write($count);;
}
else
echo document.write(not found);;
?>
  这段代码也很简单,但是有几点要说明。先打开一个文件。$flag表示是否找到指定索引的文件记录,
首先置为FALSE。再是一个循环,条件是文件没有结束。
 
  然后是循环体:取出一行文本,长度最好长点。进行字段分割,以|为分割符。注意,使用的split函
数是正则表达式,|是一个特殊符号用以用号。然后分别放入相应的变量中。在这里我们真正关心的是
$index和$count。比较输入的参数$id与取出的索引($index)是否相等,如果相等,则将找到标志设为TRUE,
退出循环。否则查找下一行数据。
 
  结束时,关闭文件,根据是否找到标志输出相应的javascript脚本即可。
 
  对于$id的使用,是PHP自动将调用的URL处?id=xxx进行了处理,可以直接使用。也可以使用
$HTTP_GET_VARS[id]。

阅读全文