Archive for 09月, 2008

使用PHP操作FTP-用法

建立一个PHP的FTP联接必须遵守以下基本步骤:打开一个联接 - 发出认证信息 - 使用PHP函数操纵目录和传输文件。
以下具体实现:
<?
// 联接FTP服务器
$conn = ftp_connect(ftp.server.com);
// 使用username和password登录
ftp_login($conn, “john”, “doe”);
// 获取远端系统类型
ftp_systype($conn);
// 列示文件
$filelist = ftp_nlist($conn, “.”);
// 下载文件
ftp_get($conn, “data.zip”, “data.zip”, FTP_BINARY);
// 关闭联接
ftp_quit($conn);
//初结化一个FTP联接,PHP提供了ftp_connect()这个函数,它使用主机名称和端口作为参数。在上面的例子里,主机名字为“ftp.server.com”;如果端口没指定,PHP将会使用“21”作为缺省端口来建立联接。
//联接成功后ftp_connect()传回一个handle句柄;这个handle将被以后使用的FTP函数使用。
$conn = ftp_connect(ftp.server.com);
//一旦建立联接,使用ftp_login()发送一个用户名称和用户密码。你可以看到,这个函数ftp_login()使用了ftp_connect()函数传来的handle,以确定用户名和密码能被提交到正确的服务器。
ftp_login($conn, “john”, “doe”);
// close connection
ftp_quit($conn);
//登录了FTP服务器,PHP提供了一些函数,它们能获取一些关于系统和文件以及目录的信息。
ftp_pwd()
//获取当前所在的目录
$here = ftp_pwd($conn);
//获取服务器端系统信息ftp_systype()
$server_os = ftp_systype($conn);
//被动模式(PASV)的开关,打开或关闭PASV(1表示开)
ftp_pasv($conn, 1);
//进入目录中用ftp_chdir()函数,它接受一个目录名作为参数。
ftp_chdir($conn, “public_html”);
//回到所在的目录父目录用ftp_cdup()实现
ftp_cdup($conn);
//建立或移动一个目录,这要使用ftp_mkdir()和ftp_rmdir()函数;注意:ftp_mkdir()建立成功的话,就会返回新建立的目录名。
ftp_mkdir($conn, “test”);
ftp_rmdir($conn, “test”);
//上传文件,ftp_put()函数能很好的胜任,它需要你指定一个本地文件名,上传后的文件名以及传输的类型。比方说:如果你想上传“abc.txt”这个文件,上传后命名为“xyz.txt”,命令应该是这样:
ftp_put($conn, “xyz.txt”, “abc.txt”, FTP_ASCII);
//下载文件:PHP所提供的函数是ftp_get(),它也需要一个服务器上文件名,下载后的文件名,以及传输类型作为参数,例如:服务器端文件为his.zip,你想下载至本地机,并命名为hers.zip,命令如下:
ftp_get($conn, “hers.zip”, “his.zip”, FTP_BINARY);
//PHP提供两种方法:一种是简单列示文件名和目录,另一种就是详细的列示文件的大小,权限,创立时间等信息。
//第一种使用ftp_nlist()函数,第二种用ftp_rawlist().两种函数都需要一个目录名做为参数,都返回目录列做为一个数组,数组的每一个元素相当于列表的一行。
$filelist = ftp_nlist($conn, “.”);
//函数ftp_size(),它返回你所指定的文件的大小,使用BITES作为单位。要指出的是,如果它返回的是 “-1”的话,意味着这是一个目录
$filelist = ftp_size($conn, “data.zip”);
?>


用php进行FTP操作-分析

PHP是通过HTTP和FTP联接来传输文件的。通过HTTP上传文件早在PHP3中就已经出现,现在检测你的PHP环境是否支持FTP
<?
phpinfo();
?>
检查输出结果,有一“Additional Modules”区,这里列示了你的PHP支持的模块;如果你没发现FTP模块,你最好重新安装PHP,并添加FTP支持!
一个典型的FTP任务
——————————————————————————–
$ ftp ftp.server.com
Connected to ftp.server.com
220 server.com FTP server ready.
Name (server:john): john
331 Password required for john.
Password:
230 User john logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
drwxr-xr-x 5 john users 3072 Nov 2 11:03 .
drwxr-xr-x 88 root root 2048 Nov 1 23:26 [...]


