首页 > php100

PHP 数据加密

 

数据加密在我们生活中的地位已经越来越重要了,尤其是考虑到在网络上发生的大量 交易和传输的大量数据。如果对于采用安全措施有兴趣的话,也一定会有兴趣了解PHP提供的一系列安全功能。在本篇文章中,我们将介绍这些 功能,提供一些基本的用法,以便你能够为自己的应用软件中增加安全功能。
预备知识
在详细介绍PHP的安全功能之 前,我们需要花点时间来向没有接触过这方面内容的读者介绍一些有关密码学的基本知识,如果对密码学的基本概念已经非常熟悉,就可以跳 过去这一部分。
密码学可以通俗地被描述为对加/解密的研究和实验,加密是将易懂的资料转换为不易懂资料的过程,解密 则是将不易懂的资料转换为原来易懂资料的过程。不易懂的资料被称作密码,易懂的资料被称作明码。
数据的加/解密都需 要一定的算法,这些算法可以非常地简单,如著名的凯撒码,但当前的加密算法要相对复杂得多,其中一些利用现有的方法甚至是无法破译的 。
PHP的加密功能
只要有一点使用非Windows平台经验的人可能对crypt()也相当熟悉,这一函数完成被称作单向加密 的功能,它可以加密一些明码,但不能够将密码转换为原来的明码。尽管从表面上来看这似乎是一个没有什么用处的功能,但它的确被广泛用 来保证系统密码的完整性。因为,单向加密的口令一旦落入第三方人的手里,由于不能被还原为明文,因此也没有什么大用处。在验证用户输 入的口令时,用户的输入采用的也是单向算法,如果输入与存储的经加密后的口令相匹配,则输入的口信一定是正确的。
PHP同样提供了使用其crypt()函数完成单向加密功能的可能性。我将在这里简要地介绍该函数:
string crypt (string input_string [, string salt])
其中的input_string参数是需要加密的字符串,第二个可选的salt是一个位字串,它能够影响 加密的暗码,进一步地排除被称作预计算攻击的可能性。缺省情况下,PHP使用一个2个字符的DES干扰串,如果你的系统使用的是MD5(我将在 以后介绍MD5算法),它会使用一个12个字符的干扰串。顺便说一下,可以通过执行下面的命令发现系统将要使用的干扰串的长度:
print "My system salt size is: ". CRYPT_SALT_LENGTH;
系统也可能支持其他的加密算法。crypt()支持四 种算法,下面是它支持的算法和相应的salt参数的长度:
算法 Salt长度
CRYPT_STD_DES 2-character (Default)
CRYPT_EXT_DES 9-character
CRYPT_MD5 12-character beginning with $
CRYPT_BLOWFISH 16-character beginning with $
用crypt()实现用户身份验证
作为crypt()函数的一个例子,考虑这样一种情况,你希望创建一段PHP脚本程序限 制对一个目录的访问,只允许能够提供正确的用户名和口令的用户访问这一目录。我将把资料存储在我喜欢的数据库MySQL的一个表中。下面我 们以创建这个被称作members的表开始我们的例子:
mysql>CREATE TABLE members (
->username CHAR(14) NOT NULL,
->password CHAR(32) NOT NULL,
->PRIMARY KEY(username)
->);
然后,我们假定下面的数据已经存储在该表中:
用户名 密码
clark keloD1C377lKE
bruce ba1T7vnz9AWgk
peter paLUvRWsRLZ4U
这些加密的口令对应的明码分别是kent、banner和parker。注意一下每个口令的前二个字母, 这是因为我使用了下面的代码,根据口令的前二个字母创建干扰串的:
$enteredPassword.
$salt = substr($enteredPassword, 0, 2);
$userPswd = crypt($enteredPassword, $salt);
// $userPswd然后就和用户名一起存储在MySQL 中
我将使用Apache的口令-应答认证配置提示用户输入用户名和口令,一个鲜为人知的有关PHP的信息是,它可以把Apache 的口令-应答系统输入的用户名和口令识别为$PHP_AUTH_USER和$PHP_AUTH_PW,我将在身份验证脚本中用到这二个变量。花一些时间仔细阅读下 面的脚本,多注意一下其中的解释,以便更好地理解下面的代码:
crypt()和Apache的口令-应答验证系统的应用
$host = "localhost";
$user = "zorro";
$pswd = "hell odolly";
$db = "users";
// Set authorization to False
$authorization = 0;
// Verify that user has entered username and password
if (isset($PHP_AUTH_USER) && isset($PHP_AUTH_PW)) :
mysql_pconnect($host, $user, $pswd) or die("Can't connect to MySQL
server!");
mysql_select_db($db) or die("Can't select database!");
// Perform the encryption
$salt = substr($PHP_AUTH_PW, 0, 2);
$encrypted_pswd = crypt($PHP_AUTH_PW, $salt);
// Build the query
$query = "SELECT username FROM members WHERE
username = '$PHP_AUTH_USER' AND
password = '$encrypted_pswd'";
// Execute the query
if (mysql_numrows(mysql_query($query)) == 1) :
$authorization = 1;
endif;
endif;
// confirm authorization
if (! $authorization) :
header('WWW-Authenticate: Basic realm="Private"');
header('HTTP/1.0 401 Unauthorized');
print "You are unauthorized to enter this area.";
exit;
else :
print "This is the secret data!";
endif;
?>
上面就是一个核实用户访问权限的简单身份验证系统。在使用crypt()保护重要的机密资料时,记住在缺省状态下使用的 crypt()并不是最安全的,只能用在对安全性要求较低的系统中,如果需要较高的安全性能,就需要我在本篇文章的后面介绍的算法。
下面我将介绍另一个PHP支持的函数━━md5(),这一函数使用MD5散列算法,它有几种很有趣的用法值得一提:
混编
一个混编函数可以将一个可变长度的信息变换为具有固定长度被混编过的输出,也被称作“信息文摘”。这是十分有用的,因为 一个固定长度的字符串可以用来检查文件的完整性和验证数字签名以及用户身份验证。由于它适合于PHP,PHP内置的md5()混编函数将把一个可 变长度的信息转换为128位(32个字符)的信息文摘。混编的一个有趣的特点是不能通过分析混编后的信息得到原来的明码,因为混编后的结果 与原来的明码内容没有依赖关系。 即便只改变一个字符串中的一个字符,也将使得MD5混编算法计算出二个截然不同的结果。我们首先来看下 表的内容及其相应的结果:
 
使用md5()混编字符串
$msg = "This is some message that I just wrote";
$enc_msg = md5($msg);
print "hash: $enc_msg ";
?>
结果:
hash: 81ea092649ca32b5ba375e81d8f4972c
注意,结果的长度为32个字符。再来看一下下面的表,其中的$msg的值有了一点 微小的变化:
使用md5()对一个稍微变化的字符串进行混编
//注意,message中少了一个s
$msg = "This is some mesage that I just wrote";
$enc_msg = md5($msg);
print "hash2: $enc_msg

";
?>
结果:
hash2: e86cf511bd5490d46d5cd61738c82c0c

阅读全文

使PHP自定义函数返回多个值

PHP自定义函数只允许用return语句返回一个值,当return执行以后,整个函数的运行就会终止。有时候我们要求函数返回多个值时,用return是不可以把值一个接一个地输出的。但不可忽视的一点是,return语句可以返回任何类型的变量,这就是使自定义函数返回多个值的关键。请看代码:

阅读全文

PHP应用提速面面观


首先我们来看看代码优化。注意,这里的代码优化可不是指把代码写得更加美观漂亮,因为这恐怕已经是 众所周知没有必要继续讨论了;另外,如果你已经考虑到了速度问题,很可能你早就对PHP的源代码作了一些优 化。不过,有些工具却能够自动地帮助我们完成这些繁杂的工作,如Zend Optimizer就是这样一个工具。 Zend Optimizer可以从Zend Technologies免费得到,但你必须同意它的许可约定,注意它不是以 GPL方式发行。Zend Optimizer获取由Zend Engine运行时编译生成的中间代码,并对它进行优化, 从而使得中间代码具有更快的执行效率。

阅读全文

PHP初学者头疼问题总结

【1】页面之间无法传递变量 get,post,session在最新的php版本中自动全局变量是关闭的,所以要从上一页面取得提交过来得变量要使用$_GET[foo],$_POST[foo],$_SESSION[foo]来得到 
当然也可以修改自动全局变量为开(php.ini改为register_globals = On);考虑到兼容性,还是强迫自己熟悉新的写法比较好。 
【2】Win32下apache2 用get方法传递中文参数会出错 
test.php?a=你好&b=你也好 
传递参数是会导致一个内部错误 
解决办法:test.php?a=.urlencode(你好).&b=.urlencode(你也好) 
............. 
【3】win32下的session不能正常工作 
php.ini默认的session.save_path = /tmp 
这显然是linux下的配置,win32下php无法读写session文件导致session无法使用 
把它改成一个绝对路径就可以了,例如session.save_path = c:windowstemp 
【4】显示错误信息 
当php.ini的display_errors = On并且error_reporting = E_ALL时,将显示所有的错误和提示,调试的时候最好打开以便纠错,如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋值以前调用会有提示,解决办法是探测或者屏蔽 
例如显示$foo,可以if(isset($foo)) echo $foo 或者echo @$foo 
【5】Win32下mail()不能发送电子邮件 
在linux下配置好的sendmail可以发送,在win32下需要调用smtp服务器来发送电子邮件 
修改php.ini的SMTP = ip //ip是不带验证功能的smtp服务器(网上很难找到) 
php发送邮件的最好解决方法是用socket直接发送到对方email服务器而不用转发服务器 
【6】初装的mysql如果没有设置密码,应该使用 
update mysql.user set password=yourpassword where user=root 
修改密码 
【7】header already sent 
这个错误通常会在你使用HEADER的时候出现,他可能是几种原因:1,你在使用HEADER前PRING或者ECHO了2.你当前文件前面有空行3.你可能INCLUDE了一个文件,该文件尾部有空行或者输出也会出现这种错误。! 
【8】更改php.ini后没有变化 
重新启动web server,比如IIS,Apache等等,然后才会应用最新的设置 
【9】php在2003上面安装(ISAPI的安装方法恳请高手指教) 
PHP4的php4isapi.dll好像和2003有些冲突,只能用CGI模式安装 
步骤一,先www.php.net下在一个安装程序,我是装的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安装php-4.2.3-installer.exe之前保证你的IIS6.0启动了,并能够访问。 安装好以后,在默认网站-->应用程序配置 
步骤二:点击 web服务扩展 -->新建web服务扩展. 
步骤三: 扩展名-->php,然后添加 
步骤四:找到php.exe的路径添加上去。 
步骤五: 确定就可以了! 
步骤六: 选择php的服务扩展,然后点击允许。 
【10】 
有时候sql语句不起作用,对数据库操作失败 
最简便的调试方法,echo那句sql,看看变量的值能得到不 
【11】include和require的区别 
两者没有太大的区别,如果要包含的文件不存在,include提示notice,然后继续执行下面的语句,require提示致命错误并且退出 
据我测试,win32平台下它们都是先包含后执行,所以被包含文件里最好不要再有include或require语句,这样会造成目录混乱。或许*nux下情况不同,暂时还没测试 
如果一个文件不想被包含多次可以使用include_once或require_once## 读取,写入文档数据 
function r($file_name) { 
$filenum=@fopen($file_name,r); 
@flock($filenum,LOCK_SH); 
$file_data=@fread($filenum,filesize($file_name)); 
@fclose($filenum); 
return $file_data; 

function w($file_name,$data,$method=w){ 
$filenum=@fopen($file_name,$method); 
flock($filenum,LOCK_EX); 
$file_data=fwrite($filenum,$data); 
fclose($filenum); 
return $file_data; 

【12】isset()和empty()的区别 
两者都是测试变量用的 
但是isset()是测试变量是否被赋值,而empty()是测试一个已经被赋值的变量是否为空 
如果一个变量没被赋值就引用在php里是被允许的,但会有notice提示 
如果一个变量被赋空值,$foo=或者$foo=0或者 $foo=false,那么empty($foo)返回真,isset($foo)也返回真,就是说赋空值不会注销一个变量。 
要注销一个变量,可以用 unset($foo)或者$foo=NULL 
【13】mysql查询语句包含有关键字 
php查询mysql的时候,有时候mysql表名或者列名会有关键字 
这时候查询会有错误。例如表名是order,查询时候会出错 
简单的办法是sql语句里表名或者列名加上`[tab键上面]来加以区别 
例如select * from `order` 
【14】通过HTTP协议一次上传多个文件的方法 
有两个思路,是同一个方法的两种实现。具体程序还需自己去设计 
1,在form中设置多个文件输入框,用数组命名他们的名字,如下: 
 
 
 
 
 
这样,在服务器端做以下测试 
echo 

阅读全文

用PHP创建动态图形

PHP有一个令人惊讶的能力——你可以利用它的服务器端脚本创建动态图形。这项功能的基础是GD库,它是由Thomas Boutell设计的ANSI C库,这个库支持除.GIF文件之外的绝大多数常见图形文件格式(不过该库的设计者许诺当LZW专利在2004年7月7日到期后就立即添加.GIF支持)。
PHP4.3以及它的更高版本集成了GD库。如果你使用的是老版本的PHP,你需要手工安装图形支持。这儿有许多与之有关的信息。
折线图
为了演示如何用PHP创建动态图形,我们建立一些自定义图形。第一个例子是画在网格上的折线图,如图A所示。
图A
500) this.width=500' align='center' hspace='10' vspace='10'>
我们把这个页面叫着grid.php(相关附件:清单A)。为了调用Web页动态产生的图形,你只需要访问这个PHP页,它将该图形传递到浏览器。IMG元素可以很好的完成这项工作。下面是实现这个功能的例子代码:

现在,我们开始编写用于创建图形的代码。下面是grid.php中源代码片断:
//添加图形的值
$graphValues=array(0,80,23,11,190,245,50,80,111,240,55);
首先,我们定义图形的值。在这个例子中,图形值直接写到代码中的一个数组中,不过你可以很容易改写代码,让代码从XML文件、表格或者数据库中获取这些值。这些值的范围从0到250(以象素为单位的图形尺寸)。这些值将决定每个网格上线段的初始象素位置。如果你想使用数值0和100(用百分比表示),你只需把这些值乘以2.5来决定网格上的象素位置。
然后,我们发送一个PNG头并定义图像的高度和宽度:
// Define .PNG image
header("Content-type: image/png");
$imgWidth=250;
$imgHeight=250;
我们发送一个图形头来“欺骗”浏览器,使它认为我们的PHP页面是一幅真正的图像,这样它才可以正确显示在屏幕上。服务器将以二进制数据流的形式把程序产生的信息发送到浏览器。
PNG(Portable Network Graphic,便携式网路图形)标准是一种无损的图形格式,它由于GIF的 LZW算法专利这一法律问题而在1995年提出来的。
现在,我们例化图形对象并定义我们在图形中用到的颜色:
//创建图像、定义颜色
$image=imagecreate($imgWidth, $imgHeight);
$colorWhite=imagecolorallocate($image, 255, 255, 255);
$colorGrey=imagecolorallocate($image, 192, 192, 192);
$colorBlue=imagecolorallocate($image, 0, 0, 255);
我们设置白色背景,灰色画框以及蓝色折线。你可以通过创建新变量并赋不同的RGB值来轻松的修改或者添加颜色。
我们可以用imageline函数来创建灰色画框,每次调用这个函数就画一条线:
//创建图像周围的框
imageline($image, 0, 0, 0, 250, $colorGrey);
imageline($image, 0, 0, 250, 0, $colorGrey);
imageline($image, 249, 0, 249, 249, $colorGrey);
imageline($image, 0, 249, 249, 249, $colorGrey);
这里用到了二维的x/y象素坐标。Imageline函数中的每一对值指定了图像的起点和终点。
为了实现网格线,我们在x坐标轴和y坐标轴上每隔25个象素画一条灰线:
//创建网格
for ($i=1; $i<11; $i++){
imageline($image, $i*25, 0, $i*25, 250, $colorGrey);
imageline($image, 0, $i*25, 250, $i*25, $colorGrey);
}
位置(0,0)表示网格的左上角,位置(250,250)表示右下角。每个坐标轴等分为10格,每格宽度是25个象素,即250个象素(图形的尺寸)。
为了创建折线图,我们只需循环的取出数组中的坐标值,按坐标画出每条线段的起点和终点:
//创建折线图
for ($i=0; $i<10; $i++){
imageline($image, $i*25, (250-$graphValues[$i]), ($i+1)*25, (250-$graphValues[$i+1]), $colorBlue);
}
PHP将会自动在起点和终点之间填充蓝线。在这个简单的例子中只有10个值,但是扩展这个技术非常容易,如创建类似股指示意图那样的复杂图形等等。
最后,我们需要把这个图像输出到浏览器并清空服务器中保存图像的内存空间:
//输出图形并清楚内存中的图像
imagepng($image);
imagedestroy($image);
?>
直方图
把上面用于创建折线图的基本程序修改后用于创建直方图(如图B所示)。
图B
500) this.width=500' align='center' hspace='10' vspace='10'>
(相关附件:清单B)这段程序与我们上面用来画折线图的代码略有不同。Imagefilledrectangle函数创建两种直方块——深色的直方块表示$graphValues数组中保存的值,而浅色直方块则用于填充深色方块之间的空隙:
//创建直方图
for ($i=0; $i<10; $i++){
imagefilledrectangle($image, $i*25, (250-$graphValues[$i]), ($i+1)*25, 250, $colorDarkBlue);
imagefilledrectangle($image, ($i*25)+1, (250-$graphValues[$i])+1, (($i+1)*25)-5, 248, $colorLightBlue);
}
留心CPU的负荷
当你在服务器端创建这些图形时,你需要仔细考虑这个问题:CPU负荷。如果你在Web端有太多这样的动态图片产生任务,你可能会发现导致性能下降。
更复杂的用法
本文所列举的例子仅仅是个起点。如果你想得到有关PHP图形库的更多信息,请查看PHP手册上的的图形函数网页。

阅读全文

用PHP工具包expat解析XML

如今人人鼓吹XML是Web开发者最好的朋友,有了XML的帮忙,后者即可轻松地格式化和显示来自几乎任何数据源的数据。但是,对动态内容而言,格式优良的数据却还远远谈不上达到理想状态。大多数的Web开发者都会告诉你,今天的网络上没有动态内容怎么能行!问题是:“到底该如何用XML创建动态内容呢?”
答案是用动态内容处理语言来解析XML,比如用PHP或者Perl等,从理论上说,这类程序语言是可以出于各种目的利用XML的。无非是采用一些能解析XML的工具包而已。James Clark就提供了一种名叫expat的工具包。expat XML工具包用C语言解析XML,令PHP与XML轻松共舞。
PHP是一种专为Web设计的绝佳脚本语言。XML是表示Web内容的标准。两者联手真是要多美有多美!
下面我会给读者演示一个简单的示例,通过这个例子即可说明如何用PHP把XML文档解析为HTML。然后我会介绍一些PHP的其他XML概念。用PHP解析XML很简单,操作起来很直观但却需要对细节有所解释。一旦真正掌握了应用的要领,你肯定会惊奇自己怎么不早想到把它们俩拢一块儿来。
概述
PHP用expat这种XML工具包,通过C语言来解析XML。这个工具包的函数集同Perl XML解析所采用的函数集是一样的,此外,这种工具包还是事件驱动型的解析器。这就是说,expat把每个XML标签或者新一行代码当作事件的起始,而事件就是函数的触发器。Expat的安装非常简单,如果你正在用着Apache Web服务器,那么你可以在PHP XML参考页上找到安装和下载指南。
用PHP解析XML的基本任务是这样的:首先,创建XML解析器的一个实例。接着,定义处理触发事件的函数,比如开始或者结束标签等。随后,定义实际意义的数据处理程序。最后,打开XML文件,读取文件数据并解析数据。之后关闭文件释放XML解析器。
你瞧,就像我说的那样,这套操作过程没什么特别的。不过,在我们讨论具体的示例之前先了解以下的一些警示:
Expat不对XML进行检验。这意味着只要XML文件格式正确——所有的元素嵌套得当、开始和关闭标签没有任何错误——它就会被解析。Expat可不管XML是否遵守XML文件头中引用的标准或者定义。
Expat把XML标签全部转换为大写字母。如果你的脚本在标签名和其他内容上大小写字母混用可就要小心了。
PHP是在magic quotes设置启用的情况下编译而成,那么复杂的XML文件不会得到正确的解析。要是magic quotes不是默认设置,你就当我没说。
好了,我们现在就来看看有关的示例!
基本示例
为了把复杂的事情简单化,我在例子中省略了错误检查和其他一些不必要的东西,当然,你可以在自己的代码随心所欲。我假定你早就熟悉PHP及其语法,而我会对XML函数做一番解释。首先我会说明脚本程序的含义,接着定义用户定义函数,实际上这些函数位于引用它们的代码之前。相关附件:程序清单A 所示为脚本的完整代码,脚本要解析的XML文档则是 相关附件:程序清单B。处理之后的输出结果如表A所示。
XML Articles
"Remedial XML for programmers: Basic syntax"            In this first installment in a three-part series, I'll introduce you to XML and its basic syntax.
"Remedial XML: Enforcing document formats with DTDs"            To enforce structure requirements for an XML document, you have to turn to one of XML's attendant technologies, data type definition (DTD).
"Remedial XML: Using XML Schema"            In this article, we'll briefly touch on the shortcomings of DTDs and discuss the basics of a newer, more powerful standard: XML Schemas.
"Remedial XML: Say hello to DOM"            Now it's time to put on your programmer's hat and get acquainted with Document Object Model (DOM), which provides easy access to XML documents via a tree-like set of objects.
"Remedial XML: Learning to play SAX"            In this fifth installment in our Remedial XML series, I'll introduce you to the SAX API and provide some links to SAX implementations in several languages.
表A  PHP解析XML的输出结果
首先我创建了XML解析器的一个实例:
$parser = xml_parser_create();
接着,我定义解析器遭遇开始和结束标签时的操作。注意“startElement”和“endElement”是用户定义的函数,当然你可以按照自己的喜好给它们起个其他名字,但我起的这些名字可是标准的习惯要求。
xml_set_element_handler($parser, “startElement”, “endElement”);
然后我定义了数据操作。这里的“characterData”也是用户定义的函数,名字也是习惯性的。
xml_set_character_data_handler($parser, “characterData”);
现在打开文件读取数据。你可以在这里开始编写错误处理代码,我在例子中省略了这些错误处理。不要忘了在脚本的开头定义$xml_file。
$filehandler = fopen($xml_file, “r”);
我开始读取文件内容,一次读4K字节并放在变量“$data”内直到文件末尾。我用xml_parse解析读取的这些数据段。
while ($data = fread($filehandler, 4096)) {
  xml_parse($parser, $data, feof($filehandler));
}
最后进行清空、关闭文件和释放解析器等操作。
fclose($filehandler);
xml_parser_free($parser);
以上就是脚本中所用到的所有XML函数,下面我再具体解释下其中用到的3个用户定义函数,它们就是“startElement”、“endElement”和“characterData”。
只要xml_parse遇到

阅读全文

快速入门一、开始使用SpeedPHP

SpeedPHP是一个以快速学习为基础的PHP框架,因此不仅在程序的设计上力求简单易用、注释完整;并且在教程的写作上,也是做到图文并茂,重点突出,尽力让框架使用者在最短的时间内理解和开始使用SpeedPHP框架(以下简称sp框架)。

阅读全文

ThinkPHP搭建手机版网站

代码中的函数 is_mobile来源于网上,写得挺好的。入口文件通过判断终端类型,定义APP_PATH和APP_NAME,从而执行不同的分组。我要实现的效果是PC和Mobile均用顶级域名访问。当然了,如果你想在手机里实现类似于wap.xxx.com这样的访问,本方法是做不到的,这是thinkphp多域名部署的问题,具体参见tp手册。
用thinkphp框架快速开发一个小型站点还是很方便的,正如本站。菜根网还做了一个手机端的网站,手机浏览器输入本站域名www.icaigen.com查看效果。

下面仅仅讲述在thinkphp的前端引导页面index.php文件中实现平台判断,从而加载不同的分组(或项目)。

阅读全文

ThinkPHP3.1快速入门(1)基础


ThinkPHP是一个快速、简单的基于MVC和面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,尤其注重开发体验和易用性,并且拥有众多的原创功能和特性,为WEB应用开发提供了强有力的支持。

目录结构

ThinkPHP最新版本可以在官方网站(http://thinkphp.cn/down/framework.html)或者Github(https://github.com/liu21st/thinkphp/downloads)下载。
把下载后的压缩文件解压到你的WEB目录(或者任何目录都可以),框架的目录结构为:
├─ThinkPHP.php 框架入口文件
├─Common 框架公共文件
├─Conf 框架配置文件
├─Extend 框架扩展目录
├─Lang 核心语言包目录
├─Lib 核心类库目录
│ ├─Behavior 核心行为类库
│ ├─Core 核心基类库
│ ├─Driver 内置驱动
│ │ ├─Cache 内置缓存驱动
│ │ ├─Db 内置数据库驱动
│ │ ├─TagLib 内置标签驱动
│ │ └─Template 内置模板引擎驱动
│ └─Template 内置模板引擎
└─Tpl 系统模板目录
复制代码

注意,框架的公共入口文件ThinkPHP.php是不能直接执行的,该文件只能在项目入口文件中调用才能正常运行(后面会讲到),这是很多新手很容易犯的一个错误。

入口文件

在开始之前,你需要一个Web服务器和PHP运行环境,如果你暂时还没有,我们推荐使用集成开发环境WAMPServer(是一个集成了Apache、PHP和MySQL的开发套件,而且支持多个PHP版本、MySQL版本和Apache版本的切换)来使用ThinkPHP进行本地开发和测试。
接下来我们先在WEB根目录下面创建一个app子目录(这个app就是我们的项目名),然后在该目录下面创建一个index.php文件,添加一行简单的代码:
<?php
require '/ThinkPHP框架所在目录/ThinkPHP.php';
复制代码

这行代码的作用就是加载ThinkPHP框架的入口文件ThinkPHP.php,这是所有基于ThinkPHP开发应用的第一步。
然后,在浏览器中访问这个入口文件。
http://localhost/app/
复制代码

一般Web服务器的默认文件是index.php,所以我们可以不需要在URL地址中加上index.php。运行后我们会看到欢迎页面,

而且已经自动生成了项目目录,目录结构如下:

阅读全文

PHP框架 ZenTaoPHP

一、什么是ZenTaoPHP框架
ZenTaoPHP框架是由禅道项目管理软件开发团队开发的一款轻量级的PHP开发框架,它主要的特点是:

1.1 代码简单
ZenTaoPHP框架核心只有四个文件,分别为调度类router.class.php,control类control.class.php,model类model.class.php和工具类helper.class.php。里面的代码也足够简单。这样大家可以很容易的读懂它的代码,并根据自己的实际应用进行定制修改。

阅读全文