• 快速、超低负载的Arsue PHP+NoSQL+Linux全动态博客程序正在开发中 订阅本博客
  • Blog首页关于自由勇Blog存档联系自由勇留言板网站地图友情链接

  • 分类文档:PHP 18篇

    关于网页时区的设置

    2010年12月15日 13:45

    美国空间与中国的时差,多为15小时,或者12小时、13小时,也有6小时的,这4种时区的美国空间我都用过,国外空间的时区很多是不一样的。有很多人在推荐修改服务器配置文件如php.ini,或者修改.htaccess。较少人推荐修改程序,我觉得修改程序,在程序里设置是相对最好的办法。因为php.ini不是所有的空间都支持;.htaccess放在根目录里做此设置是会增加资源的负担的,放在根目录的.htaccess文件,对整个网站都有效。

    如果.htaccess文件放在需要设置时区的程序的同一目录里,当更换空间时,这些.htaccess文件都需要修改。因为需要用到设置时区的网页,通常是极少数的,占网站的很小一部分,例如发表留言程序,有记录时间的程序,所以我是在数据库里建立一个值,然后在PHP文件里调用这个值。当更换空间时,只要一次修改一下这个值即可,所以用程序来设置时区是相当最好的办法。

    固定链接 | 发表评论(0) | Trackback(0)

    日记随笔:论坛程序再次开发完成

    2010年08月26日 09:44

    最近两个月真的很忙,所以有一段时间没有更新博客了,工作上总是有忙不完的事情。经过很多次的大修改,最新版的论坛程序,在昨天上线了,例如这个版块:http://garden.cpfor.com/group/carnivorousplants/。

    cpfor.com的论坛是orshu.com的子论坛,使用同一个数据库,所以用户只需要在cpfor.com或者orshu.com注册一个用户名即可,不需要重复注册。也就是,在orshu.com注册的用户名,在cpfor.com也可以登录;相反亦可。但并不是多域名绑定同一个空间,而是多域名使用同一个数据库。

    这个新版的论坛程序,是采用多域名的泛域名解析、或者二级域名,共同使用orshu.com的程序和数据库。对于用户而言,只要在orshu.com或其它域名的子论坛当中注册一个用户名即可,不需要每个不同域名都注册一个帐号,有些类似于“通行证”,我原先想把这个帐号命名为“Orshu通行证”,现在暂时命名为“Orshu帐号”。

    这个新版的论坛程序,支持多版块、多语言,论坛同时支持中/英文。但是因为时间的关系,orshu.com的论坛目前只用于中文,程序中已包含中/英文语言的切换,预留了此重要的功能。当增加新的语言时,只需增加相应的语言包即可。简体中文/繁体中文的切换,是使用JavaScript的方式,可以节省很多的服务器资源,又减少开发的成本。因为汉字的字符ANSI编码占2个字节,汉字的字符UTF-8编码占3个字节,所以orshu.com的论坛程序语言使用GB2312,编码使用ANSI(936)。而英文字母、数字的的编码,无论是UTF-8还是GB2312,都是占用1个字符,所以使用UTF-8语言和编码的英文的论坛程序需要使用其它的域名。

    ufoaq.com是我开发的第1个PHP标题列表式论坛程序,当时是单版块的。后来改为多域名、多版块、多语言,现在又改成了新的orshu.com程序,最近开发了上传图片、游客不需要注册、认证游客、黑名单等功能。为了用户不需要重复注册帐号,也为了管理方便,ufoaq.com的帐号有可能会合并到Orshu帐号。

    TGF是我开发的第1个PHP留言板式的封闭式论坛程序,用了300多小时开发完成,http://www.auiou.com/relevant/00000446.jsp,程序有一些不足之处,所以那个论坛已经暂时关闭了。今后,可能还会考虑再次编写和修改这个程序。

    这些程序原本在几年前就应该实现,现在刚实现可能有些晚了,但是那时候只能用ASP开发,并且没有现在自己设计的论坛数据库结构和论坛程序结构和思路。这个论坛数据库结构和论坛程序结构是在2008年才设计完成,并且开发完成的。我的PHP起步很晚,PHP学了6年多都没有学会(6年多当中只是偶尔关注一下PHP),直到2009年初需要使用国外空间,才学会了PHP。原来的网站语言,全部转化为PHP,PHP是最为理想的网站编程语言之一,最重要的原因是程序简洁,会减轻不少的工作量。

    今年是我编程生活的第8年,我已经30岁了,编写程序的工作量是十分庞大的,很辛苦,当中有大量的工作细节和大量需要解决的问题,并且每次开发经常会遇到前所未有的新问题,语言是难以形容的。但是好处是一次开发完成,就不用再重复劳动了,只是需要不断地改进,经过多次的小修改、大修改,程序会越来越完美。

    固定链接 | 发表评论(1) | Trackback(1)

    日记:2010-04-05

    2010年04月05日 17:56

    昨天重新写了一个新的分页程序,类似于这样的存档功能:http://www.ufoaq.com/archives/201003/。这个分页程序比较复杂,是打开2组数据库,大约是在2006年完成的ASP程序,后来移植到PHP程序。因为当时写程序的时候,没有记笔记,算法已经记不清了。后来重新写了这个程序大约2次,每次都需要2~4天,都没有成功,失败了,运行的结果总是不正确。这次重新编写成功了,并记录了笔记。因为这个分页的算法太重要了,我需要熟练地掌握它,并且理解它,希望让它有更简单的算法,我以前写的论坛程序www.ufoaq.com、留言板程序http://www.ufoaq.com/cast/wish/,都是使用这样的分页算法,所以才可以支持很大的容量。

    因为当时没有写工作日志,算法已经完全忘记了。直接看程序,无法看出当时打草稿时的数字规律,无法看懂。所以很多程序都直接使用大约2006年推算的算法,经过很多的测试,从未出错。http://www.ufoaq.com/archives/201003/的程序是每页300条记录,分为2纵列。打开2组数据库,然后依次显示每条数据。当显示完第150条数据时,输出一个<li>元素使其分成第2列。现在这个程序重新写,2组数据库提取时,让其合并为1组就方便多了。2组数据库,或者多组数据库合并为1组的好处是后续的操作简便,可以实现更多的功能。例如让其第1页显示100条记录,从第2页开始每页显示300条记录;15条记录×2列为1个区域,即30条记录/区域,每页10个区域,即每页300条,以分区域的方式显示。

    我写的博客程序www.auiou.com和www.zj7.com的分页程序的算法相对比上述简单很多,如首页之后的第2页、第3页的分页程序,分类和按月存档的的分页程序,都是相同的算法,如这里http://www.auiou.com/relevant/00000445.jsp,这个算法任何语言都可以通用。但还可以再简化,例如PHP可以直接用$p=ceil($auf/$w3);一个语句就可以获得总共的页数。所以这个博客的分页程序可以简化为:

    <?//$pa为页数
    $w3=10;
    $p=ceil($auf/$w3);
    if (!$p) $p=1;
    $w1=($pa-1)*$w3+1;
    $w2=$pa*$w3;
    if ($w2>$auf) $w2=$auf;?>

    因为打开多组数据库的分页比较复杂,这2天总是出现很多的错误。每一次程序很乱的时候,就把相应的大片的程序删除,再重新写,反复写了3次。今天调试的时候,发现昨天写的程序中有四、五处错误,逐个排查之后,经过很多测试,程序运行正常。

    这2天运算的一些过程:

    23 4:
    第N页数据组1组数据库的情形2组数据库的情形规律
    131-41-3 1-1
    225-82-52=5-3
    329-126-96=9-3
    4213-1610-10 1-310=13-3
    5117-204-74=17-13
    6121-238-108=21-13

    说明:上面的23 4,表示:23是总共有23条数据,4为每页显示4条记录;其中,每组数据库有10条记录,下述用变量$i3表示。下面的数据与上述的格式相同,因为篇幅的关系,不再打表格,因为我在用数字做演算测试的时候,也没有像上面一样打表格,而是直接用下面的方式来记录:

    23 5
    1 3 1-5 1-3 1-2
    2 2 6-10 3-7 3=6-3
    3 2 11-15 8-10 1-2 8=11-3
    4 1 16-20 3-7 3=16-13
    5 1 21-23 8-10 8=21-13

    23 6
    1 3 1-6 1-3 1-3
    2 2 7-12 4-9 4=7-3
    3 2 13-18 10-10 1-5 10=13-3
    4 1 19-23 6-10 6=19-13

    30 6
    1 3 1-6 1-6
    2 3 7-12 7-10 1-2
    3 2 13-18 3-8 3=13-10
    4 1 19-24 9-10 1-4 9=19-10
    5 1 25-30 5-10 5=25-20

    33 6
    1 4 1-6 1-3 1-3
    2 3 7-12 4-9 4=7-3
    3 3 13-18 10-10 1-5 10=13-3
    4 2 19-24 6-10 1-1 6=19-13
    5 1 25-30 2-7 2=25-23
    6 1 31-33 8-10 8=31-23

    $e4的值表示提取最近一组数据的数据条数:
    <?$pb=ceil($e1/$i3);
    $p=$pb;
    $e4=$e1-($pb-1)*$i3;?>

    通过上述很多数据的反复对比,如23 4这些数据,其规律10=13-3,4=17-13,8=21-13,其中等号左边的值如10、4、8,是2组数据库时提取第1组数据库时的$w1,等号右边的被减数13、17、21,是2组数据库时的$w1,等号右边的减数3、13、13,是我需要重点推算出来的值,这个值很容易出错,假设这个值的变量是$e5。$e5的意义是,在当前的页面中,$e5表示之前显示过多少条数据。最终经过直接观察数字的规律而直接写公式,我并不明白这是为什么,但是根据数字的规律用这个推算出来的公式,就不会出错了。规律如下:

    数据编号需要减去的值$n1
    30
    210
    120

    同样的格式:

    2 0
    1 10

    如果将$n1显示为未乘以$i3前的值,如下:

    3 0
    2 1
    1 2

    4 0
    3 1
    2 2
    1 3

    通过上述的规律,最终,$e5的值可以准确地获得了,如下:
    <?$e5=$e4+($pb-1-$f1)*$i3?>
    其中,$f1表示数据组的编号。用上述获得$p页数同样的方法来获得$f1,如下:

    <$i=$e1+1;
    $j1=$i-$w5;
    $f1=ceil($j1/$i3);?>

    变量$a5表示如上述提到的第1页特定显示的条目数如100条记录,$w5和$w6是最终要获得的2组数据库合并后的起始和结束值,$w5是起始值,$w6是结束值;相当于这页程序http://www.auiou.com/relevant/00000445.jsp的$w1和$w2。为了不造成混淆,必须使用2个不同的变量,因为当$a5存在时,$w5和$w1的值不同。$w5和$w6的获得方法:

    <$w5=$w1;$w6=$w2;
    if ($a5){if ($pa==1){$w6=$a5;$e6=$a5;}
    if ($pa>1){$w5=$w5-($w3-$a5);$w6=$w3+$w5-1;}
    $p=ceil(($e1-$a5)/$i3)+1;}
    if ($w6>$e1) $w6=$e1;?>

    通过对各个部分的反复思考和测试,最终大功告成了。很多程序,以及程序中的变量代表的含义,经常是没有唯一的意义,或者方法,或者思维方法,一会儿这样,一会儿那样;一会儿代表这个含义,一会儿代表那个含义。但最终还是能通过使用不同的方法,实现想要实现的功能、解决问题,殊途同归,有些类似于代数、几何的证明题用不同的方法证明同一个命题。

    固定链接 | 发表评论(0) | Trackback(0)

    我这样统计整个远程网站的大小

    2010年03月30日 10:20

    这几天设计了一套程序,当服务器不支持压缩/解压缩时,为了避免FTP经常中断而不使用FTP,通过本地的PHP程序,可以下载自己的任意网站的所有源程序文件,http://www.zj7.com/strive/76。无论网站是PHP空间,还是ASP,ASP.net,JSP等空间,在远程网站写相应的“接口”程序,本地文件就可以自动下载整站程序。经过测试,程序运行良好。

    当整个网站下载完毕之后,需要检查是否有的文件没有下载,或者下载不完全。在本地建立一个日志文件如info.txt,用来记录服务器上整个网站的大小、文件个数、文件夹个数,整站下载完毕后查看本地目录的整个网站大小、文件个数、文件夹个数,对比info.txt,如果这3个值都分别相同,说明完整地下载了。

    统计整个远程网站的大小需要遍历远程网站的所有子目录。遍历所有子目录,必须建立自定义函数function aa(),以及使用while循环,在while反复调用aa()函数。而PHP中,function **(){}大括号中的变量不能被大括号外调用,这是造成程序设计困难的很大障碍,但最终还是有对策,可是繁琐了很多。如果PHP的function的大括号中的变量能够被大括号外调用,就简单许多了。因为遍历文件夹当中,用while循环多次调用这个aa(),尝试用return来调用大括号中的变量,但还是失败了,因为每一次循环,return的值会被清空,并且不能累加。经过一晚上的思考,每个文件大小用echo语句输出为HTML代码,再被本地程序用file_get_contents()函数获得远程所有的每个文件的大小,然后在本地再累加,就可以解决PHP的这一不便了。思路如:

    远程网站的http://www.zj7.com/aa.php:

    <?function aa(){//$g的值为遍历的每个文件。
    if (!is_dir($g) filesize($g)."\n";
    }?>

    本地程序:

    <?$i=@file_get_contents("http://www.zj7.com/aa.php");
    echo $i;
    $i="";?>

    然后对http://www.zj7.com/aa.php产生的数字,逐行进行累加,就可以统计整个远程网站的大小。

    固定链接 | 发表评论(0) | Trackback(0)

    日记:2010-03-29

    2010年03月29日 23:06

    如果服务器不能压缩/解压缩,我想了远程批量下载文件的办法,并且使其下载后的目录与原来保持一致。程序已经整整写了3天,前两天把ASP和PHP的程序都写完了,前2天编写的程序流程如这里的第2段:http://www.zj7.com/strive/75。

    但昨晚发现了一个问题,如果第1步先将所有文件在远程复制到远程的目录,当文件个数很多,比如几千个文件,短时间内会比较消耗服务器资源。于是今天用了1天的时间,把整个程序改为先在服务器遍历文件夹,产生文件列表,并统计所有文件的大小总和,然后被本地调用。本地的程序一定要只用一种语言编写,而且尽可能将程序写在本地,而尽量不要写在远程,因为本地的Apache和PHP环境配置较好,避免远程服务器不支持某些函数或功能。本地程序相当于一个大的公共程序,或者相当于接口,或者相当于一个软件。

    ASP程序今天做了测试,运行很顺利,可使用XML调用远程数据。有一个PHP空间被关闭了allow_url_fopen,无法使用file_get_contents()函数调用远程数据。于是程序明天要再次做大的修改,因为远程的PHP空间不能使用file_get_contents()函数,但本地的PHP环境可以使用file_get_contents()函数,所以将调用远程数据放在本地的程序中。同时为了保持“接口”相关程序的一致,远程的ASP程序与远程的PHP程序,要尽可能保持一致。我现在已经把它们保持了一致,看起来很舒服。

    在调试的过程中,无意中发现PHP的file_exists()函数的一点不足,确实如此。我的PHP版本是5.2.8,如果file_exists()指定需要判断的值是一个文件夹,当这个文件夹存在时(同名的文件不存在),返回的值是1,如果不存在这一不足、正常的话,返回的值应该是0,或者"",或者False。也就是说,PHP的file_exists()函数会误把文件夹当成是文件。而is_dir()则不存在此问题,所以,当需要判断一个存在的路径是文件还是文件夹,应该使用is_dir()来判断,而不应该使用file_exists(),因为这时候file_exists()会有误判的情形。

    固定链接 | 发表评论(1) | Trackback(1)

    日记:2010-03-27

    2010年03月27日 09:49

    因为大多数ASP空间不支持在线压缩、解压缩;或者少数的PHP空间禁止了gzcompress()函数,不能实现在线压缩。用FTP下载整站进行备份,会经常出现中断,操作十分繁琐。

    经过考虑和测试,还是有解决办法的。在网站上写一些程序,遍历所有文件夹,使整站文件复制到一个文件夹或者多个文件夹,并且复制文件时将文件全部改扩展名,例如aa.php改名为aa.php&au;如http://www.zj7.com/proportion/3355.php,改名为proportion~3355.php&au,改扩展名是为了使PHP、ASP、HTML、JPG、GIF等文件可以直接被本地下载。然后让其产生2个列表,分别是文件列表和文件夹列表。在本地使用PHP编写程序,先获得上述2个列表到本地。然后使用PHP的copy()函数,批量远程下载这些文件,copy时批量改名为原来的名字如aa.php,并使其下载到相应到文件夹。

    因为下载的文件很多,PHP运行超过30秒通常会报错,所以使用get+跳转的方法,让其一个一个下载。如aaa.php?n=1下载完后,跳转到aaa.php?n=2、aaa.php?n=3……这相当于将循环程序拆分。全部下载完毕后,删除服务器上的临时文件,将本地文件打成压缩包进行备份。

    如果服务器空间不能支持在线解压缩,用与上述相反的方法,在本地生成文件列表,在服务器上写一段上传程序,然后使用get+跳转的方法,用程序抓取本地文件,让其一个一个上传,而不使用FTP。

    固定链接 | 发表评论(2) | Trackback(1)

    运行PHP,国内的IIS主机太多,Apache主机太少

    2010年02月11日 10:41

    本文提到的主机,均是指虚拟主机。运行PHP,Windows+IIS与Windows+Apache的速度差别如之前的测试:http://www.auiou.com/relevant/00000516.jsp(慎用全能空间,PHP空间使用IIS很慢,应使用Apache)。并且,IIS一定不支持.htaccess。

    我没有做过Windows+Apache与Linux+Apache的对比,比如速度、内存和CPU的占有率,但是Windows+Apache的速度已经很令我满意,并且能够很好地支持.htaccess,所以运行PHP的话,Windows+Apache要比Windows+IIS+PHP优越很多,也能够满足企业网站的需要。

    因为Linux主机的安装比Windows主机繁琐,所以国内的Linux虚拟主机太少,估计不到1%。本文标题提到“IIS主机”,“Apache主机”,是因为本文并不强求Linux主机的普及,如果有Windows+Apache+PHP的专用虚拟主机,要远优越于现在的Windows+IIS+ASP+PHP+ASP.net的全能主机。

    国外的Windows主机比Linux主机价格贵;国内则相反。很可能是因为国外的Windows主机需要交版权费,所以价格贵;国内因为Linux技术不普及,所以价格贵。

    网站的编程语言个人觉得PHP比较好,是更理想的网站开发语言。PHP的优点:语言更简单,程序代码简洁,开发速度比ASP快,PHP可以轻松实现很多功能。ASP语言比较繁琐,PHP的简洁程度,约是ASP的2~5倍。

    固定链接 | 发表评论(3) | Trackback(0)

    日记:2010-01-16

    2010年01月16日 08:42

    因为国内、国外大多数的Linux主机都不支持mod_expires,如这里http://www.zj7.com/strive/17,无法使用.htaccess文件来直接使用mod_expires设定图片的过期时间。

    经过测试,最终还是有了无奈的替代办法,在图片的文件夹建立一个.htaccess文件,使用404错误或者Rewrite模块均可。将404错误或者Rewrite指向一个auf.php,这个auf.php中使用header("Expires:")来设定图片的过期时间,截取地址栏中图片的文件名如$a1,使用include()函数来包含图片文件,如include($a1)。由此可见,PHP的include()函数功能强大。

    远程的图片也可以用file_get_contents()函数来调用,写入到auf.php中,也可以设置远程图片的过期时间,可见PHP的功能强大。

    固定链接 | 发表评论(0) | Trackback(0)

    PHP与JavaScript的包含另外3点不同

    2010年01月10日 13:56

    如之前提到的PHP与JavaScript的“包含”,在网页的过期时间上的1点不同,http://www.zj7.com/strive/20,另外还有3点不同:

    1. PHP的包含是边下载边显示网页内容;JavaScript的包含需要等被包含的文件加载完毕才可以显示。
    2. PHP的include()函数只能调用本服务器的文件,不能直接调用远程文件;JavaScript的包含可调用远程文件。所以为了加快网页的显示,远程调用的JavaScript包含文件,我需要将它拆分为至少2个文件,第一个文件为体积较小的文件。
    3. PHP的包含可以被搜索引擎索引;JavaScript的包含无法被搜索引擎索引。

    固定链接 | 发表评论(0) | Trackback(0)

    编程与.htaccess文件的关系

    2010年01月09日 09:54

    本文仅为日记。Apache提供的功能强大的.htaccess文件,实际上是实现httpd.conf的部分服务器配置功能。.htaccess文件可以写入正则表达式,写入相关的命令等等,这些命令再被Apache解析,这些命令的实质是启动Apache后台相关的程序。

    Apache提供的.htaccess文件功能,可以实现特殊的功能,如使每个文件夹调用Rewrite模块、mod_expires模块、每个文件夹指定404错误页,等等,这些都是PHP、JSP、Perl等任何编程语言无法直接实现的,因为.htaccess文件是实现服务器的配置功能。然而,如果需要做更复杂的判断,则需要.htaccess文件与编程相配合。如之前的例子,http://www.zj7.com/strive/28,使用.htaccess文件与PHP编程相结合,.htaccess文件指定404错误页,PHP程序通过判断来选择多个404错误页。

    使用Apache作为服务器后台的程序,如PHP,都可以使用.htaccess文件。ASP+IIS或者PHP+IIS无法实现.htaccess文件的功能,因为IIS不支持.htaccess文件。

    固定链接 | 发表评论(2) | Trackback(0)

    节省了一个独立IP

    2010年01月09日 08:39

    因为IXWebHosting的主机赠送多个独立IP。我使用了其中的一个独立IP用作解析无限个二级域名的首页和部分内页(这些不同的一级域名的二级域名,使用同一个空间,整合在一起);另一个独立IP,用作多个域名的泛域名解析。昨天终于把这两个独立IP的网页合并在了一起,通过一个判断语句,使用一个独立IP同时实现了多个域名的二级域名解析、多个域名的泛域名解析。经过本地和服务器的测试,程序运行正常。

    这样节省了一个独立IP,今后如果更换服务商,只要购买一个独立IP就可以了,而不用购买2个独立IP。我的方法是把要解析的二级域名、泛域名解析的IP都指向这个独立IP,网站控制面板不需要任何设置,在这个独立IP对应的空间的根目录建立一个index.php文件,用这个文件读出地址栏,然后用include()函数包含对应的二级域名或泛域名解析的首页文件。include()的优先顺序是先判断二级域名的首页文件是否存在,如果存在,则include二级域名的首页文件;如果不存在,则include泛域名的首页文件。

    这个独立IP所解析的内页,只能用.htaccess的404错误页实现。在这个独立IP对应的空间的根目录建立一个.htaccess文件,把404错误页指向auf.php。与上述相同的步骤,错误页auf.php也是写入判断语句,用include()函数包含对应的二级域名或泛域名解析的内页文件,优先顺序和判断方法与上述相同。

    使用这个独立IP建立多站点,如二级域名、泛域名同时解析,这些多个站点是整合在一起的,不能像独立的站点一样实现各种功能。如果需要实现独立站点的功能,可以用其它的方法,例如将功能提交给独立站点去执行,或者在这个独立IP上再建立一个二级域名或泛域名,使其能够执行相应的功能。

    另外,IX的共享IP不能建立泛域名解析的原因如这里:http://www.zj7.com/strive/7。

    固定链接 | 发表评论(1) | Trackback(1)

    有关URL的QUERY_STRING参数

    2010年01月08日 14:13

    经过这7年多的编程经历,经常用到QUERY_STRING参数。动态网页需要大量地用到QUERY_STRING参数,又称为“查询参数”。例如article.asp?id=52,main.php?violate=respond&aware=52&retail=75,等等,问号后面的参数。有很多网站的地址栏使用了很多的查询参数,使地址栏的网址变得很长。其实有一些是不必要的,也有一些是必要的。不必要的查询参数,仅起一个美观装饰地址栏的作用,这些无效的查询参数并不会影响程序的运行。

    查询参数是可以大量减少的,例如博客、论坛的文档,在网站里区分2篇文章的方法就是如前面提到的article.asp?id=52,或article.php?id=495,使用?id=来区分。其它的参数,都可以写在数据库中或者Cookies中。因为Apache提供了.htaccess,使网址可以使用Rewrite模块或者404错误,轻松地实现网址静态化。QUERY_STRING参数可以写在数据库或者Cookies中,必要的多个参数写在地址栏以/或-等连接符。

    对于固定的文档链接,可以尽量减少QUERY_STRING参数。对于用户提交的搜索、查询等产生的动态网址,QUERY_STRING参数可以写在地址栏。

    固定链接 | 发表评论(0) | Trackback(0)

    PHP与JavaScript的包含的一点区别与相同

    2010年01月04日 14:04

    本文仅为日记。PHP的包含使用include()函数,JavaScript的包含使用<script src=***.js></script>或<script src=***.php></script>等形式。

    在设置网页过期时间方面,PHP主程序中如果有多个被包含的文件,只要在一个文件中设定过期时间即可;而JavaScript的包含,则所有的被包含的文件,都需要设定过期时间,当然,这些被包含的.js文件中,常更新的文件可以不用设定过期时间或者设定为时间较短,较常更新的文件的过期时间可以设定为时间较短。因为,PHP与JavaScript的包含文件的这个区别,JavaScript程序可以写在一个.js文件中,扩展名改为.php,将这个.php的JS文件的过期时间设置得长一些,可加快网站的速度,节省流量。

    PHP的include()函数,如果include文件里面还有include()函数,无论被包含了多少层,其变量都是处于相同的“层级”,可以直接调用。JavaScript也是这样,刚在IE和Firefox下做了测试,均可正常调用。前些天一段JavaScript程序因为这个问题出错,现已修正。

    固定链接 | 发表评论(1) | Trackback(1)

    含有Cookies的页面不宜设置网页过期时间

    2010年01月04日 09:04

    前天对Blog各页面设置了过期缓存的时间,以加快速度,节省流量,http://www.zj7.com/strive/16。但含有Cookies的页面不宜设置网页过期时间,因为当用户的Cookies改变后,含有Cookies的页面如果还没有到过期时间,其提取的Cookies是旧的数据,而不是最新改变的Cookies的数据。

    在测试中,无意中发现Firefox不存在此问题,设置了过期时间的网页,即使还没有到过期时间,Cookies仍然会提取最新的数据,我使用Firefox 2.0做测试。IE 6.0存在此问题,如果使用Header("Location:");跳转到含有Cookies的页面时,在IE 6.0下,Cookies会提取最新的数据,但这时如果关闭浏览器,再次访问这个页面时(不要按刷新),Cookies仍然是旧的数据。

    因此,含有Cookies的页面不宜设置网页过期时间。

    固定链接 | 发表评论(0) | Trackback(0)

    很多Linux主机都不支持mod_expires

    2010年01月03日 08:50

    mod_expires是Apache一个很重要的模块,但目前很多Linux主机都不支持此模块。使用mod_expires模块,可以通过.htaccess来设定图片文件、Flash文件、.js文件、midi文件等等的过期缓存的时间,加快网站的速度,节省大量的流量。

    我的ixwebhosting的Linux空间,GoDaddy的域名赠送的免费Linux空间,以及国内的一个Linux空间,均不支持mod_expires模块。现在较新的Apache版本是2.2.*,如2.2.14,这个新的版本是包含mod_expires.so模块的,但默认没有开启此模块,默认的httpd.conf文件中加载mod_expires模块的语句前面有#号。而GoDaddy的Linux主机,仍然使用Apache 1.3版本。

    昨天给GoDaddy发邮件,希望开通mod_expires模块,刚收到GoDaddy的回复,他们表示还不想开通此模块,可能是因为这位工作人员并不知道mod_expires模块的重要作用。看来,如果需要使用mod_expires模块,只能选择其它的主机,或者VPS。

    我下载了Apache 2.2.14版本,在本机做了测试,mod_expires可以正常使用。

    固定链接 | 发表评论(1) | Trackback(1)

    JavaScript与PHP的难易度

    2009年12月21日 08:22

    本文仅为日记。我想可能有很多人会认为PHP比JavaScript难,我在很多年里也是这样认为的。其实不是,虽然2者没有太多的可比性,PHP应用于服务器端,JavaScript应用于用户端,但也有一些可比之处。相对JavaScript而言,PHP确实上手更容易,更简单易学、易用,PHP功能更强大。学习PHP最好的方法是开通一个自己的PHP网站空间,这样会有很强的编写程序的动力。

    JavaScript与PHP相同的是语法很相似,循环程序、if语句、大部分运算符等等是完全相同的,这些是实际应用中最常用的语句。可以先学习PHP,再学习JavaScript,有助于对JavaScript的学习。调试方面,PHP相对更易调试,因为JavaScript需要在IE和Firefox两个浏览器之间做调试,有很多JavaScript语句和样式表只支持IE而不支持Firefox,而导致JavaScript项目失败。例如昨天遇到的document.body.innerText获取整页的网页内容,在IE下可正常运行,Firefox则无法显示,于是使用document.body.innerHTML代替。

    因为PHP可以直接完成一个小型或大型网站的项目,而JavaScript不能独立完成项目,JavaScript是另一种特殊的应用。所以在项目的开发当中,对PHP本身是一种最好的学习。当然,在PHP中获得的经验和思路,也是可以运用于JavaScript的。

    有时候,为了减少服务器的负荷,可以把程序交给JavaScript,分给每一台用户的电脑去处理程序,例如中文简体和繁体转化的程序。网上有2个中文简繁体转化的程序,这2套程序是不同的程序员编写的,但感觉还不是很好用,于是前两天重新编写一次,整个JavaScript程序400多字节,Cookies让PHP来处理,因为PHP处理Cookies,要比JavaScript处理Cookies方便许多,这个程序应用在www.ufoaq.com,经过150K的文本测试,效率还满意,目前仅input无法简繁体转化。

    PHP功能强大的方面,在于可以轻松实现上传文件,几句程序即可实现;内置mail()函数,几句程序即可以发送邮件;可以调用远程文件和远程数据库;可以轻松实现Gzip压缩;可以直接获得图片的宽和高等等。

    固定链接 | 发表评论(0) | Trackback(0)

    ixwebhosting尚不能支持的2个功能

    2009年12月19日 10:32

    1. 不支持泛域名解析。曾有网友提问ixwebhosting的空间是否支持泛域名解析?经过我的测试,并不支持。Linux空间建立泛域名解析的方法很简单,就是在Apache的conf/httpd.conf文件里建立一个如*.zj7.com这样的虚拟主机,在本地测试时写入如下代码,详细请见http://www.auiou.com/relevant/00000573.jsp。代码如:

      <VirtualHost *:80>
      ServerAlias *.zj7.com
      DocumentRoot F:/site/zj7
      </VirtualHost>

      上述代码是Linux空间建立泛域名解析的原理。而ixwebhosting的空间在建立一个新的域名时,只能建立www.zj7.com,前面的www.已经是默认值,无法更改。如果没有www.这个默认值,理论上输入*.zj7.com就可以建立泛域名解析,然而ixwebhosting做了限制。然后建立www.zj7.com的空间,进入ixwebhosting控制面板的网页选项,让www.zj7.com可以用其它的别名访问,这时会看到(输入框).zj7.com,在输入框如果能够输入*号,理论上这样完全可以建立泛域名解析,但ixwebhosting这里也做了限制,不能输入*号,所以ixwebhosting不能建立泛域名解析。

      但ixwebhosting赠送多个独立IP,还是可以实现泛域名解析的功能。可以在域名的控制面板建立一个*.zj7.com的二级域名,解析到此独立IP。ixwebhosting建立一个空的或者存在的域名的空间,对应此独立IP,就实现了泛域名解析。详细步骤请见http://www.auiou.com/relevant/00000519.jsp(再谈泛域名解析)。

    2. ixwebhosting的一个独立IP只能建立一个站点。有很多人推荐用.htaccess文件,写入Rewrite,使其实现一个独立IP绑定多个站点。理论上确实可以实现,但如果你的空间需要用.htaccess实现静态化,使用ixwebhosting的一个独立IP绑定多个站点会带来相当多的麻烦,几乎不能实现多站点同一空间的静态化,同时网站的很多程序必须更改。如果将来你的网站转移到其它网站的空间,这些网站必须拆分出来,同时程序也必须再次更改,工作量十分庞大。用.htaccess文件解析多个空间,只限于不需要静态化,同时将来这些网站永久地放在一起,才可以这样。如果读者有更好的方法和方案,欢迎交流。

      Linux空间建立一个域名对应的空间,与上述的建立泛域名解析的原理与步骤,几乎是完全相同的,详细如http://www.auiou.com/relevant/00000572.jsp(使用Apache作为本地虚拟主机)。根据这个原理,只有修改这个独立IP对应的Apache的conf/httpd.conf文件,才可以建立多个虚拟主机。

      当然,因为独立IP不需要任何配置,就可以解析指向此IP的任何域名,数量没有限制。我使用了一个独立IP,已经解析了很多不同的域名,例如http://auc.zj7.com是首页使用include()函数的方法,包含对应文件。http://auc.zj7.com/links/这个路径的文件并不存在,是在根目录建立一个.htaccess文件,设定404错误,使其包含一个如/au/links.php的文件。同样的原理,http://auc.zj7.com/sitemap/,也可以使其包含一个如/au/sitemap.php的文件。

    很可喜的是,ixwebhosting空间支持Gzip压缩,支持.htaccess。但是ixwebhosting的空间使用.htaccess的404错误页时,其下一层的目录中,静态化后的网址不能含有.php的扩展名,否则找不到服务器,必须隔着一层目录才可以含有.php的扩展名,例如本文的地址http://www.zj7.com/strive/7,ixwebhosting的空间不能静态化为http://www.zj7.com/strive/7.php,只能静态化为http://www.zj7.com/strive/7,或http://www.zj7.com/strive/7/,或http://www.zj7.com/strive/7.html,或http://www.zj7.com/strive/a/7.php等等。ixwebhosting的空间必须使用Rewrite才可以静态化为http://www.zj7.com/strive/7.php。其它网站的Linux空间如GoDaddy的空间不存在此问题。

    固定链接 | 发表评论(4) | Trackback(2)

    Apache的泛域名解析与单独的域名解析的顺序

    2009年12月18日 09:51

    Apache可以轻松地实现泛域名解析,在本地调试的步骤如我之前写的文章:
    http://www.auiou.com/relevant/00000573.jsp (Apache在本地建立泛域名虚拟主机简法)
    http://www.auiou.com/relevant/00000453.jsp (Apache+PHP的简便安装)
    http://www.auiou.com/relevant/00000572.jsp (使用Apache作为本地虚拟主机)

    如果你在本地既需要建立一个ww2.zj7.com单独的虚拟主机,又需要建立*.zj7.com的泛域名解析,并且ww2.zj7.com与*.zj7.com是不同目录的话,其先后顺序是先建立ww2.zj7.com,再建立*.zj7.com,两者不能颠倒。Apache的安装目录下的conf/httpd.conf写入的代码如下:

    <VirtualHost *:80>
    ServerAlias ww2.zj7.com
    DocumentRoot F:/site/zj7
    </VirtualHost>

    <VirtualHost *:80>
    ServerAlias *.zj7.com
    DocumentRoot F:/site/zj7222
    </VirtualHost>

    Apache在本地设置泛域名,建立虚拟主机是比较容易实现的,上述代码需要写在最外层,也就是这段代码不能写在其它的标签当中。需要修改DocumentRoot的值,是你的本地网站所在路径。

    固定链接 | 发表评论(0) | Trackback(0)

  • 王志勇(自由勇):网站程序设计。
    公历1980-09-26 天秤座 32岁
    我的联系方式:信息反馈、留言板。

    版权声明:
    本博客所有文章,均符合原创和创作共用的定义,禁止转载,违者将必究。如需引用本博客的文章全文,正确的方法是贴原文的标题和网址即可。

    相关的链接:
    和平海底1 | Auciou | 自由勇专栏

    文章分类 Category:
    编程 | PHP | 互联网 | 真相与UFO | JavaScript
    BBS社区研究 | QQ研究 | Blog的发展 | 生活
    食虫植物
    Gratitude

    Blog存档 Archives:
    2010年12月 | 2010年11月 | 2010年10月
    2010年09月 | 2010年08月 | 2010年07月
    2010年06月 | 2010年05月 | 2010年04月
    2010年03月 | 2010年02月 | 2010年01月
    2009年12月

    近期的主题:
    本博客正在做调整
    Orshu论坛程序最新进度(14)
    随谈:2010-12-22 外星人所处的高度
    帐号的命名
    关于网页时区的设置
    2010-12-12整理 我昨天在QQ群的发言内容
    闲谈:2010-12-10 音乐
    好好珍惜婚姻,好好珍惜家庭
    最近新开通的论坛简介
    如何在Orshu论坛的个人资料里显示年龄?
    今天Go Daddy的速度已经恢复
    Orshu论坛程序最新进度(13)
    随记:2010-11-29 Orshu论坛程序最新进度(12)
    随记:2010-11-26 Orshu论坛程序最新进度(11)
    随记:2010-11-25 Orshu论坛程序最新进度(10)
    随记:2010-11-25 Orshu论坛程序最新进度(9)
    随记:2010-11-24 Orshu论坛程序最新进度(8)
    随记:2010-11-22 Orshu论坛程序最新进度(7)
    随记:2010-11-21 Orshu论坛程序最新进度(6)
    随记:2010-11-20 Orshu论坛程序最新进度(5)


  • Copyright © 2004-2012 zj7.com All rights reserved.
    此Blog程序由王志勇编写