简单了解HTTP消息头

当我们设计一个通信协议时,“消息头/消息体”的分割方式是很常用的,消息头告诉对方这个消息是干什么的,消息体告诉对方 怎么干。HTTP传输的消息也是这样规定的,每一个HTTP包都分为HTTP头和HTTP体两部分,后者是可选的,而前者是必须的。每当我们打开一个网 页,在上面点击右键,选择“查看源文件”,这时看到的HTML代码就是HTTP的消息体,那么消息头又在哪呢?IE浏览器不让我们看到这部分,但我们可以 通过截取数据包等方法看到它。
下面就来看一个简单的例子:
首先制作一个非常简单的网页,它的内容只有一行:
<html><body>hello world</body></html>
把它放到WEB服务器上,比如IIS,然后用IE浏览器请求这个页面(http://localhost:8080/simple.htm),当我们请求这个页面时,浏览器实际做了以下四项工作:
1 解析我们输入的地址,从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:
协议名:http
主机名:localhost
端口:8080
对象路径:/simple.htm
2 把以上部分结合本机自己的信息,封装成一个HTTP请求数据包
3 使用TCP协议连接到主机的指定端口(localhost, 8080),并发送已封装好的数据包
4 等待服务器返回数据,并解析返回数据,最后显示出来
由截取到的数据包我们不难发现浏览器生成的HTTP数据包的内容如下:
GET /simple.htm HTTP/1.1<CR>
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*<CR>
Accept-Language: zh-cn<CR>
Accept-Encoding: gzip, deflate<CR>
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;?Windows?NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)<CR>
Host: localhost:8080<CR>
Connection: Keep-Alive<CR>
<CR>
为了显示清楚我把所有的回车的地方都加上了“<CR>”,注意最后还有一个空行加一个回车,这个空行正是HTTP规定的消息头和消息体的分界线,第一个空行以下的内容就是消息体,这个请求数据包是没有消息体的。
消 息的第一行“GET”表示我们所使用的HTTP动作,其他可能的还有“POST”等,GET的消息没有消息体,而POST消息是有消息体的,消息体的内容 就是要POST的数据。后面/simple.htm就是我们要请求的对象,之后HTTP1.1表示使用的是HTTP1.1协议。
第二行表示我们所用的浏览器能接受的Content-type,三四两行则是语言和编码信息,第五行显示出本机的相关系信息,包括浏览器类型、操作系统信息等,很多网站可以显示出你所使用的浏览器和操作系统版本,就是因为可以从这里获取到这些信息。
第六行表示我们所请求的主机和端口,第七行表示使用Keep-Alive方式,即数据传递完并不立即关闭连接。
服务器接收到这样的数据包以后会根据其内容做相应的处理,例如查找有没有“/simple.htm”这个对象,如果有,根据服务器的设置来决定如何处理,如果是HTM,则不需要什么复杂的处理,直接返回其内容即可。但在直接返回之前,还需要加上HTTP消息头。
服务器发回的完整HTTP消息如下:
HTTP/1.1 200 OK<CR>
Server: Microsoft-IIS/5.1<CR>
X-Powered-By:?ASP.NET<CR>
Date: Fri, 03 Mar 2006 06:34:03 GMT<CR>
Content-Type: text/html<CR>
Accept-Ranges: bytes<CR>
Last-Modified: Fri, 03 Mar 2006 [...]


XML的主要用途

