存档

‘PHP’ 分类的存档

刚开始搭建博客的时候,看中了wordpress的功能强大,经过两年的不懈努力,我的小博已经从pr0到pr4(最近降到pr3),有的时候每日pv竟然能到3万,这时idc那边就提醒我好资源了。自己购买了台西数的VPS,配置好后,cpu也是居高不下,首页竟然要4秒钟才能打开。当时考虑到seo,路径使用了http://www.miaoqiyuan.cn/p/wordpress-plus-chc(注意,不是文件夹)的模式,生成静态,路径就变了http://www.miaoqiyuan.cn/p/wordpress-plus-chc/。第一,我不想耗资源,第二,我不想改变路径。
我博客的现在的路径是怎样实现的呢?这个问题请看我以前的一篇文章WordPress无Rewrite用cos-html-cache实现静态化(http://www.miaoqiyuan.cn/p/wordpress-plus-chc)。既然一切皆由404.php起,那么现在就从404.php找切入点,比如在404.php上加个缓存。声明:本文由苗启源发表在他的博客,一切思想皆为苗启源原创,转帖请注明出处。
这个换成怎样加呢?改动源程序也不现实,而且文件太多,太麻烦。这时我想到了前几天写的一篇文章Python 之 XML与文本操作(http://www.miaoqiyuan.cn/p/python-xml-file),在那篇文章中,也是使用了缓存,比如请求http://www.miaoqiyuan.cn/products/,因为没有用到数据库,把请求过的网址记录到一个文本文件,少了还好说,多了就。。。最好的办吧就是把每个URL地址返回的内容保存到MD5(URL)的文件中,如果读取的时候该文件存在,说明已经读取过了,有缓存。python源码请见Python 之 XML与文本操作(http://www.miaoqiyuan.cn/p/python-xml-file)。
这样就好办了,直接按以前说的那种方法。404.php返回的请求路径,我没给md5下,如果存在,就直接读取,不存在,执行程序,然后保存到缓存文件中。下面给出404.php的代码,如果觉得本文对您有所帮助,请Ctrl+D收藏我的博客地址,我最近准备写一个php的缓存类哦。

< ?php
$qs = $_SERVER['QUERY_STRING'];
$_SERVER['REQUEST_URI'] = substr($qs, strpos($qs, ':80')+3);
$CacheStr = md5($_SERVER['REQUEST_URI']);

if(!$fp=@fopen("./404cache/".$CacheStr.".tmp","r")){
$getHtml=file_get_contents("http://www.miaoqiyuan.cn/index.php".$_SERVER['REQUEST_URI']);
$fp=fopen("./404cache/".$CacheStr.".tmp","w");
fwrite($fp,$getHtml);
echo $getHtml;
}
echo fread($fp,1100000);
?>

基本功能都实现了。不过更新是个问题,还有缓存数据,我会分别用Mysql数据库,XML文件,文本文件分别存取,关于速率我还要进一步进行测试。文本文件的存储缓存的一个致命的缺点就是最后更新时间,缓存的有效时间不好控制。如果用xml或数据库,这个问题就简单了。好了,现在时间太晚了,就此结笔(键盘)。

一 16th, 2010 | Filed under PHP, Share(分享), Thinks(想法)

      因为是两期完成,所有界面有所不同。

详情页面,可以添加站点信息。修改网站状态,添加客户需求。如果已完成网站,添加完需求,自动保存到修改(验收后),否则保存到修改(开发中)。

添加修改业务详情。

另外,还有一个远程调用接口(API),通过JSON传递信息。PHP写的。

< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
<title>猫七导航</title>
<base target="_blank" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<style type="text/css">
html{background:#666}
h1{margin:0px;text-align:center;font-size:28px;padding:5px 10px;color:#C00}
h2{margin:0px;font-size:16px;padding:5px 10px;color:#060}
body{width:938px;margin:auto;border:solid 5px #000;background:#EEE;padding:20px;margin-top:10px;}
.dh a{margin:0px 5px;text-decoration:none;font-size:12px;color:#000}
.dh a:hover{text-decoration:underline}
dl{width:300px;height:200px;overflow:hidden;float:left;border:solid 1px #000;margin:5px;}
dt{margin:0px;color:#FFF;background:#060;padding:5px;}
/*录入完毕|制作中|等待客户确认|客户确认|修改(开发中)|修改(验收后)*/
.site_0{background:#0000CC;}
.site_1{background:#CCCC00;}
.site_2{background:#00CCCC;}
.site_3{background:#00CC00;}
.site_4{background:#FF0000;}
.site_5{background:#CC0000;}
.site_all{background:#666666}
dt a{color:#FFF;text-decoration:none;font-weight:800;font-size:18px;}
dd{margin:0px;font-size:12px;color:#000;padding:3px;background:#CCC;height:168px;overflow:auto;}
.ColorBox div{padding:5px;margin:5px;float:left;border:solid 1px #000;font-weight:800}
.ColorBox div a{color:#FFF;text-decoration:none}
</style>
</head><body>
< [...]

十一 11th, 2009 | Filed under PHP, Share(分享), Show(展示)
标签: , , ,

PHP程序在Windows正常的,在Unix下乱码的解决方案。
今天接到一个客户的问题,在原虚拟主机上正常,到新买的万网M3上。结果乱码。
以为是客户数据库导入的时候编码出了问题,客户导了半天没导上。我也在本地测试,导入后,在win2k3下确实没有问题,但是换成Unix主机的时候,应该是编码问题。看客户的数据库中的编码是UTF8的,在连接MySQL后的语句加上:

< ?php
mysql_query("SET NAMES UTF8")
?>

问题仍未解决,打开其中一个表,发现在数据库中也是乱码。这事确定肯定不是以utf-8的编码保存的。
在window下正常,Linux下不正常。难道是客户的技术创建表时用了latin1。

< ?php
mysql_query("SET NAMES latin1")
?>

确实如此,这样程序一切正常了。在此我给程序员提个建议。再写程序或者创建数据库的时候尽量按标准编码。否则,客户换几次空间,可能就出问题了。。。。

十 30th, 2009 | Filed under Experience(经验), PHP

近期公司有个项目,是PHP+MYSQL搭建的。主表记录数大约是150万条左右。考虑到搜索引擎收录,做了专门针对SEO优化的,比如搜索山东+公司,关键字则是“山东,公司,山东公司”,标题同样是相关的。用户第一次搜索,则生成一条该关键字的记录,以后搜索直接在搜索次数加一。专门做了一个搜索关键字的sitemap来优化,搜索结果每页80条。
运营了一段时间,没有什么问题。最近发现很多关键字都是有几十万条记录,就拿五金这个词来说吧,有9万多条记录。点到1000页的时候,第80000条记录,查询时间竟然要10秒左右。汗~难怪有客户反映速度慢。。。。
想到了数据库优化。为某些字段(比如所在城市(int),所在地区省份(int),公司id (int)所属行业)建立索引,这样在企业目录中,即使到第8万条记录,时间也可以控制在一秒内。但是关键字查询速度还是没有解决。
现在的sql查询速度是”select `*` from `st_company` {where} order by `coid` asc”。
忽然想到了mysql中有个in,于是吧查询改成了”select `co_id` from `st_company` {where} order by `coid` asc”。然后把结果用php组合成”1,2,3,4,5,6″的字符串,在一次二次查询”select `*` from `st_company` where `co_id` in (1,2,3,4,5,6)”,速度一下提高了10倍左右。即使用户搜索(使用like查询没有索引的co_do的时侯)的时候,第8万条数据的时候,速度与不超过一秒。效果还不错~
上面用减少查询字段的方法,提高了速度,忽然想到略过前边的字段不是能更快的加快查询速度吗?mysql没有top,可以说是一个很大的遗憾,只能用limit,这样在优化肯定没有上边的速度快了。
忽然想到了百度那么多数据,后页是怎么处理的呢?比如查询“你好”,有44,700,000条记录。修改百度get提交中的pn为10000,晕,就到76页,及760条数据,用时0.001秒。再看Google,52,800,000 条查询结果,最多到788条记录,后边就没有了,不过Google的查询速度竟然用到了搜索用时 2.54 秒(Google.cn),不知道他们的数据库架构师在干什么?搜狗总共找到 266,212,429 个网页,返回1000条结果,最后一页(100页)用时 0.034 秒。搜搜据说是Google提供的技术支持,搜索到搜索到约9,300,000项结果,返回了74页,共738条结果,查询时间很抱歉,也要1.8秒左右。有道搜索到符合 你好 的结果约 6400万 条,看结果是是老大了,很可惜,只返回了50页,500条记录,用时0.156 秒。用时时间一官方网站上的查询时间为准。
实际搜索结果没有必要做那么多,通过比较,最终决定只返回1600条记录,20页。sql查询时间0.05-0.2秒左右,还可以接受。毕竟客户如果在前10页找不到需要的信息。很有可能更换关键词了。
在此给奉Google为上的网民们说一下,Google的技术不是最好的,最起码数据库架构方面做得很垃圾。以前我也一直认为Google是最棒的,但是结果呢?百度,做到全国第一,你当之无愧,不过我小看了你好久。
PHP+MYSQL运用索引实现数十万级数据快速搜索一文,希望同样给做tag 优化的同行提供一些帮助。

最近打算做一个提供API的网站,程序方面已经完成测试,可行。

<script type="text/javascript">
//http://***/doc/xl_kc_urlconvert
//迅雷地址、快车地址、HTTP地址(URL)转换接口
var $Myw3_Api={
client:{
skey:’a3ca113a9677fbc3398eae72fe53849d’
},
load:{
init:’xl_kc_urlconvert’,
ver:’1.0′
},
body:{
input:’xinput’,
button:’xbutton’,
xunlei:’xl_url’,
kuaiche:’kc_url’,
xuanfeng:’xf_url’,
url:’url’
}
}
</script>
<script type="text/javascript" src="http://***/get.php"></script>

<input type="text" id="xinput"/><input type="button" class="but" id="xbutton" value="转换"/><br />
迅雷:<input type="text" id="xl_url" readonly /><br />
快车:<input type="text" id="kc_url" readonly /><br />
旋风:<input type="text" id="xf_url" readonly /><br />
URL:<input type="text" id="url" readonly /><br />

API接口通过预设的JSON获取数据。不成熟的思想如下:
$Myw3_Api.client.skey API标示ID
$Myw3_Api.load.init 到底交给谁处理?
$Myw3_Api.load.ver 版本号,方便以后扩展兼容
$Myw3_Api.body 获取程序需要处理的信息,比如某HTML Object的ID
get.php

var $ServerName=’***’;
var $LoadJs=function(u){document.writeln(’<script [...]

二 12th, 2009 | Filed under PHP, Share(分享)