php的技术应用

来源:互联网 发布:法语之言能无从乎 编辑:程序博客网 时间:2024/06/02 02:50

技术应用
伪静态, 静态页面生成, 数据库缓存, 过程缓存, div+cssw3c标准, 大负荷, 分布式, flex, 桌面程序应用(不擅长), 支持MVC模型, Smarty模版引擎。


伪静态:伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。就是展示出来的是以html一类的静态页面形式,但其实是用ASP一类的动态脚本来处理的。

如何选择真伪静态:
1、使用真静态和伪静态对SEO来说没有什么区别
2、使用真静态可能将导致硬盘损坏并将影响站点性能(这个实在是个谬论,非静态的对硬盘的读取次数胜过真静态)
3、使用伪静态将占用一定量的CPU占有率,大量使用将导致CPU超负荷
4、最重要的一点,我们要静态是为了SEO
5、真静态的访问速度明显比伪静态的访问速度要高
所以:
1、使用真静态的方法可以直接排除了,因为无论怎么生成,对硬盘来说都是很伤的。(这个完全是乱讲了,真静态可以提高网站的性能,减少数据库的访问压力,减少CPU和内存的压力。)

2、既然真伪静态的效果一样,我们就可以选择伪静态了。

3、但是伪静态大量使用会造成CPU超负荷。

4、所以我们只要不大量使用就可以了。

5、既然伪静态只是给搜索引擎爬虫看的,我们只需要伪静态给搜索引擎爬虫就行了,不需要给用户使用。

6、所以我们只要在专门提供给搜索引擎爬虫(搜索引擎机器人)爬的Archiver中使用伪静态就可以了。

伪静态的弊端:
1、当然犹如一篇文章的作者所说的:”如果流量稍大一些使用伪静态就出现CPU使用超负荷,我的同时在线300多人就挂了,而不使用伪静态的时候同时在线超500人都不挂,我的IIS数是1000。”确实是这样的,由于伪静态是用正则判断而不是真实地址,分别显示哪个页面的责任也由直接指定转由CPU来判断了,所以CPU占有量的上升,确实是伪静态最大的弊病。
2、网站承受力低。另外,会造成网站可承受同时在线人数剧减。如果你的网站可以保证1000人同时访问的话,那么做了伪静态处理之后,300人访问就足以让你网站挂掉。
3、网页打开慢。伪静态页面打开速度快,简直太搞笑了,伪静态仍然要读取数据库,还额外的多了一个.重写网址.的过程,其他的步骤绝对不会比动态少,怎么会快呢?
4、大量的重复页面。做了伪静态后,原有的页面也可以访问,这就造成了大量的伪静态页面和动态页面重复,对网站极为不好。
5、需要服务器支持。并不是所有的服务器都支持伪静态的,这无形中又增加了成本。所以,如果网址中的动态参数没有达到影响搜索引擎收录的程度,动态要比伪静态好的多。
6、造成真正的静态网页无法访问。如果把php伪静态成html,那么真正的静态页就无法访问了。(可通过修改服务器配置解决,可是你又何必去费这把力气呢?)

区别静态编辑:
从URL结构以及页面名称看,伪静态和静态页面是一样的。伪静态的页面后缀可以是html htm 或者是目录格式
伪静态只是改变了URL的表现形式,实际上还是动态页面
静态页面可以节省服务器资源,而伪静态严格说是增加服务器资源消耗的
总结,在SEO方面,伪静态和静态页面的功能是相同的,但是伪静态本质上还是动态页面,所以消耗资源是和动态页面一样的,而且因为Rewrite服务器还需要消耗额外的资源。

如何使用?


静态网页:静态网页是实际存在的,无需经过服务器的编译,直接加载到客户浏览器上显示出来。静态页面需要占一定的服务器空间,且不能自主管理发布更新的页面,如果想更新网页内容,要通过FTP软件把文件DOWN下来用网页制作软件修改(通过fso等技术例外)。常见的静态页面举例:.html扩展名的、.htm扩展名的。

优缺点:
首先静态页面的优缺点与动态页面的优缺点是相对的。
动态页面是一对多访问。通过一个页面。可以根据若干参数返回其不同的数据。但是静态页面因为是静态所以是一个页面对应一个内容,也就是一对一的关系。他的优点就是无论你如何访问都只是让服务器传数据给请求者。并不做脚本计算及读取后台数据库。从而大大的提高了访问速度及降低了部分安全隐患。
采用静态页面的方法可以将数据库及后台系统与前台划分开。两者间没有绝对的联系。从而从提高站点的安全。
以上就是静态页面的最大的优点。速度快,可以跨平台,跨服务器。
同样静态页面也拥有相等与优点的缺点。今天的静态页面已经不是单纯的用FrontPage或DreamWeaver来一张张做。然后发布到网上了。他已经是动态与静态结合的产物。通常我们的制作流程是这样的。
第一步:发布信息到数据库