1、数据交换
用XML在应用程序和公司之间作数据交换已不是什么秘密了,毫无疑问应被列为第一位。那么为什么XML在这个领域里的地位这么重要呢?原因就是XML使用元素和属性来描述数据。在数据传送过程中,XML始终保留了诸如父/子关系这样的数据结构。几个应用程序可以共享和解析同一个XML文件,不必使用传统的字符串解析或拆解过程。相反,普通文件不对每个数据段做描述(除了在头文件中),也不保留数据关系结构。使用XML做数据交换可以使应用程序更具有弹性,因为可以用位置(与普通文件一样)或用元素名(从数据库)来存取XML数据。
2、Web服务
Web服务是最令人激动的革命之一,它让使用不同系统和不同编程语言的人们能够相互交流和分享数据。其基础在于Web服务器用XML在系统之间交换数据。交换数据通常用XML标记,能使协议取得规范一致,比如在简单对象处理协议(Simple Object Access Protocol,SOAP)平台上。SOAP可以在用不同编程语言构造的对象之间传递消息。这意味着一个C#对象能够与一个Java对象进行通讯。这种通讯甚至可以发生在运行于不同操作系统上的对象之间。DCOM, CORBA或Java?RMI只能在紧密耦合的对象之间传递消息,SOAP则可在松耦合对象之间传递消息。
3、内容管理
XML只用元素和属性来描述数据,而不提供数据的显示方法。这样,XML就提供了一个优秀的方法来标记独立于平台和语言的内容。使用象XSLT这样的语言能够轻易地将XML文件转换成各种格式文件,比如HTML, WML, PDF, flat file, EDI, 等等。XML具有的能够运行于不同系统平台之间和转换成不同格式目标文件的能力使得它成为内容管理应用系统中的优秀选择。
4、Web集成
现在有越来越多的设备也支持XML了。使得Web开发商可以在个人电子助理和浏览器之间用XML来传递数据。为什么将XML文本直接送进这样的设备去呢?这样作的目的是让用户更多地自己掌握数据显示方式,更能体验到实践的快乐。常规的客户/服务(C/S)方式为了获得数据排序或更换显示格式,必须向服务器发出申请;而XML则可以直接处理数据,不必经过向服务器申请查询-返回结果这样的双向“旅程”,同时在设备也不需要配制数据库。甚至还可以对设备上的XML文件进行修改并将结果返回给服务器。想像一下,一台具有互联网功能并支持XML的电冰箱将会给市场带来多么大的冲击吧。你从此不必早起去取牛奶了!
5、配置
许多应用都将配制数据存储在各种文件里,比如.INI文件。虽然这样的文件格式已经使用多年并一直很好用,但是XML还是以更为优秀的方式为应用程序标记配制数据。使用.NET里的类,如XmlDocument和XmlTextReader,将配制数据标记为XML格式,能使其更具可读性,并能方便地集成到应用系统中去。使用XML配制文件的应用程序能够方便地处理所需数据,不用象其他应用那样要经过重新编译才能修改和维护应用系统。如前所述,这里提到的五种使用XML的途径不包括全部场合。


开源软件10个有趣的分支

多开放源码软件分支在目前一些流行的项目中使用。我们认为这是很有意思的事情,来看看历史上的一些软件,找出他们为什么会比原生软件受欢迎。
Ubuntu from Debian
产品解释:Ubuntu是世界上最有名的Linux社区
发布时间:2004年10月20日
产生原因:Ubuntu最初是Debian项目做的的临时分区,每6个月可以推出一个新版本,因此提供更多的最新系统。
Firefox from Mozilla Application Suite
产品解释:FireFox是第二大网页浏览器。
发布时间:2002年9月公开测试,04年9月Mozilla推出FF1.0版本。
产生原因:Firefox项目最初是Mozilla项目的一个实验分支,打算替代日益臃肿的Mozilla套件。

?Joomla from Mambo
产品解释:Joomla是用来管理网站内容的开放源码系统。
发布时间:2005年8月17日
产生原因:由于考虑到今后的Mambo项目管理,有几个核心开发人员认为Milo需要太多的控制,Joomla 就被分离出来,现在是一个成功的独立的CMS系统

OpenBSD from NetBSD
产品解释:OpenBSD像一个Unix操作系统,并且还是比较流行的BSD变体。
发布时间:1995年10月。OpenBSD1.2于1996年7月发布。
产生原因: Theo de Raadt创办NetBSD。1994年12月,Theo de Raadt被要求从他的开发者和NetBSD小组核心成员的职位上离职,最有可能是由于他的个性与NetBSD团队冲突。不到一年后,他创立了从NetBSD的1.0分叉出来的OpenBSD 。

