单击此处编辑母版文本样式,第二级,第三级,第四级,Page,*,单击此处编辑母版标题样式,PHP开发从入门到精通,在,PHP,进行程序开发时,用户需要对自己所处主机的环境以及访问者的信息做一定的了解。比如,想要记录访问者的,IP,地址或者浏览器的类型、了解当前服务器的相关特征等,这些都属于主机信息。本章将详细介绍如何获取主机信息。,主机信息中少不了系统时间的获取,想要知道访问者于何时访问了你的程序,需要在程序中进行系统时间的获取,如用户注册与访问的时间、用户留言的时间等。本章详细讲解时间函数,date(),、,time(),、,mktime(),等函数的用法,并就如何计算两个时间之间的间隔进行讨论与分析,还对,checkdate(),函数、,strtotime(),函数以及,getdate(),函数进行简单介绍。,第,11,章,PHP,中的主机信息获取,-网站开发专用书,【,例,11-1】,系统主机信息获取,$_SERVER,的运用,用户对服务器信息的获取,可以直接通过访问根目录下的,http:/localhost/phpinfo.php,文件来实现。在,phpinfo.php,文件中只有一行语句,即:,phpinfo(),函数直接返回主机的全部信息。为了防止用户看到主机的相关安全信息,有些服务提供商将这个函数禁用了。,【,例,11-1】,系统主机信息获取,$_SERVER,的运用,若要在网页中对主机信息进行获取,需运用服务器变量,$_SERVER,。在第,5,章已经知道,,$_SERVER,是一个特殊的,PHP,预定义变量,它包含了主机提供的所有信息,在所有的脚本中都有效,称为超级全局变量(或“自动全局变量”)。要显示相关主机信息,只需按如下语法结构进行即可:,$_SERVER“,主机信息”,;,这种,$_SERVER,变量出现在,PHP 4.1.0,及以后版本使用。之前的版本使用,$HTTP_SERVER_VARS,。,【,例,11-2】,系统时间的获取,计算两个时间的间隔长度,在,UNIX,系统中保存当前日期和时间的方法为:保存格林威治标准时间从,1970,年,1,月,1,日,0,点起到当前时刻的秒数,以,32,位整数表示,其中,1970,年,1,月,1,日,0,点称为,UNIX,纪元。,虽然是,UNIX,时间戳,但是同样也可以在,Windows,下正常地运行,但要记住,,UNIX,时间戳在,Windows,下必须是正数。,若要将某一个时间与日期转变成,UNIX,时间戳,可以使用,mktime,()函数。,mktime,()函数的相关语法如下:,格式如下:,int mktime,(,int hour,int minute,int second,int month,int day,int year,int is_dst,),说明:根据给出的参数返回,Unix,时间戳。时间戳是一个长整数,包含了从,Unix,纪元(,January 1 1970 00:00:00 GMT,)到给定时间的秒数。函数中的七个参数均是可选的,若这,7,项参加有缺少,则自动判断从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值。,【,例,11-2】,系统时间的获取,计算两个时间的间隔长度,date,()函数:对某一个日期或者时间进行格式化。,语法如下:,string date(string,格式字符串,int,时间戳,),date,()函数有两个参数,第一个是格式字符串,第二个是,UNIX,时间戳。函数将返回将整数时间戳按照指定的格式字串而产生的字符串。如果没有给出时间戳则使用本地当前时间。换句话说,时间戳是可选的,默认值为,time,()。要将字符串表达的时间转换成时间戳,可以使用,strtotime,()与,mktime,()函数。此外一些数据库有一些函数将其时间格式转换成时间戳(如,MySQL,的,UNIX_TIMESTAMP,函数)。,【,例,11-2】,系统时间的获取,计算两个时间的间隔长度,time,()函数:返回当前的,Unix,时间戳。,语法如下:,int time(void),返回自从,Unix,纪元(格林威治时间,1970,年,1,月,1,日,00:00:00,)到当前时间的秒数。该函数没有任何参数。,有语句:,echo time();/,以时间戳的形式显示当前时间,显示结果为:,1217837887,【,例,11-2】,系统时间的获取,计算两个时间的间隔长度,计算两个时间之间的间隔长度。,从上面的,mktime,()与,time,()函数得到日期与时间的时间戳,也就是从,Unix,纪元(格林威治时间,1970,年,1,月,1,日,00:00:00,)到指定时间的秒数。两个时间之间的差值结果当然也是秒数,那么,如何将秒数转化成具体的某年某月某日某小时某分钟某秒钟?,本例的以下代码将这个问题解决了:,$day=floor($final-$nowtime)/(60*60*24);/,天数,$hour=floor($final-$nowtime)%(60*60*24)/(60*60);/,小时数,$second=floor($final-$nowtime)%(60*60*24)%(60*60)/60);/,分钟数,$minute=($final-$nowtime)%(60*60*24)%(60*60)%60;/,秒数,其中的,60*60*24,表示一天,因为一天有,24,个小时,每个小时有,60,分钟,一分钟有,60,秒。同理,,60*60,表示一个小时。,天数,floor(,结束时间与开始时间相差的毫秒数,/(60*60*24),;,小时数,floor(,结束时间与开始时间相差的毫秒数,%(60*60*24)/(60*60),;,分钟数,floor(,结束时间与开始时间相差的毫秒数,)%(60*60*24)%(60*60)/60);,秒数,(,结束时间与开始时间相差的毫秒数,)%(60*60*24)%(60*60)%60;,【,例,11-2】,系统时间的获取,计算两个时间的间隔长度,checkdate,()函数:验证给定的日期是否合法。,语法如下:,bool checkdate(int month,int day,int year),如果给出的日期有效则返回,TRUE,,否则返回,FALSE,。检查由参数构成的日期的合法性。日期在以下情况下被认为有效:,year,的值是从,1,到,32767,month,的值是从,1,到,12,Day,的值在给定的,month,所应该具有的天数范围之内,闰年已经考虑进去了。,【,例,11-2】,系统时间的获取,计算两个时间的间隔长度,getdate,()函数:获得时间及日期信息。,语法如下:,array getdate(int,时间戳,),返回一个根据时间戳得出的包含有日期信息的结合数组。如果没有给出时间戳则认为是当前本地时间。数组中的单元如表,11-3,所示:,【,例,11-2】,系统时间的获取,计算两个时间的间隔长度,strtotime,()函数:将任何英文文本的日期时间描述解析为,Unix,时间戳。,语法如下:,int strtotime(string time,int now),本函数预期接受一个包含美国英语日期格式的字符串并尝试将其解析为,Unix,时间戳(自,January 1 1970 00:00:00 GMT,起的秒数),其值相对于,now,参数给出的时间,如果没有提供此参数则用系统当前时间。如果给定的年份是两位数字的格式,则其值,0-69,表示,2000-2069,,,70-100,表示,1970-2000,。函数返回一个逻辑值,解析成功则返回时间戳,否则返回,FALSE,。,【,例,11-3】,图片倒计时实例,本实例在例11-2的基础上,添加了一些内容,首先定义了一个名为imgshow()的函数,。,小结,本章详细介绍了如何获取主机信息和时间函数的使用。内容包括获取主机信息的全局变量,$_SERVER,,以及时间函数,date(),、,time(),、,mktime(),等的详细用法,并就如何计算两个时间之间的间隔进行了讨论与分析,还对,checkdate(),函数、,strtotime(),函数以及,getdate(),函数做了简单介绍。,