第二步:选择页面的模版

第三步:程序读取模版 +数据库信息 = 静态页面

第四步:发布索引页面(如首页,引导页等)

完成
静态页面的生成至少需要上述几个步骤才能完成。所以模版是关键的。因为静态页面无法在你调整后自动更新。必须再次创建。数据量大的话。这个更新的时间也相当可怕。所以你会发现有些大的网站新的文章与旧的文章长不是一个样子。在加上静态页面本身因为不具备动态页面的特性。也就无法做一些WEB应用。最明显的一点搜索。

动态网页和静态网页的区别:
区别:  静态网页和动态网页的主要区别在于在服务器上是否运行程序,运行在客户端的程序、页面等等都是静态页面,它们是一直不变的。静态网页和动态网页有着不同的特点,一个网站使用什么样的页面要看这个网站有什么功能和网站中的内容有多少,假如这个网站的内容变化不是很快,网站的功能也没有那么复杂,可以使用静态的网页对网站运行也比较简单。而相反则必须要使用动态的网页来完善一个网站。  一个网站建设的基础就是静态网页,而静态网页和动态网页之间也不是互不相容的,为了提高网站内搜索的速度,就是使用动态网页技术的网站,也能把网页的内容转变成静态网页运行,把网页转变为静态化是网站发展的一个非常好的方法,能够提高网页打开的速度。

w3c:
万维网联盟外文名: World Wide Web Consortium 万维网联盟创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。到目前为止,W3C已发布了200多项影响深远的Web技术标准及实施指南,如广为业界采用的超文本标记语言(标准通用标记语言下的一个应用)、可扩展标记语言(标准通用标记语言下的一个子集)以及帮助残障人士有效获得Web内容的信息无障碍指南(WCAG)等,有效促进了Web技术的互相兼容,对互联网技术的发展和应用起到了基础性和根本性的支撑作用。[1]万维网联盟(外语缩写:W3C)标准不是某一个标准,而是一系列标准的集合。网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。

对应的标准也分三方面:结构化标准语言主要包括XHTML和XML,表现标准语言主要包括CSS,行为标准主要包括对象模型(如W3C DOM)、ECMAScript等。这些标准大部分由W3C起草和发布,也有一些是其他标准组织制订的标准,比如ECMA(European Computer Manufacturers Association)的ECMAScript标准。

缓存
一、数据缓存
这里所说的数据缓存是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存表或文件中获得。用的最广的例子看Discuz的搜索功能,把结果ID缓存到一个表中,下次搜索相同关键字时先搜索缓存表。举个常用的方法,多表关联的时候,把附表中的内容生成数组保存到主表的一个字段中,需要的时候数组分解一下,这样的好处是只读一个表,坏处就是两个数据同步会多不少步骤,数据库永远是瓶颈,用硬盘换速度,是这个的关键点。

二、页面缓存
每次访问页面的时候,都会先检测相应的缓存页面文件是否存在,如果不存在,就连接数据库,得到数据,显示页面并同时生成缓存页面文件,这样下次访问的时候页面文件就发挥作用了。(模板引擎和网上常见的一些缓存类通常有此功能)。

三、时间触发缓存
检查文件是否存在并且时间戳小于设置的过期时间,如果文件修改的时间戳比当前时间戳减去过期时间戳大,那么就用缓存,否则更新缓存。

四、内容触发缓存
当插入数据或更新数据时,强制更新缓存。

五、静态缓存
这里所说的静态缓存是指静态化,直接生成HTML或XML等文本文件,有更新的时候重生成一次,适合于不太变化的页面,这就不说了。以上内容是代码级的解决方案,我直接CP别的框架,也懒得改,内容都差不多,很容易就做到,而且会几种方式一起用,但下面的内容是服务器端的缓存方案,非代码级的,要有多方的合作才能做到。

六、内存缓存
Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。这里说下Memcached的例子:复制代码 代码如下:
/php/
memcache=newMemcache;memcache->connect(‘localhost’, 11211) or die (“Could not connect”);
version=memcache->getVersion();
echo “Server’s version: “.version.\n;tmp_object = new stdClass;
tmpobject>strattr=test;tmp_object->int_attr = 123;
memcache>set(key,tmp_object, false, 10) or die (“Failed to save data at the server”);
echo “Store data in the cache (data will expire in 10 seconds)\n”;
getresult=memcache->get(‘key’);
echo “Data from the cache:\n”;
var_dump(getresult);::sql=SELECTFROMusers;key = md5(sql);//memcachedif(!(datas = mc>get(key)) ) {
// 在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。
echo “n”.str_pad(‘Read datas from MySQL.’, 60, ‘_’).”n”;
conn=mysqlconnect(localhost,test,test);mysqlselectdb(test);result = mysql_query(sql);while(row = mysql_fetch_object(result))datas[] = row;//memcached访使mc->add(key,datas);
} else {
echo “n”.str_pad(‘Read datas from memcached.’, 60, ‘_’).”n”;
}
var_dump($datas);