X.Org from XFree86
产品解释:X.Org服务器是X Window系统流行的实施服务器,有时还用于Linux和其他Unix上。
发布时间:2005年6月X.Org成立。
产生原因:XFree86 4.4新许可证的不一致和许多XFree86贡献者间的分歧最终导致了X.Org的产生。
Drizzle from MySQL
产品解释:Drizzle 是开放源码的数据库管理系统,尽管它还未发布。
发布时间:2008年4月5日
?产生原因:从Brian Aker开始,Drizzle从MySQL6.0代码库里分离出来,它本打算作为一个小的、灵巧、快捷的MySQL版本。参与者有来自Google、Sun、Canonical等的员工。

NeoOffice from OpenOffice.org
产品解释:NeoOffice是用于Mac OS X上的办公套件。
发布时间:2003年6月22日
产生原因:NeoOffice最初是一个旨在探讨如何建立一个OpenOffice.org的本地Mac OS X端口的项目。

XEmacs from GNU Emacs
产品解释:XEmacs是一个图形、基于控制台的文本编辑器。
发布时间:1980年,那时称为Lucid Emacs
产生原因:1987年到1993年这段期间,拖延了GNU Emacs 的一个版本的推出。80年代末,Lucid 想更新项目的Emacs,所以他们将Emacs分支代码的意图和变化纳入到下一版本中 。然而,自由软件基金会最终拒绝这些变化,因此XEmacs只能继续作为一个单独的分支。

Carrier from Pidgin
产品解释:Carrier是一个开放源码的在线消息应用软件。
发布时间:2008年3月12日发布第一个版本。
产生原因:分支(最初成为 Funpidgin)是用于Pidgin2.4.0的,因为有很多文本入口域大小的分歧。新分支更注重用户的需求。

Webkit from KHTML
产品解释:Webkit是用于创建网页浏览器的开放源码应用框架。
发布时间:2003年1月苹果公司宣布Webkit作为Safari内核。
产生原因:苹果创造了一个KDE项目的HTML布局引擎KHTML的分叉和它的JavaScript引擎KJS,使用它们来开发Safari网络浏览器。


怎么用好Linux的Shell命令

1、cat /etc/shells
查看计算机上可用的shell
2、编写shell,保存为firstscript
#! /bin/bash
# This is a test.
echo -n Your current directory is:
pwd
echo $HOME
echo Your current directory is:
pwd
#END.
3、运行firstscript
$ /bin/bash firstscript
如果找不到文件 使用pwd查看当前目录
$ /bin/bash pwd/firstscript
可见当前运行结果。
4、可以修改firstscript为执行
$chmod a+x firstscript
此时输入$ ./firstscript即可
上面的shell没有交换,我们可以进行交互,如下:
#!/bin/sh
echo -n Please input your ID:
read id_var
echo -n Please input your password:
read password
echo User ID = $id_var
echo password = $password
if [ $password = "admin" ]; then
echo “password is right”
else
echo “password is [...]


如何实现PHP多语言系统

PHP多语言系统按照支持的方式一般可分为两种:1.支持多语言,但不支持多种语言的同时存在,也就是说要么是中文要么是英文或者其他,这在一些需要国际化支持的网页系统中经常用来,以便方便用户本地化。 2.支持多语言并可同时浏览不同语言版本的网页。今天我想讨论的是第二种,实际上第二种也是在第一种的基础上发展来的。下面是我在实际的一个项目中应用多语言技术的大体框架。
当用户选择某种语言时,我们如何显示该语种版本的网站?对于每种语言都写一个版本我这里就不说了,那可能是最让人骂娘的方法了。 我这里采用的是模板引擎来实现的:使用模板网页内所有的文字、图片等都设置成可替换的变量标签,当用户浏览时则可根据传递过来的语言参数包含相应的语言包,最后解析一下模板即可。如果对于模板引擎不是很了解,请先看看模板方面的介绍文章。
项目文件结构如下:
Admin———-后台管理文件夹
Class———-项目中所有的类
Template———-模板文件
Js———-js脚本
Images———-图片存放目录
Lang———-语言包存放目录
Upload———-上传的文件存放目录
Index.php———首页
…———其他

下面列举了一些比较重要的代码:
1. 如何初始化语言信息
首先初始化模板类实例 $html = new Template() (这里以phplib template为例)
假设传递参数为lang=zh,那么我们就包含lang/zh文件夹下的语言包文件,语言包可能包含如下文件:
Lang_site.php lang_admin.php
而lang_site.php可能是如下形式:
view plainprint
$lang_site = array(’companyinfo’=>’公司讯息’
,’contactus’=>’联系我们’
,’myaccount’=>’我的帐户’
,’hr’=>’工作机会’
,’has_register_member’=>’已经注册用户’
,’enteryouremail’=>’输入您的email地址’
,’enteryourpasswd’=>’输入您的密码’
,’not_regostered_member’=>’未注册用户’
,’submit’=>’提交’
);
这样我们通过
view plainprint
foreach ($lang_site as $key=>$value)
{
??$ html ->set_var($key, $value);
}
就可以将特定的语言包信息显示出用户。
这就需要我们在每个页面都要传递用户所选择的语言种类信息,可以使用url或者session等方式来保存。
2. 后台如何添加新的语言
从上面的代码看出来,我们添加新的语言只需要添加对应的文件夹到lang文件夹下即可。 所以我们可以构造一个页面,这个页面包含所有网页中需要显示的特定语种的文字,可以采用如下形式:
提交之后服务器将其写入指定文件即可:
view plainprint
/**
* 把数组写入文件
*
* @param array $array
* @param string $arrayname
* @param string $filedir
* @return?
*/
function array_to_file($array, $arrayname, $filedir = ”)
{
$file = fopen($filedir.”$arrayname.php”, ‘wb’);
if (!$file)
{
return false;
}
$tmp = ”;
//$array_key = array_keys($array);
foreach ($array as $key=>$value)
{
($tmp == ”) ($tmp [...]


关键词分析的例外因素

用某个关键字进行搜索,一般情况,搜索出来的结果越多就表明该关键字的竞争越大。
但下面的是例外因素:
1、搜索出来的相关结果不等于存在这么多的竞争者。
2、在搜索出来的相关结果中,真正与搜索关键字有关系的可以只是总数的10%。
3、在10%中真正以优化搜索关键字为目的的,可能只是其中的10%
在搜索结果中显示出越多的搜索结果说明你输入关键字有关的搜索结果数目。如:我网站的关键字“搜索引擎优化资料”,搜索出来的结果有28,900多项结果,虽然没有全部是竞争者。但另一方面,无形中, 给优化带来困难, 因为中间有些可能是自然的符合搜索引擎的“优化”网站, 比如, 质量很高的链入等。
最后需要考虑的, 是和关键词相联系的辅助关键词。


反向链接位置的优化学问

反向链接的位置与反向链接的质量和数量对搜索引擎排名的影响同样重要。
我们并不是为了反向链接而寻找反向链接,我们是在寻找优质的反向链接,一个优质的反向链接能抵得上几十甚至几百个垃圾链接。
所有的网页可以抽象为三个区:
头区:放置Logo、主导航、横幅广告等
头区:可能出现导航栏、横幅广告。一个网站把你的链接放在导航栏,这种几率还是比较小的,除非你有足够的关系和银子。你有可能买横幅广告链接,如果你单纯地想通过这样的方式获得反向链接,我劝你还是省点钱吧,大部分搜索引擎对于购买反向链接的行为比较反感,这样做可能对您的搜索引擎排名没有一点影响。
主区:和页面相关的主要内容
主区:从这一区域获得的反向链接对您的网站的排名是极为有利的,最好能把你的链接放在靠前、靠左的位置,因为搜索引擎对这一区域的关注度非常高。
尾区:友情链接、次导航(关于我们、联系我们、网站地图等)、版权及备案声明等
尾区:你的链接最有可能出现在友情链接中,大部分搜索引擎已经降低了友情链接对排名的影响,这里的反向链接也只能算是劣质链接。


避免多域名指向同一网站对搜索排名造成影响

如果你有两个或更多域名同时指向一个空间,搜索引擎可能会认为这是网页复制,搜索引擎极有可能把其中一个URL收录,而另一个URL被列为复制站点。
如果站点是复制站点,搜索引擎认为这个网站有作弊的嫌疑,对排名极为不利!
解决办法:
把一个域名作为主打域名,其他的做301重定向或域名跳转到主打域名。