七、PHP的缓冲器、加速器
有eaccelerator, apc, phpa,xcache,这个这个就不说了吧,搜索一堆一堆的,自己看啦,知道有这玩意就OK。

八、MYSQL缓存
这也算非代码级的,经典的数据库就是用的这种方式,看下面的运行时间,0.09xxx之类的我贴段根据蓝色那家伙修改后部分my.ini吧,2G的MYISAM表可以在0.05S左右,据说他前后改了有快一年。复制代码 代码如下:

[client]
……
default-character-set=gbk
default-storage-engine=MYISAM
max_connections=600
max_connect_errors=500
back_log=200
interactive_timeout=7200
query_cache_size=64M
…… table_cache=512
…… myisam_max_sort_file_size=100G
myisam_max_extra_sort_file_size=100G
myisam_sort_buffer_size=128M
key_buffer_size=1024M
read_buffer_size=512M
…… thread_concurrency=8

九、基于反向代理的Web缓存
如Nginx,SQUID,mod_proxy(apache2以上又分为mod_proxy和mod_cache) NGINX的例子:复制代码 代码如下:

user nobody;

worker_processes 4;
error_log logs/error.log crit;
pid logs/nginx.pid;
worker_rlimit_nofile 10240;
events {
use epoll;
worker_connections 51200;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
tcp_nodelay on;

server pool upstream bspfrontsvr {

server 10.10.10.224:80 weight=1;
server 10.10.10.221:80 weight=1; }
upstream bspimgsvr {
server 10.10.10.201:80 weight=1;
}
upstream bspstylesvr {
server 10.10.10.202:80 weight=1;
}
upstream bsphelpsvr {
server 10.10.10.204:80 weight=1;
}
upstream bspwsisvr {
server 10.10.10.203:80 weight=1;
}
upstream bspadminsvr {
server 10.10.10.222:80 weight=1;
}
upstream bspbuyersvr {
server 10.10.10.223:80 weight=1;
}
upstream bspsellersvr {
server 10.10.10.225:80 weight=1;
}
upstream bsploginsvr {
server 10.10.10.220:443 weight=1;
}
upstream bspregistersvr {
server 10.10.10.220:80 weight=1;
}
log_format test_com ‘remoteaddrremote_user [timelocal]"request” ’
statusbody_bytes_sent “httpreferer""http_user_agent” ‘;

——————————————————————–

img.test.com

server {
listen 10.10.10.230:80;
server_name img.test.com;
location / {
proxy_pass http://bspimgsvr;
include proxy_setting.conf;
}
access_log logs/img.log test_com;
}

style.test.com

server {
listen 10.10.10.230:80;
server_name style.test.com;
location / {
proxy_pass http://bspstylesvr;
include proxy_setting.conf;
}
access_log logs/style.log test_com;
}

help.test.com

server {
listen 10.10.10.230:80;
server_name help.test.com;
location / {
proxy_pass http://bsphelpsvr;
include proxy_setting.conf;
}
access_log logs/help.log test_com;
}

admin.test.com

server {
listen 10.10.10.230:80;
server_name admin.test.com;
location / {
proxy_pass http://bspadminsvr;
include proxy_setting.conf;
}
access_log logs/admin.log test_com;
}

buyer.test.com

server {
listen 10.10.10.230:80;
server_name buyer.test.com;
location / {
proxy_pass http://bspbuyersvr;
include proxy_setting.conf;
} access_log logs/buyer.log test_com;
}

seller.test.com

server {
listen 10.10.10.230:80;
server_name seller.test.com;
location / {
proxy_pass http://bspsellersvr;
include proxy_setting.conf;
}
access_log logs/seller.log test_com;
}

wsi.test.com

server {
listen 10.10.10.230:80;
server_name wsi.test.com;
location / {
proxy_pass http://bspwsisvr;
include proxy_setting.conf;
}
access_log logs/wsi.log test_com;
}

www.test.com

server {
listen 10.10.10.230:80;
server_name www.test.com *.test.com;
location ~ ^/NginxStatus/ {
stub_status on;
access_log off;
}
location / {
proxy_pass http://bspfrontsvr;
include proxy_setting.conf;
}
access_log logs/www.log test_com;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

login.test.com

server {
listen 10.10.10.230:443;
server_name login.test.com;
ssl on;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
location / {
proxy_pass https://bsploginsvr;
include proxy_setting.conf;
}
access_log logs/login.log test_com;
}

login.test.com for register

server {
listen 10.10.10.230:80;
server_name login.test.com;
location / {
proxy_pass http://bspregistersvr;
include proxy_setting.conf;
}
access_log logs/register.log test_com;
}
}

proxy_redirect off;
proxy_set_header Host host;proxysetheaderXRealIPremote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
apache mod_proxy的例子:
复制代码 代码如下:

ServerName jb51.net
ServerAdmin admin@zxsv.com

reverse proxy setting

ProxyPass / http://jb51.net:8080/
ProxyPassReverse / http://jb51.net:8080/

cache dir root

CacheRoot “/var/www/proxy”

max cache storage

CacheSize 50000000

hour: every 4 hour

CacheGcInterval 4

max page expire time: hour

CacheMaxExpire 240

Expire time = (now - last_modified) * CacheLastModifiedFactor

CacheLastModifiedFactor 0.1

defalt expire tag: hour

CacheDefaultExpire 1

force complete after precent of content retrived: 60-90%

CacheForceCompletion 80
CustomLog /usr/local/apache/logs/jb51_net_access_log combined

十、DNS轮询 BIND是一款开放源码的DNS服务器软件,这个要说起来就大了,自己搜索去,大家知道有这个东西就行了。我知道的有chinacache等大站就是这样做的,说简单点就是多服务器啦,把同一个页面或文件缓存到不同的服务器上,按南北自动解析到相关的服务器中。 http://www.jb51.net/article/49714.htm


模板引擎
Smarty:Smarty的特点是将模板编译成PHP脚本,然后执行这些脚本。很快,非常方便。
Heyes Template Class:一个非常容易使用,但功能强大并且快速的模板引擎,它帮助你把页面布局和设计从代码中分离。
FastTemplate:一个简单的变量插值模板类,它分析你的模板,把变量的值从HTML代码中分离处理。
ShellPage:一个简单易用的类,可以让你的整个网站布局基于模板文件,修改模板就能改变整个站点。
STP Simple Template Parser:一个简单、轻量级并且易于使用的模板分析类。它可以从多个模板中组装一个页面,把结果页面输出到浏览器或者文件系统。
OO Template Class:一个你可以用在自己程序中的面向对象的模板类。
SimpleTemplate:一个可以创建和结构化网站的模板引擎。它可以解析和编译模板。
bTemplate:短小但是快速的模板类,允许你把PHP逻辑代码从HTML修饰代码中分离。
Savant:一个强大且轻量级的PEAR兼容模板系统。它是非编译型的,使用PHP语言本身做为它的模板语言。
ETS - easy template system:可以使用完全相同数据重组模板的模板系统。
EasyTemplatePHP:适用于你的站点的一个简单但是强大的模板系统。
vlibTemplate:一个快速、全能的模板系统,它包含一个缓存和调试类。
AvanTemplate:多字节安全的模板引擎,占用很少系统资源。它支持变量替换,内容块可以设置显示或隐藏
Grafx Software’s Fast Template:一个修改版本的Fast Template系统,它包括缓存功能,调试控制台以及沉默去除为赋值块。
TemplatePower:一个快速、简单、功能强大的模板类。主要功能有嵌套的动态块支持,块/文件包含支持以及显示/隐藏未赋值的变量。
TagTemplate:这个库的功能被设计来使用模板文件,同时允许你从HTML文件检索信息。
htmltmpl: templating engine:一个适用于Python和PHP的模板引擎。它面向希望在项目中分离代码和设计的web应用开发人员。
PHP Class for Parsing Dreamweaver templates:一个分析Dreamweaver模板的简单类,被用于Gallery 2 和WordPress的自定义模块中。
MiniTemplator (Template Engine):针对HTML文件的一个紧凑型模板引擎。对于模板变量和块定义它具有简单的语法。其中块可以嵌套。
Layout Solution:简化网站开发和维护。它拥有常用的变量和页面元素使你不需要重复做页面布局工作。
Cached Fast Template:它已经纳入 FastTemplate ,允许你缓存模板文件,甚至可以在分离的块内容上缓存不同的规格。
TinyButStrong:一个支持MySQL,Odbc,Sql-Server和ADODB的模板引擎。它包含7个方法和两个属性。
Brian Lozier’s php based template engine:只有2K大小,非常快并且是面向对象设计。
WACT:一个从设计中分离代码的模板引擎。
PHPTAL:一个PHP下面的XML/XHTML模板库。
Rong_View_Wudimei:Wudimei开发的国产框架Rong Framework的模板引擎,它类似于smarty,优点是速度快,缺点是模板标签较少,不过够用了。

1 0