部署方法看上一偏配置说明。
代码 api.tar.gz
信息插入与修改:
查询:
http://192.168.138.29:8080/search.jsp?database=sunboyudata2&query=fid:QCNUMEQ:1604&skip=20000&max=10
database:数据库文件名[无扩展名]
query:查询条件 每组查询条件三个部分 字段:规则:值 每组之间用|分割
skip:记录起始
max:返回的记录条数
缺点:在频繁大数据量提交的时候,tomcat总是影响失败。性能没有预期那么好,tc需要优化。
]]>看这里:百度百科:二维码
二维码我用的最多的就是利用android手机的二维码扫描功能扫描网址,当然这种方法还大量应用在货物标签,比如我们去超市结账的条码扫描。
二维码利用近距离的光线进行数据传输,打破了网络数据线的依赖,可以说是一种打破常规的非常方便的应用。尤其在各种设备并不那么兼容的情况下,用二维码交换少量信息是非常便利的。
二维码的算法是通用的,二维码PHP的生成,我发现了以下几种方式:
1、某日本作者写的PHP http://www.swetake.com/qr/qr_cgi.html
2、开源社区上的PHP程序 http://phpqrcode.sourceforge.net/
3、google提供的一个接口 http://code.google.com/intl/zh-CN/apis/chart/
这里我尝试了第二种方法:下载软件包后,使用里边的方法:QRcode::png
我写了个代码是这样:
require_once(APP_PATH.'/include/phpqrcode/qrlib.php');
QRcode::png("http://www.sunboyu.cn");
这样就可以输出二维码图形了,可以用手机尝试一下。
硬件和简约的程序能提高性能,在大数据量下,算法的优势就能体现出来了。
顺便提一下主从:很多人认为主从可以解决问题,其实未必。设想一主多从结构,假如主库写压力很大,那同样压力会同步到从库,会造成N个从库压力同时很大。事实上从库压力会小于主库,因为主库是多进程写,而从库是单进程写, 但总的来说,执行的语句不会少。所以,主从这种结构在一定情况下也就失去了优势。(在硬件资源充裕,压力不是很大的环境下,这种问题发生较少,在硬件条件比较差的一些环境下,这种瓶颈很容易表现出来)
这里拿discuz7的posts表举例,摆脱主从结构,硬件比较差,表很大,10G以上。
一个负载大的dz论坛,在线人数多,又比较活跃,那posts表的压力肯定不会小。在一个回复比较频繁,存储引擎使用myisam的posts表,锁表是经常发生的,我所遇见的问题发生的环境为:数据库单点,无主从,io压力中等。posts表频繁锁表,而造成查询排队,查询速度骤然下降。
在不提升硬件的情况下,要想提速,显然是比较困难的,大量的文本数据装入memcached显然也不合适。所以,这个问题我用优化数据存储的角度对数据表进行了改造。
TIPS:同样100M带宽的集线器和交换机,交换机的吞吐性能远远高于集线器,原因在于:交换机建立专有通道,避免了冲突。
而在mysql中,锁表可以形象描述为冲突了,读写冲突了。但如果我们分表,把读写分散,也许会好点。
分表规则:按照tid进行hash,分散到16个表中。
假设,一读一写,两个操作,同时进行,那么他们撞在一起的几率就是1。如果分为两个表,那么他们撞在一起的几率就是1/2 = 0.5,用一个函数来表示,就是F(x)=1/x ,显然,分的表越多,冲突的机会越小,锁表的几率就越少。即时锁表,影响的也只是1/x的数据,不会对所有的用户造成影响。
数据模型解释:如果是绝对同步发生,几率应该是 F(x)=1/((x-1)*x),但在计算机里,无论两个操作时间间隔多小,在cpu时间片上都是顺序执行,因为,函数我认定为:F(x)=1/x。
以上用数学的方式解释了算法优化对性能的提升。实际上,通过对逍遥论坛的用户行为统计:posts表95%以上的操作都是在读写,搜索和管理占小部分。
补充一种分表算法:在discuzX里,后台启用了分表,我没有细看,大概是把表按照时间段或者其他条件分开。我猜测,作者本意是拆分老数据,主表只留最新数据和一些命中高的数据。这种方式可以起到一定效果,但根据统计,大部分用户习惯浏览回复最新帖子,因此,大部分的读写还是定位到了一张表,也就是没有彻底解决读写冲突的问题。
还有一个朋友使用的是顺序分表,500w个pid一张表,但这个方法同上个方法,没解决冲突问题。
所以,在他的基础上,我考虑出按照tid进行hash分表的方案。
说到这里,分表又给我们带来了麻烦,有些查询并不能用tid主键进行定位,这里我用了mysql合并表,这个合并表可以合并16个分表,成为一个大表进行查询,而表名依然用原始的表明,这样,dz中原来的功能就不受影响了。
此方案已经实现,我用的新老数据+分别hash的方式,即32张表存储posts数据的方式。但未做压力测试。最近努力学习loadrunner使用,这个压测马上就可以进行了。
]]>
已经全部调试通过,正在往一个线上环境上部署。文档也在敢写之中,谢谢关注。
]]>平时在线人数:5000~10000人 峰值:50000+(超过5w后,统计表性能明显下降,关闭了统计)
之前每逢峰值论坛常挂,改造之后有充足的预案防止出问题,保证论坛用户能及时在论坛传达必要消息。
在论坛改造过程中,我写了很多文章来表述改造中的一些心得,也认识了很多朋友一起讨论dz的优化。其中最宝贵的经验,是一些无能为力的站长把他们的服务器交给我,让我亲手在一个大负载的服务器上去做优化,在这个过程中学到了很多系统优化方面的知识,更宝贵的是获得了大负载下dz的一些瓶颈点的数据。
由于考虑用户群的问题,很多技术没有办法用开源的软件实现,也无法找到替代品,考虑实际,很多dz站长自己并没有实力去涉入维护一个更改很多的论坛,所以我的方案并没有大量去应用。
在帮朋友优化的过程中,提到更多的是技术实力与维护、需求的增删与性能的平衡。
所以,我得出这样的结论供大家参考:
1、每个功能都会吃系统资源,充分考虑每个功能是否必须,不必须的功能一定要砍。
2、找系统压力点:根据我对逍遥论坛用户日志的分析,90%的压力集中在 forumdisplay.php viewthread.php上,而这些脚本的压力主要体现在表联查而造成的锁表上,最主要的表就是sessions表。sessions表集合了很多用户统计相关功能,因为,优化此表,结合上条原则,合理增删功能,达到压力减小。
3、硬件的优化。硬件优化也是我最近考虑的一个方案,想对于开发人员,硬件的开销还是很小的。合理升级硬件也是一个不错的方案。
以上结论是针对中小型网站已经碰到瓶颈的dz程序做出的建议。
而对于一个负载很大,并且有实力的团队,那在discuz上要做的文章就太多了。
1、拆表是必然的,而对于一些数据量不大但经常变动的表,完全可以全cache。
2、根据需求删改功能。discuz很强大, 但不是每个功能都是你必须使用的。
3、开源产品会给你很多灵感。
推荐的一些开源技术方案:
memcached(不用说了)
Tokyo Cabinet DBM:性能极佳的持久存储的keyvalue数据库
mysql udf http http://blog.s135.com/mysql-udf-http/ 让tt变成从库?
lucene 必须要替换discuz默认的搜索
你还有什么想法?
一时兴起,写此文。欢迎有兴趣的朋友加 discuz性能优化讨论群 qq:41886598
]]>通过最近做一些项目,松散的设计明显不能满足项目的需求,随意的代码虽然能加快项目进度,但也造成很严重的技术透支。
重新认识框架,可以得出以下体会:
框架的确是限制人的,但不是技术的限制,不是思想的限制,而是规范合作的限制。
项目的设计规划人员要付出更多,其设计了框架的核心后,开发人员在你的思路下进行开发,你的一点点错误会在几个人身上得到成倍的放大。
坚持一种设计思路,即使已经走了很多弯路,但起码保证这些弯路要走踏实,而不是一条泥泞的弯路。
一个优化的框架不仅是完成基本功能,更要让开发人员感觉爽,这是最重要的(很难实现)。
最后,继续琢磨我的框架吧。
—————————-题外话——————————–
最新学了一段时间的C,包括我以前也提倡,用写C的态度来写PHP。写C语言,每个变量,每块内存都要完全规划在你的脑子里,处理不好,程序是绝对跑不动的。做PHP项目,也要注意这些细节,虽然PHP是弱类型的语言。当然,做一个项目,也要去考虑方方面面。
]]>http://devzone.zend.com/node/view/id/1022
http://blog.csdn.net/alin0725/archive/2007/04/08/1556460.aspx
http://devzone.zend.com/article/1024-Extension-Writing-Part-III-Resources 这篇文章不错,讲PHP如果管理连接符
http://www.phpbbchina.com/wiki/index.php/%E7%BC%96%E5%86%99PHP%E6%89%A9%E5%B1%95 中文教程
]]>下载:lucene_dz
欢迎加入QQ讨论群:41886598
]]>我点到我自己的淘宝里面,进入了一个陌生女子的界面
不过这个bug只出现了一次
这个人我已经加上了,是个卖魔方的
卡巴斯基中文官网论坛账号诡异事件:
http://bbs.kaspersky.com.cn/viewthread.php?tid=15891
有登录论坛出现别人信息的会员请进这个问题,论坛上已经有不少会员碰到。管理员正在设法解决这个问题。凡是出现这种情况的,请在下面回帖,向管理员详细说明以下情况,帮助管理员更快解决问题
1、出现问题的频率和条件
2、进入论坛的方式(例如是收藏夹进入、直接输入网址进入……)
3、论坛登录名和密码的保存方式(每次输入,不保存;按照多少时间保存)
4、有无别人和你共用电脑
5、使用的浏览器,及其版本
6、有无采取清除缓存文件,清除Cookies的措施,效果如何?
7、除以上措施外,有没有采取过其他措施,效果如何?
GMAIL账号诡异事件:
http://www.gseeker.com/50226711/aecceaecgmaileaeieie_139265.php
看到这个标题,你可能会认为这是天方夜谭。但事实上,这是完全有可能发生的。某天,你在登录Gmail时,尽管你100%正确地输入了自己的用户名及密码,但出现在你眼前的却是别人的Gmail邮箱。如果你第一时间怀疑自己的眼睛,那你就冤枉它了。因为至少在科威特,部分Gmail用户本周就经历了这样的怪事。
通过这些事件的观察,和对一些论坛账号发生错误的账户主人的询问,基本确定了以下几个可能点:
1、缓存的错误。因为discuz使用cookie进行身份认证,而一些代理缓存了cookie头,造成一个cache多人使用造成的问题。http://bbs.chinaunix.net/viewthread.php?tid=837214
2、依然是缓存的问题。只不过这个缓存可以存在于cn大局域网,或者某些ISP,比如google的例子,或者某些地区的服务商,抑或……
您是通过什么网络上的淘宝,据我所知,移动的浙江固网宽带出现过类似的严重安全隐患。宽带网络运营商的问题很大(强制建立缓存代理服务器,缓存不该缓存的网页),网站的问题是其次的。或者说,在那种情况下,绝大多数网站用户都会出现“穿越”现象。
如果被你穿越的人和你斗处在同一城市,基本上就是这个原因了。
解决方法,且听下次分解。
如果您的网站出现类似问题,欢迎加我qq176300676一起收集数据样本进行分析
亦可加入msn讨论群 lampper@live.cn
]]>1、分库
这个方法至少两三个注册用户百万级至千万级的论坛在使用。实施也比较简单,只需要把sessions表放在其他的库中,跟论坛主库分离,这样,就可以用多台服务器来分担论坛压力。sessions表查询的地方,如果直接查询,则连sessions表所在的库,如果是联查,则分别查询后,合并插叙结果。
2、砍功能
这个方法虽然不实用,但的确有效。仔细看看dz的一些sql语句,就知道砍掉某些功能摆脱sessions表的约束,性能会有多大的提高。砍功能,最终还是为了提升性能。但如果不砍功能又提升性能,才是终极目的。此方法适用于对某些统计功能要求不高的论坛使用。
3、memcached存储sessions,异步统计用户的在线数据
此方法其实还是砍掉了论坛的用户在线统计功能而独立开发一套统计系统。此思路来源于我们的统计服务器。如果统计服务器已经统计了部分信息,就没必要再去耗费大量的sql效率去进行统计。当时我们负责统计的吴同学正好也要开发一套针对不同系统的统计代码,我可以直接把要统计的数据提交给统计服务器,再由统计服务器返回统计结果。以异步的方式来统计,化解dz sessions表的性能瓶颈。而统计信息的异步提交,可以提交到本地数据库,可以提交到第三方统计系统,当然也可以根据需要独立开发一套小型统计系统。
方案3是本人原创方案,方案的修改代码在以下附件中: 异步session统计信息同步,欢迎大家使用。
由于dz的开发考虑的是大众市场,功能冗余代码逻辑复杂。但优化dz并不是那么的困难,而优化的思路,也是跟其他系统优化相似:mysql瓶颈。一个即将崩溃的系统,或者频繁崩溃的系统,是进行优化的最好示例:减少sql查询,提高sql语句查询效率。dz考虑大众市场,为了提高产品兼容性,并没有引入太多的第三方软件:比如memcached,bdb,ttserver等,虽然内部已经为主从预留了接口,但未见很明显的文档支持。
第三个方案优化的思路也很明显,减少sessions表的慢查询而改为memcached高速的数据存储,把统计功能做接口留出,此功能给第三方来做。这样sessions表的瓶颈即可消除。
一天都在考虑使用完全开源的方案来解决dz sessions表的性能问题。中午大脑极度紧张,以至于撞在关兄的工位,工位几近散架。
在轻度震荡中想到一个优化方案,就是分离sessions表的一些功能,把sessions会话和统计功能分离,并且统计使用异步提交。
这样,如果sessions会话生存期10分钟的量计算,20万人同时在线,sessions会话存memcached,而统计只用少量字段在独立的表中。因为php的sessions操作速度高,而统计信息调用并不是非常频繁,并且查找也是简单的int型查询,速度快,并且也进行memcached缓存。
下午吴同学详细讲述了我们的统计系统的负载和数据量,在大量实际应用的基础上,我的方案应该能很好的实施。
这样算来,连接瓶颈跟存储瓶颈似乎都能解决。明天集中时间实现这个方案。
]]>曾经尝试过使用php的session,不过支持phpsession的几个sever都不支持条件查询,除非是遍历匹配。这样也不能起到提高性能的作用。
在以上条件下,我寻找了两套方案:ttserver mongodb。
在session表100w数据的测试下,得出以下数据:
连接测试-只测试连接释放
tt:40.0904033184
mysqldb:0.0669066905975mongodb:226.840053558
mysqldb:0.154407262802经过一万次的连接测试,同一个脚本中,
ttserver连接耗时 40.09 秒,而mysql连接耗时0.07秒 linux下测试
mongodb 连接耗时 226.8 秒,而mysql连接耗时0.15秒 linux下测试但是在500次的查询测试中,同一个脚本中,主键查询和索引优化后的复杂查询
mongodb 查询耗时 0.021 秒
mysql 查询耗时 0.123 秒
可以看出,tt和mongo两个功能上完全支持此表优化的数据库,在连接性能上远不如mysql,而web为频繁连接中断的服务,显然并不适合做这项功能。
继续寻找支持此功能的开源方案,欢迎大家提供线索。
]]>单点登录,英语为 Single Sign-On,粗俗点讲,就是登录一次,全站适用。
单点登录在应用中的实际意义,就是减少开发量,增强用户体验。
减少开发量,指的是:只要开发一套用户系统, 各个系统统一调用。用户系统尽量优化接口,通用性,安全性,达到一次开发, 全站适用。
增强用户体验,指的是:用户一次登录,全站登录。而不是切换一个模块,就登录一次。
web方面单点登录主要是用cookie传递令牌进行身份认证。简单说下令牌。
我这里用散列值来作为令牌,当然散列值之中有我的的密钥,防止别人伪造我的令牌。
环境:sso.sunboyu.cn 用户中心 vps.sunboyu.cn/cookie.php 跨子域不同脚本访问测试。 令牌密钥: $key
具体规则: sso.sunboyu.cn 用户登录,登录信息写到cookie,cookie做用域为 sunboyu.cn。并且生成令牌sso_key=md5(uid+username+key)。
登陆后,其他子域站点调用此cookie信息,并且验证此令牌是否是合法的令牌,if( md5( cookie[uid]+cookie[username] )==cookie[key] )
这样既可判断,此令牌合法性而确认此用户为登录。
具体demo:http://sso.sunboyu.cn
延伸:一个简单的md5似乎很容易让别人猜解加密的算法,来暴力一翻也不是没有可能,因此,除了加密外,算法的安全性和密钥的安全性也是需要考虑的。
如果安全级别要求高之又高,可以考虑rsa算法,不过速度就是问题了。其中又参考了一些朋友的意见,用对称加密,比如php中的Mcrypt 函数。
扩展开发:对于大多数网站,跨子域的单点登录就能满足应用。但对于一些域名复杂的网站,比如sohu,显然多个域名不能用此方法实现。这时就得搞出跨跨的单点登录系统。等年后继续得瑟。
]]>具体无模式是啥,这里找了两篇文章:
关于无模式的应用案例,很典型的一个,就是康盛uchome的feed表。
这里简单介绍几个无模式数据库,供大家参考:
mongodb : http://www.mongodb.org/display/DOCS/Home
mongodb的php扩展 http://www.mongodb.org/display/DOCS/Installing+the+PHP+Driver#InstallingthePHPDriver-PECL
这个数据库已经在淘宝上配合10gen做了云计算的session(名字很操蛋),具体资料在这里 http://rdc.taobao.com/blog/dw/archives/410。具有了实际应用的东西应该很不错,不过我没尝试过。
Tokyo Tyrant:http://1978th.net/
tt的php扩展 http://www.php.net/manual/en/book.tokyo-tyrant.php
这个大家就比较熟悉了,SB日本鬼子写的东西,应用很广,sina,qq等公司里都在大量应用,sina的研发团队在此基础上还做了个分布式的东东,很是不错。据说这玩意还得到了很多公司的赞助,shit。
TCSQL:张宴基于tt开发的一套东西,内部做了很多算法优化,具体可参考此文章 http://blog.s135.com/tcsql/
总结:康盛使用mysql来存储session,不能说是一种错,但对于dz的负载绝对是第一个瓶颈。用这种方式,在线人数5w对数据库绝对是个坎。很多负载比较大的论坛,都做了此方面的优化,比如,给session表单独一个数据库,或者干脆阉割此功能。不错,独立的session表,或者分库,访问量大的时候,瓶颈依然在mysql上;阉割此功能,有些心疼,而且很多运营数据会丢失。所以,保持原功能而平滑提升性能,是一个不错的解决方向。
]]>一个不错的方案,就是提交到后台去执行。
linux有个命令 nohup command & 这样就会提交到后台,而终端的用户体会不到程序执行的过程。
原来我使用这种方式 shell_exec( “nohuo php file.php &” ) 进行后台提交,后来发现速度依然不快, 还是被挂起了。查看手册,exec函数有如下提示:
Note: 如果用本函数启动一个程序并希望保持在后台运行,必须确保该程序的输出被重定向到一个文件或者其它输出流去,否则 PHP 会在程序执行结束前挂起。
因此,这样修改就达到了目的:
exec( “nohuo php file.php >> /dev/null &” )
]]>index.php 部分数据已经进行了缓存,但需要全部缓存,只有当 页面刷新数/更新时间 >>>> 发帖数/更新时间 ,则有必要做此缓存,此处缓存更新最为频繁,适合做内存缓存,但 更新时间不宜太久,此时间根据首页更新频度确定。
forumdisplay.php 更新频繁,优化策略同上,只是更新频度略低于首页。
viewthread.php 回复更新频繁,内容更新频度低,适合做硬盘缓存。但分页部分不可做缓存,否则……
space.php 更新不频繁,适合做硬盘缓存。
faq.php 做个静态即可。
以上分析只是根据平时维护总结,临时脑子一蹦,未作具体分析,欢迎广大站长讨论试用。版权所有,欢迎盗版。
]]>最近一直在修改discuz,看到了很多问题,在跟系统工程部门合作的时候,也看到了很多比较优秀的解决方案,可以引入到系统中。
底下粗略讲述下已经做过的优化和可以着手进行的优化。
对于一个数据量比较大的论坛,首先是分表。posts表,threads表是必须要分的。可以按照forum表的fid进行分,也可以使用tid进行hash散列分布。分表带来的问题,显然是分页。我们进行排序的时候不可能去进行union查询,否则就失去了分表的意义。在这里,我们使用了一个支持排序的key-value型存储的小型数据库-Tokyo Tyrant(http://1978th.net/tokyotyrant/),用此数据库去同步threads表和posts表的数据,达到高速分页。(附:典型应用可以参见此文章 http://blog.s135.com/tcsql/ )
随着数据表的膨胀,很多join联查必须进行拆分。分表可能强制我们去拆分联查,另外一些很变动不大的表,比如用户信息表的数据,使用率明显很高,变动不会太大,而使用key-value存储再合适不过。这时候,bdb和memcached是首选,我推荐使用bdb,可以持久存储于硬盘上,由用户更新资料触发更新,不必考虑过期和服务器重启的问题。这样可以减少太多的join联查,而节约数据库服务器的缓存。
随着静态文件的增长和访问量的增长,带宽浪费是一个值得考虑的问题。我们打开discuz的首页,静态文件要比php文件多好几倍,而每个文件都夹带了长长的cookie信息,因此,把这些cookie去掉显然会节约大量的带宽。discuz的文件结构还是很不错的,通常通过一个参数的配置或者全文替换就能完成这项工作。此应用,可以在新浪所有的图片上有所体现。
全文检索是mysql所不擅长的,因此附加一个好的全文检索方案很必须,我熟悉的方案:Lucene,sphinx,whoosh是我喜欢的几个全文检索的工具,对于discuz的负载,我感觉任何一个都能满足应用。在此方案上,设计一个完美的同步触发机制很重要。
还有很多问题,都在待发现中,部分问题已经解决,部分问题可以优化。discuz优化好,其实是个不错的产品。
]]>但discuz毕竟是为中小型网站设计,很容易达到性能的瓶颈。在最近对discuz的改造和表结构的分析,做了以下的探讨,来提升论坛的性能。
第一步,当然就是分表。
技术实力不太强的用户(严重依赖mysql的用户),分表是最直接的做法(当然,有些功能会损失)。
分析一个运营两年的discuz数据库,库表大概是十几个G左右,posts数据表已经几个千万。
首先可以拆分的,就是post表了。根据情况,post表可以分10张,百张,规则可以哈希,也可以阶段自增(分表主键使用tid(帖子id))。分完表,可以看到一排post_**的表,每个表的数据量降到百万以下,速度就无太大影响。
第二个可以拆分的,是threads表,此表分表,可以水平分割方式水平的分割,可以根据论坛版块id进行分表,这样可以使每个表的数据量减小,但这样也损失了一个功能:全站标题检索。
通过以上两个表的改造论坛的承载能力能迅速见长。
底下会讨论高级优化改造得方法,且听下次分解。
]]>没用数据绑定和一些高级的功能,只是实现基础功能。
产品看法:
这个产品主要是服务一些个人站长和小型站点,功能模仿一些成熟的sns系统,模仿比较到位,而且功能上尽可能大的去完善,让管理员可以方便进行比较系统全面的管理。而从产品的设计体验上,也能适应中国大多数的用户。
所以,这个产品在国内算一套非常不错的sns建站系统。
编码方面:
要说代码,我相信阅读过代码的人一定很头疼,从discuz的bbs就这样。
代码只是面向过程,这个,在discuz方面,我估计是累积开发造成的,一个个版本升级,变化不能太大,如果变化真的太大,会失去一些开发者。另外,他自己升级也是个问题。
不过uch这个产品也开发成了这样。代码结构我倒挺喜欢,之前我写那个架子也是这样。优点:结构规范,适合多人协作。缺点,面向对象性,代码复用差。这个结构,我估计是公司某元老折腾的,然后有几个小弟进行模块开发。
为什么这么说,是有原因的,因为遍历整个代码,起码有两种以上的代码风格,而且人员之间沟通配合也造成了一些错误,虽然不是bug,但看得出来项目进行的仓促。不过这也是公司的一个战略措施,小戴同学总是及时放出产品来打压竞争对手。
再说负载,其实这个问题就不用说,从大量的垃圾sql语句就能看出,这个产品不能支持较大的负载。
再说最后一点,如果你想去优化改善,彻底改善,放弃吧。重写。
我看的只是uch2.0的预览版,估计正式版放出的时候,这些问题会有所改善。
]]>我google此类信息,有不少问题都出现在了编码上,建议网友在使用的时候,发现编码错误,仔细跟踪一下,找出模板。大部分的问题基本能以此方式解决。
]]>模板部分
其实我在做的时候又出现个问题,如果是url重写了,如何来做这个baseurl变量。问题解决方法是,把url当做模板,比如/blog/index/%d
]]>这次使用成语作为汉字验证码(其实已经发现其他网站再用),则中文用户识别的几率就大得多。
demo:
程序下载:点击下载
]]>因为GD函数进行缩放,必须有宽和高,而在浏览器中,会自动按照比率调整宽高,所以两个函数稍有区别。
fckeditor是一个非常棒的所见即所得在线编辑器,包括一些门户网站都在使用。fckeditor有个问题,就是上传图片默认为一个文件夹,当然这个问题早已经解决,我们可以用cookie或者session的方式给参数 $Config['UserFilesPath'] 就可以定制上传路径。而后在文章保存的过程中即可保存图片地址。
然后在使用过程中又出现一个问题,虽然我们知道图片在哪个文件夹,但我们却不能动态的去知道具体文件夹内有哪几个图片,预览是什么。而且,我们在写CMS的时候经常需要调用其中一张图片做封面,原来的机制显然无法去满足这些需求(当然你也可以查看编辑器内的源代码来查看图片地址,不过对于外行似乎有点困难)。
突然看到了discuz的附件机制,相出这么个损招:每张图片上传都给他存储在数据库中,打上guid(或者唯一的地址)进行标识,当我们保存的时候,图片会跟文章关联,在使用之前还可以用ajax动态调用预览,可谓一举两得。
文章保存后,图片进入数据库,另外还可以方便找出编辑遗留的垃圾,因为很多时候一个已经传了文章的草稿没有保存,而遗留很多的临时文件。
最近的fck版本好像升级了,配置文件放从根目录迁移了,不过fck代码非常规整,做这么个改造不是很难,就没写demo。
———————————————-
文章很冗余,骗稿费?
]]>分流下载 http://down.chinaz.com/soft/26439.htm
这样不用每次都把php.ini拷贝到C:\Windows下
2、set Path=D:\PHP5;D:\PHP5\ext;%Path%
这样不用每次把那些dll拷贝到C:\Windows\system32下
]]>其目的是把合法的cookie拿出来防到一个全局变量里去用。
cookie本身就是一个挺好的全局变量,而康盛又把这个变量拿出来去用,为什么?
或者,为了方便管理变量,但判断函数判断自定义全局变量跟判断cookie全局变量成本相同;
或者,为了让开发者必须彻底明白业务逻辑才能修改,提高竞争对手抄袭门槛或者提高二次开发门槛而给项目部带来更高的收入?
这样的代码里边很多,也许只有他们自己才能了解最终目的。
]]>原来一直用的是拼凑的方式生成xml,这次使用了DOMDocument对象。不知道这个类是否有非法字符的问题,待测试一下便知。
启动撰写时间: 2009年05月20日
目的:全面详细介绍LAMP fastcgi方式配置细节,基于之前的自动配置脚本,目的是把更多的细节转达给大家。
需要软件源码:
CentOS4.7
http://centos.ustc.edu.cn/centos/4.7/isos/i386/CentOS-4.7.ServerCD-i386.iso
http://centos.ustc.edu.cn/centos/4.7/isos/x86_64/CentOS-4.7.ServerCD-x86_64.iso
Apache-2.2.9
http://archive.apache.org/dist/httpd/httpd-2.2.9.tar.gz
MYSQL-5.2.6
http://downloads.mysql.com/archives/mysql-5.0/mysql-5.0.22.tar.gz
PHP-5.2.6
http://museum.php.net/php5/php-5.2.6.tar.gz
FCGID
http://ncu.dl.sourceforge.net/sourceforge/mod-fcgid/mod_fcgid.2.2.tgz
安装:
第一步:Linux系统安装,同时可以参照我原来的文档
http://www.sunboyu.cn/2008/06/13/centos5%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97%EF%BC%88%E7%AE%80%E5%8D%95%E7%AF%87%EF%BC%89.shtml
视频。我按照最小化进行安装。最后ping百度不通,是因为没有重启,重启后是正常的。从过程可疑看出,我用的vmware进行安装,所以,要根据你实际的网络情况进行调整配置。
第二步:系统更新,组件安装。
首先更新一下yum源,具体查看这篇日志 http://www.sunboyu.cn/2009/01/07/centos4%E5%88%9D%E5%A7%8B%E5%8C%96%E7%9A%84%E4%B8%80%E4%BA%9B%E8%84%9A%E6%9C%AC.shtml
升级一下系统:
yum upgrade
安装一些必要的组件:
yum install gcc gcc-c++ gcc4-c++ autoconf gd gd-devel libxml2 libxml2-devel zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel expat expat-devel sqlite sqlite-devel png-devel jpeg-devel libtool libjpeg* libpng* freetype-devel
安装MYSQL-5.0.22
解压mysql
#tar -zxvf mysql-5.0.22.tar.gz
#cd cd mysql-5.0.22
#groupadd mysql
#useradd -g mysql mysql
#./configure –prefix=/opt/mysql-5.0.22 \
–without-debug \
–enable-thread-safe-client \
–with-client-ldflags=-all-static \
–with-mysqld-ldflags=-all-static \
–enable-local-infile \
–enable-largefile \
–with-charset=utf8 \
–with-collation=utf8_unicode_ci \
–with-extra-charsets=complex \
–with-pic \
–with-mysqld-libs \
–with-comment \
–with-query-cache \
–with-bench \
–with-big-tables \
–with-innodb \
–with-mysqld-use=mysql
#make
#make install
#cp ./support-files/my-medium.cnf /etc/my.cnf
#cp ./support-files/mysql.server /etc/init.d/mysqld
#chmod 755 /etc/init.d/mysqld
#/opt/mysql-5.0.22/bin/mysql_install_db –user=mysql &
#echo “/opt/mysql-5.0.22/bin/mysqld_safe –user=mysql &”>>/etc/rc.local
#service mysqld start
#/opt/mysql-5.0.22/bin/mysqladmin -u root password ‘123456′
#cd ..
安装APACHE
#groupadd apache
#useradd -g apache apache
#tar -zxvf httpd-2.2.9.tar.gz
#cd httpd-2.2.9
#./configure –prefix=/opt/httpd-2.2.9 \
–enable-dav \
–enable-dav-fs \
–enable-modules=all \
–enable-mods-shared=all \
–disable-auth-basic \
–enable-include \
–enable-substitute \
–enable-authz-dbm \
–enable-log-config \
–enable-headers \
–enable-setenvif \
–with-ssl \
–enable-static-ab \
–enable-http \
–enable-mime \
–enable-status \
–enable-isapi \
–enable-imagemap \
–enable-actions \
–enable-speling \
–enable-userdir \
–enable-alias \
–enable-vhost-alias \
–enable-dir \
–enable-rewrite \
–enable-dumpio \
–enable-echo \
–enable-so \
–enable-example \
–enable-case-filter \
–enable-substitute \
–enable-log-config \
–enable-logio \
–enable-env \
–with-mpm=worker \
–with-included-apr \
–with-apr \
–with-apr-util \
–with-z \
–enable-proxy \
–enable-proxy-connect \
–enable-proxy-ftp \
–enable-proxy-http \
–enable-proxy-ajp \
–enable-proxy-balancer \
–enable-suexec \
–with-suexec-caller=apache \
–with-suexec-userdir=www \
–with-suexec-docroot=/home \
–with-suexec-uidmin=100 \
–with-suexec-gidmin=100 \
–with-suexec-logfile=/var/log/suexec_log
#make
#make install
#ln -s /opt/httpd-2.2.9/bin/apachectl /etc/init.d/httpd
#cd ..
修改apache配置文件 /opt/httpd-2.2.9/conf/httpd.conf
找到
User daemon
Group daemon
修改为
User apache
Group apache
安装 fcgid
#tar -zxvf mod_fcgid.2.2.tgz
#cd mod_fcgid.2.2
修改Makefile
top_dir = /usr/local/apache2 为 top_dir = /opt/httpd-2.2.9
#make
#make install
#cd ..
修改apache配置文件 httpd.conf
增加 LoadModule fcgid_module modules/mod_fcgid.so
安装PHP,记得增加cgi支持
#tar -zxvf php-5.2.6.tar.gz
#cd php-5.2.6
#./configure –prefix=/opt/php-5.2.6 –with-libxml-dir –enable-cli –enable-cgi –enable-fastcgi –enable-bcmath –enable-force-cgi-redirect –enable-discard-path –enable-path-info-check –with-openssl –with-pcre-regex –enable-calendar –enable-dom –enable-ftp –with-openssl-dir=/usr/local/ssl –enable-gd-jis-conv –enable-hash –with-iconv –enable-json –enable-mbstring –enable-mbregex –enable-pdo –enable-posix –enable-libxml –enable-simplexml –with-sqlite –enable-tokenizer –enable-xmlreader –enable-xmlwriter –enable-sockets –with-zlib –with-freetype-dir –with-gd –with-jpeg-dir=/usr/lib –with-png-dir=/usr/lib –with-mime-magic –with-mysql=/opt/mysql-5.0.22 –with-zlib-dir=/usr/lib/libz.so –with-pdo-mysql=/opt/mysql-5.0.22 –with-pdo-sqlite –enable-posix –enable-soap
#make
#make install
修改apache配置文件httpd.conf
找到
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf
修改为
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
修改apache配置文件 conf/extra/httpd-vhosts.conf
删除所有的虚拟主机
现在配置虚拟主机:
所有虚拟主机的组为 vhost
增加一个用户名为sunboyu的虚拟主机
#groupadd vhost
#useradd -g vhost sunboyu
用户主目录默认为 /home/sunboyu
增加两个目录
#mkdir /home/sunboyu/www
#mkdir /home/sunboyu/logs
增加虚拟主机配置文件
SuexecUserGroup sunboyu vhost
ServerAdmin sunboyu@gmail.com
DocumentRoot “/home/sunboyu/www”
ServerName 192.168.0.4
ServerAlias sunboyu.cn
ErrorLog “/home/sunboyu/logs/error_log”
CustomLog “|/opt/httpd-2.2.9/bin/rotatelogs /home/sunboyu/logs/%Y_%m_%d_log 86400 +480″ common
AddHandler fcgid-script .php
#AddHandler cgi-script .pl .cgi
FCGIWrapper /home/sunboyu/php-cgi .php
Options ExecCGI FollowSymLinks
AllowOverride all
Order deny,allow
Allow from all
创建文件 /home/sunboyu/php-cgi 文件内容为
#!/bin/sh
export PHPRC=/home/sunboyu
export PHP_FCGI_CHILDREN=4
export PHP_FCGI_MAX_REQUESTS=5000
exec /opt/php-5.2.6/bin/php-cgi “$@”
#chmod 755 -R /home/sunboyu
#chown sunboyu:vhost -R /home/sunboyu
配置到现在,重启apache
#service httpd restart
在虚拟目录根下 /home/sunboyu/www 下写文件 info.php 内容为 phpinfo() 修改权限为755 用户组为 sunboyu:vhost
现在访问应该是phpinfo的信息。
在写这篇文档的时候,基本是按照数续依次安装。
如果有问题,希望帮忙,请提前修改你服务器root密码,我们可以一起调试。
]]>效果,很简单,黑白配,有心的人可以自己修改一下风格,欢迎共享
PHP部分
模板部分
补充一个demo
为了开发这个框架,阅读了大量框架代码,框架思想,然后精心去调试了自己的框架。
在框架完成后,我并没有去使用。
框架的初衷是为了性能跟开发规范,而我在这个框架下兼职无法写代码,无法发挥。自从学写PHP,我从来没受什么规矩约束过,向来是自由度很高。而规则则是多年编程留下的一些经验。后来发现我的风格实在无法用框架来约束,所以放弃使用这个框架,依然按照自己的风格进行开发。
但反思,为什么有很多的框架在项目中应用-那就是规范。不成规矩,不成方圆。尤其在团队合作开发过程中,团队利益就高于个体利益。如果每个人能损失一点个人利益,那团队就可能拥有至高的利益。
因此,我又尝试开发了一套闭源自用的框架。其既集成了框架的一些模块化,规范化的理念,又适合程序员在小范围内自由发挥。后来我又加上了一些管理功能,通用模块系统,现在我可以在这个上边快速开发,又可以很轻松得把模块拆离重组。
内心我并没有把他当作框架,叫做程序“模子”会更好,感谢lamp群友给这么个名字。
]]>回头多找几个这样的,自勉
]]>然后想到了file_get_contents($url)方法,可以得到纯净的http包的正文。但这种方式默认是get的方式,后查手册和搜索,得到了post的方法。
这种方式基本跟socket的方式相同,包头构建好即可。
我不认为PHP很强,因为它只是一个面向Web的脚本语言,而PHP的开发者却赋予了它太多,让人去用,有人也滥用。
当然,一门语言能解决N多问题是好的,比如汇编,C,但终究PHP有它跨不过的坎。毕竟它只是web脚本语言。
权限出现很大的问题,至今没有搞透,说白了对linux还是一知半解,使用python写了个第三方的东西,很完美得跳跃了权限的问题。至于效率,python肯定要比php强的,起码PHP作为服务器端程序运行,PHP还没有线程和进程的控制(一直没有发现),python有完善的线程进程的库。在权限管理上,python没细看,PHP在linux下有posix函数库,我一直也没有用过。
在没有更好的解决方案前,我依然用PHP做服务器端程序,python作为一些补充。也许,全部切换过去。
]]>413 Request Entity Too Large
——————————————————————————–
nginx/0.5.34
FUCK Nginx HOST
那个sqlitemanager http://www.sqlitemanager.org/
代码如下,因为使用不多,临时用一下,所以细节没怎么处理,待出问题的时候再来修改。
写程序再多,很多情况还是考虑不清楚。有时候代码耦合度并不能合理权衡,一旦升级某项功能,大改一下也是难免。但大换血式的更改代码是很忌讳的,尤其是运行很稳定的程序。
迫不得已,流程要修改,而且可能是截断了某个流程,创建分支,这时候,如果有一个版本的控制,那只需要更新特定的版本文件,即可实现无缝升级。当然,如果不稳定,可以迅速实现代码版本的回滚。
不过这种情况要求程序模块松散耦合,当你有紧耦合代码需要调整的时候,可以享受版本切换带来的享受。
]]>另一个是cakephp的“高仿版”,虽然是一个完整的框架,但学习成本高,另外扼杀了程序员的天性,所以,不再更新。
这次更新的是第一个框架,因为投入了生产,暴露了很多问题,这次的目标,首先是一个完善的框架系统,另外继承很多的应用实例。
另外一些LAMP应用脚本也会适当集成,当然得是拥有root的人才能使用这些功能。
主框架依然是PHP类库,路由,JS库(考虑是否集成JQUERY)
]]>时间戳是时间段,不受时区影响,无论哪个时区,取得都是格林威治的时间段。
date,是取得的系统时间,也就是加了时区的。
为了保持一致,php的头文件应该首先声明时区。
犯个错误,还得导数据库……
]]>找了半天居然没找到问题在哪里,一咬牙,写了个性能和负载的记录工具,再出事我可有记录了-,-||
备注:只能在linux下用。
常用的PHP框架:Cakephp Flexphp Thinkphp
什么是脚手架:脚手架通常使用在框架的数据抽象层,数据脚手架可以很直观得给开发者或者使用者数据结构的表现。脚手架同样可以表现在一些具体应用上。但脚手架的功能只是把数据或者应用的最终结果能用简单的方式表现,但并没有达到最终的应用效果,常用在建模或结构设计的初期。脚手架的优势就是给最终用户一个直观的产品但中间并没有经过大量的开发,以减少需求变更所带来的反复开发。
常用脚手架:CI框架中数据脚手架
什么是应用资源包:应用资源包就是具体的应用了,比如bbs,blog,用户管理,资源管理等一些具体的应用。应用资源包侧重完成了一个完整的功能,而面向开发的应用资源包又提高了可迁移性,使一些项目的功能模块直接修改应用资源包的接口而达到快速开发。
常用案例:xoops中功能模块包。
]]>数据库中时间,我习惯使用时间戳来保存,取某天或者某小时的数据时,采用 sql 的 between and 方法。
乍看这样是没有什么问题的,取某天的时间段。实践证明,在数据时间的分布比较疏松的时候,的确没什么问题,但如果数据分布十分密集,每秒都有若干数据的时候,问题就出来了。根据between的规则,实际的时间就是 $time[1]-$time[0]+1 = 86401
每条语句多算了一秒……汗
解决方案,时间段的计算一律 $time[0] + 60*60*24*x -1
]]>这个方案最早出现在这哥们的博客里,大家可以参考 http://blog.s135.com/read.php/311.htm
而我处理,基本基于PHP的cli模式,使用$argv传递参数而非url,在一些涉及轮询的程序中,可以尽快得把负载分散,使单一的轮询程序来处理下一次的轮询。
]]>同时我们可以 $b = &$a,$b作为 $a的引用,他们同时指向test存储空间。
在文章 http://www.sunboyu.cn/2008/11/19/php%E4%B8%AD%E5%8F%98%E9%87%8F%E5%BC%95%E7%94%A8%E8%AF%A6%E8%A7%A3.shtml 中,我们做了一个应用的测试,当删除一个引用后,变量并不消失,是因为PHP使用一个引用计数的东东。当$a=”test”建立后,test的引用计数就是1,建立 $b=&$a后,test的引用计数就是2,删除任何一个引用后,引用计数为1.
只要是引用计数不为0的数据,则为当前有效的数据。然而,当数据的引用计数为0的时候,系统就会识别此数据为垃圾数据,需要回收,这也就形成了PHP的垃圾回收机制。
]]>取名CentPHP,是因为我希望它像CentPHP一样强大稳定,而且免费开源。
最终把session的数据库保存方式给去了,因为太麻烦,模板引擎基本没什么功能,只有传值和显示,虽然进行了一些优化,但没有彻底跟踪排查资源调用情况,这个在以后版本要逐渐修正。
下边是相关文件列表,源码~~~~~~~~~等实现完一个项目后放出……
F:.
│ Index.php
│
├─lib
│ └─kernel
│ CentPHP.php
│ Class.Controller.php
│ Class.CP.php
│ Class.Mysql.php
│ Class.Router.php
│ Class.URI.php
│ Class.View.php
│ Common.php
│
├─usr
│ ├─config
│ │ Config.Mysql.php
│ │ Config.View.php
│ │
│ ├─controllers
│ │ welcome.php
│ │
│ ├─lib
│ │ Class.Session.php
│ │
│ └─views
│ welcome.php
│
└─var
补充:session放到数据库中的好处:可以即时得查看在新的用户(当然不是非常准确),可以踢人,如果是有登录认证的话。缺点:速度贼拉得慢,不如放到内存中。操作一次内存,得反复读写数据库,且不说硬盘,网络传输就是不消的消耗。
]]>下载地址 http://downloads.php.net/ilia/php-5.2.7RC5.tar.gz
]]>准备:
apache2.2.* http://httpd.apache.org/download.cgi 如果有stable版本,最好用stable版,其实最新版作为调试也不错
PHP5.2.* http://www.php.net/downloads.php 目前是5.2.6
mysql5.1 http://dev.mysql.com/downloads/mysql/5.1.html 下载windows安装版本
1、安装Apache,安装路径随意,默认即可,手工管理更好,建议放到 d:\Apache 放D盘是为了以后重装的话,所有的配置文件都还在(备份不仅要备份数据,还要备份不起眼的配置文件)
2、安装Mysql,同上,安装到 D:\Mysql 理由同上
3、解压PHP5.2.×至目录 D:\PHP5 理由还是同上
4、配置环境变量:在桌面上找到“我的电脑”,右键点击“我的电脑”,选择“属性”里的“高级”标签,点击“环境变量”,在“系统变量”里找到“Path”,点击“编辑”按钮,在“变量值”后面加上“;D:\PHP5\;D:\PHP5\ext”,然后点“确定”退出。环境变量配置完成。(windows下Path环境变量是做什么用,google一下先,这样设置后,系统会自动搜索PHP目录里的可执行文件和加载类库)
5、进入PHP5目录下,找到php.ini-dist文件,将其复制到C盘的WINDOWS目录下,并将其文件名修改为“php.ini”。(php会默认从这个路径找php.ini这个文件,当然也可以手工指定这个目录,修改apache的配置文件即可)
6、再次进入PHP5目录下,将以下文件复制到C盘的WINDOWS目录下的System32里:(原因,我也不太清楚,但貌似可以设置一个环境变量指向这个路径就ok,那个方法一直没找到,也没理解)
fdftk.dll
gds32.dll
libeay32.dll
libmcrypt.dll
libmhash.dll
libmysql.dll
msql.dll
news.txt
ntwdblib.dll
7、打开Apache的主目录,进入conf文件夹,找到“httpd.conf”文件,为操作方便起见,建议使用Dreamweaver打开它。打开后在第126行左右找到 LoadModule vhost_alias_module modules/mod_vhost_alias.so,在后面添加以下语句:
LoadModule php5_module “D:/PHP5/php5apache2_2_filter.dll
“AddType application/x-httpd-php .php
添加完成后保存文件。
8、在apache主目录下htdocs下创建index.php文件,内容为<?php phpinfo(); ?>保存。
9、在浏览器的地址栏里输入http://127.0.0.1/index.php。即可打开显示PHP信息的页面。配置成功。
]]>然后在默认welcome的模型里print_r($this),那是一个密密麻麻阿,无数的实例化数据摆在这里,估计内存CPU消耗也是惊人。
当然,作者并不是没有解决这些问题,所有的类在实例化之后使用static的方式常驻内存中,在第一次加载后,响应时间明显缩短,我本地测试是否默认实例化如此多的对象速度没有明显的差别。
对于原来我写程序,其实是有洁癖的,或者是心理障碍,就是像写C一样仔细考虑每个变量和每个方法,计算操作复杂度,其实对于整个系统开发和PHP这们语言来说,这么开发其实是杞人忧天,因为PHP本身就可以处理这些问题,比如static方法,一些缓存。
在进行各种测试之后,我的类库居然也默认加载了一些方法,只是应用在小网站中。
对于大型网站,还是要充分考虑效率性能的问题。
总结到这里,晚上继续玩命……
]]>一个优秀的框架除了规范化大部分操作外,其在效率和性能损耗上做了进步一的改进,从而能够高效处理复杂的操作。
第一个自动加载类的函数,参考了下PHP手册关于引用部分,才发现自己原来写类的方法,是如何的消耗内存和CPU,任何一个方法的诞生都是有其目的的,不能认为PHP是神,但PHP毕竟比我强,因此我还是要相信这些我不熟悉的操作是有用武之地的。
第二个方法,是要定义URI路由,URI路由我会尽量使用逐一匹配的方式进行解析,但有些操作不确定变量数量的时候,简单使用正则。我正则不很强,但也对着手册也可以写,但我总感觉这玩意太费劲,大脑想着费劲,电脑做着肯定费劲。有简单的方式,为何用难的,难道只是为了省点代码空间么,没必要的。
不过说到底,正则这东西还是很有用,不能因为效率差而失去,计划写个分支,把简单的用模板匹配,复杂的用正则,皆大欢喜。
不过写之前,还是要大量翻看别人的东西。
]]>很显然,这样做的好处是减少了实例化对象的复制,直接绑定了对象。这样减少了内存的消耗和操作的复杂。但实际上官方又说了这么一句,很是纳闷:
Do not use return-by-reference to increase performance, the engine is smart enough to optimize this on its own.
不要尝试用引用返回提高性能,因为PHP引擎足够聪明,自己会解决。
闷中

可以看出,引用其实就是给一个变量增加了一个别名,而对于有别名的变量,删除这个变量只是删除了这个变量的名字,而变量的内容不变,同时,使用任何一个函数名操作一个变量,都是操作了值,值的结果可以使用任何一个别名访问。
框架,其实是用程序管理类库的一种方式,采用统一的接口,统一的调用风格进行操作,对于团队合作中代码可读性提供了便利。但框架也有很严重的问题,就是效率。
框架大都采用了单点的入口,然后提供url的路由功能进行解析,另外,类的调用也大都采取__autoload进行寻找,大大降低了程序的效率。
后又看了奶瓶老仙的BSMlite,深有感触。
其实,使用框架完全可以应付中小型项目,至于效率,也可以在完工后进行优化再发布,这样就会达到两全其美的效果。
]]>PHP官方提供了一个编译php为二进制码的工具,Zend,价格昂贵,今天讨论免费的APC。
APC组件下载地址:http://pecl4win.php.net/ext.php/php_apc.dll http://pecl.php.net/package/apc 根据自己的操作系统版本来下载安装。我这里使用的是windows系统,直接把php_apc.dll放在扩展文件路径里,在php.ini里增加extension=php_apc.dll,再查看phpinfo(),可看到apc安装成功的信息。具体配置信息在这里 http://cn2.php.net/manual/en/apc.configuration.php
其中的参数可以设定是否缓存php的编译文件,还有一些常用的限制。
除此之外,还有很多opcode缓存组件,如accelerator,xcache之类,详情可参见这里 http://en.wikipedia.org/wiki/Alternative_PHP_Cache#Alternative_PHP_Cache
]]>
DB.Mysql.Class.php
DB.Mysql.Fact.Class.php
用别人的东西总是有很多的局限,如果去修改,工作量又很大。其实我们使用的也就是那么点功能,这样我们去完成自己的类工作量并不大,而且能根据自己的需求不断改进。
]]>smarty模版
语言包内容
模版代码
调用范例
1:对字段类型的支持不够完全,比如enum类型
2:不支持存储过程触发器之类
而一个项目中,存储过程触发器之类使用很多,没有这些,但出写表的数据字典感觉意义不大,不过简单的表还是会用这种方式,其他的就爹生成sql语句了
]]>下载地址 http://www.sunboyu.cn/sourse/nbcode.rar
]]>首先创建表,注,这里使用了adodb中数据字典的描述方法:
然后session类:
session机制,之前已经介绍,实现代码如下
把session与用户id对应,使用以下语句即可

mysql有三部分的内容,session session_data session_expires分别为session的id session的内容,session的过期时间。
创建这样一个数据库
CREATE TABLE IF NOT EXISTS `sessions` (
`session` varchar(255) character set utf8 collate utf8_bin NOT NULL,
`session_expires` int(10) unsigned NOT NULL default ‘0′,
`session_data` mediumtext collate utf8_unicode_ci,
KEY `session` (`session`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
相对于文件方式的session存储,这两个函数是不用动的
function open($save_path, $session_name)
{
global $sess_save_path;
$sess_save_path = $save_path;
return(true);
}
function close()
{
return(true);
}
而需要修改的是读,写,删,过期操作的函数
读的操作,很简单,只是从数据库中,根据sessionid,读出date字段中的内容
function read($sessID) {
global $php_errormsg;
// fetch session-data
$query = ”
SELECT session_data FROM sessions
WHERE session = ‘$sessID’
AND session_expires >
“.time();
$result = $this->mdb2->query($query);
// return data or an empty string at failure
if (MDB2::isError($result)) {
$php_errormsg .= $result->getMessage();
$php_errormsg .= $result->getDebugInfo ();
return false;
}
list($value)=@$result->fetchrow();
return $value;
}
同理,写的操作就是update数据,destory的操作为删除session的记录,另外有个gc的操作是删除过期的session。
具体的代码没有去实现,但在PHP手册上都有。同时手册还介绍了memcache储存的方式,效率应该会不错的。
这是本月最后一篇日志,也算为下月找个题。
]]>php的session函数非常好用,使用非常简单,$_SESSION[$name] = ** 直接写session,而$_SESSION[$name]就可以直接读session。现在剖析一下简单背后,php是如何工作的。看上边的链接,
bool session_set_save_handler ( callback $open , callback $close , callback $read , callback $write , callback $destroy , callback $gc )
此函数有六个动作,关于session的初始化,结束,读,写,删,和超时处理。
open:初始化session存储路径信息。
close:关闭session。
read:读session的内容
write:写session的内容
destroy:删除session内容
gc:删除过期session
可以看这些函数实现,使用了file操作,在服务端写数据保存session。而这些数据以session专有的格式进行存储,类似cookie的,大家可以试着分解一下。
我找了个session,在editplus下打开 是这样的:
UserID|s:1:”1″;UserName|s:5:”admin”;
]]>基本都配置完毕了,但整体流程没有彻底自动化,适当的时候会作出stable版本。
# author:sunboyu@gmail.com
# qq:176300676 msn:sunboyu@gmail.com
# http://www.sunboyu.cn
#!/bin/sh
h_path = “/root/”
url=”http://www.sunboyu.cn/sourse/”
install_dir=”/opt/”
mkdir $install_dir
termcap_sourse_name=”termcap-1.3.1″
mysql_sourse_name=”mysql-5.0.22″
mysql_install_dir=$install_dir$mysql_sourse_name
openssl_sourse_name=”openssl-0.9.8g”
openssl_install_dir=$install_dir$openssl_sourse_name
httpd_sourse_name=”httpd-2.2.9″
httpd_install_dir=$install_dir$httpd_sourse_name
fastcgi_sourse_name=”mod_fastcgi-2.4.6″
fastcgi_install_dir=$install_dir$fastcgi_sourse_name
fcgid_sourse_name=”mod_fcgid.2.2″
libxml2_sourse_name=”libxml2-2.6.30″
libxml2_install_dir=$install_dir$libxml2_sourse_name
zlib_sourse_name=”zlib-1.2.3″
jpeg_sourse_name=”jpegsrc.v6b”
jpeg_install_dir=$install_dir$jpeg_sourse_name
libpng_sourse_name=”libpng-1.2.29″
libpng_install_dir=$install_dir$libpng_sourse_name
freetype_sourse_name=”freetype-2.3.7″
freetype_install_dir=$install_dir$freetype_sourse_name
php_sourse_name=”php-5.2.6″
php_install_dir=$install_dir$php_sourse_name
gd_sourse_name=”gd-2.0.36RC1″
gd_install_dir=$install_dir$gd_sourse_name
###MYSQL依赖库
wget ${url}${termcap_sourse_name}”.tar.gz”
tar -zxvf $termcap_sourse_name”.tar.gz”
cd $termcap_sourse_name
./configure
make && make install
cd ..
#rm -rf ${termcap_sourse_name}*
###openssl
wget ${url}${openssl_sourse_name}”.tar.gz”
tar -zxvf $openssl_sourse_name”.tar.gz”
cd $openssl_sourse_name
./Configure –prefix=$openssl_install_dir
make && make install
cd ..
#rm -rf ${openssl_sourse_name}*
###libxml
wget ${url}${libxml2_sourse_name}”.tar.gz”
tar -zxvf $libxml2_sourse_name”.tar.gz”
cd $libxml2_sourse_name
./configure –prefix=$libxml2_install_dir
make && make install
cd ..
#rm -rf ${libxml2_sourse_name}*
###zlib
wget ${url}${zlib_sourse_name}”.tar.gz”
tar -zxvf $zlib_sourse_name”.tar.gz”
cd $zlib_sourse_name
./configure
make && make install
cd ..
cp /usr/lib/libz.so.1 /usr/lib/libz.so
#rm -rf ${zlib_sourse_name}*
###jpeg
wget ${url}${jpeg_sourse_name}”.tar.gz”
tar -zxvf $jpeg_sourse_name”.tar.gz”
cd jpeg-6b
./configure
mkdir /usr/local/man/
mkdir /usr/local/man/man1/
mkdir /usr/local/man/man1/cjpeg/
make && make install
cp /usr/lib/libjpeg.so.62 /usr/lib/libjpeg.so
cp jpeglib.h /usr/include/jpeglib.h
cp jconfig.h /usr/include/jconfig.h
cp jmorecfg.h /usr/include/jmorecfg.h
cp jerror.h /usr/include/jerror.h
cd ..
#rm -rf ${jpeg_sourse_name}.tar.gz
#rm -rf jpeg-6b
###png
wget ${url}${libpng_sourse_name}”.tar.gz”
tar -zxvf $libpng_sourse_name”.tar.gz”
cd $libpng_sourse_name
./configure –prefix=$libpng_install_dir
make && make install
cp png* /usr/include/
cd ..
#rm -rf ${libpng_sourse_name}*
###freetype
wget ${url}${freetype_sourse_name}”.tar.gz”
tar -zxvf $freetype_sourse_name”.tar.gz”
cd $freetype_sourse_name
./configure –prefix=$freetype_install_dir
make && make install
cd ..
#rm -rf ${freetype_sourse_name}*
###GD2
wget ${url}${gd_sourse_name}”.tar.gz”
tar -zxvf $gd_sourse_name”.tar.gz”
cd $gd_sourse_name
./configure –prefix=$gd_install_dir –with-png=/opt/libpng-1.2.29 –with-freetype=/opt/freetype-2.3.7 –with-jpeg=/usr/lib/libjpeg.so
make && make install
cd ..
#rm -rf ${gd_sourse_name}*
###MYSQL
groupadd mysql
useradd -g mysql mysql
wget ${url}${mysql_sourse_name}”.tar.gz”
tar -zxvf $mysql_sourse_name”.tar.gz”
cd $mysql_sourse_name
./configure –prefix=$mysql_install_dir –without-debug –with-unix-socket-path=/tmp/mysql.sock –with-client-ldflags=-all-static –with-mysqld-ldflags=-all-static –enable-local-infile –enable-largefile –with-charset=utf8 –with-pic –with-mysqld-libs –with-comment –with-query-cache –with-bench –with-big-tables –with-innodb –with-mysqld-use=mysql
make && make install
cp ./support-files/my-medium.cnf /etc/my.cnf
cp ./support-files/mysql.server /etc/init.d/mysqld
cd ..
#mkdir $mysql_install_dir/var/
#$mysql_install_dir/bin/mysql_install_db –user=mysql &
#$mysql_install_dir/bin/mysqld_safe –user=mysql &
echo ${mysql_install_dir}”/bin/mysqld_safe –user=mysql &”>>/etc/rc.local
#rm -rf ${mysql_sourse_name}*
###APACHE
wget ${url}${httpd_sourse_name}”.tar.gz”
tar -zxvf $httpd_sourse_name”.tar.gz”
cd $httpd_sourse_name
./configure –prefix=$httpd_install_dir –enable-authz-dbm –enable-log-config –enable-headers –enable-setenvif –with-ssl=$openssl_install_dir –enable-static-ab –enable-http –enable-mime –enable-status –enable-suexec –enable-vhost-alias –enable-dir –enable-rewrite –with-mpm=worker
make && make install
cd ..
ln -s $httpd_install_dir/bin/apachectl /etc/init.d/httpd
echo $httpd_install_dir/bin/apachectl start>>/etc/rc.local
chkconfig –level 345 httpd on
#rm -rf ${httpd_sourse_name}*
###fastcgi
wget ${url}${fastcgi_sourse_name}”.tar.gz”
tar -zxvf $fastcgi_sourse_name”.tar.gz”
cd $fastcgi_sourse_name
sed ’s/\/usr\/local\/apache2/\/opt\/httpd-2.2.9\//g’ Makefile.AP2 > Makefile
make && make install
cd ..
###fcgid
wget ${url}${fcgid_sourse_name}”.tgz”
tar -zxvf $fcgid_sourse_name”.tgz”
cd $fcgid_sourse_name
mv Makefile Makefile.AP2
sed ’s/\/usr\/local\/apache2/\/opt\/httpd-2.2.9\//g’ Makefile.AP2 > Makefile
make && make install
cd ..
echo LoadModule fcgid_module modules/mod_fcgid.so>>$httpd_install_dir/conf/httpd.conf
echo AddHandler fcgid-script .php>>$httpd_install_dir/conf/httpd.conf
echo “FCGIWrapper “${php_install_dir}”/bin/php-cgi .php”>>$httpd_install_dir/conf/httpd.conf
#rm -rf ${fastcgi_sourse_name}*
###PHP
wget ${url}${php_sourse_name}”.tar.gz”
tar -zxvf $php_sourse_name”.tar.gz”
cd $php_sourse_name
cp php.ini-dist php.ini
./configure –prefix=$php_install_dir –with-libxml-dir=$libxml2_install_dir –enable-cli –enable-cgi –enable-fastcgi –enable-force-cgi-redirect –enable-discard-path –enable-path-info-check –with-openssl –with-pcre-regex –enable-calendar –enable-dom –enable-ftp –with-openssl-dir=/usr/local/ssl –enable-gd-jis-conv –enable-hash –with-iconv –enable-json –enable-mbstring –enable-mbregex –enable-pdo –enable-posix –enable-libxml=$xml2_install_dir –enable-simplexml –with-sqlite –enable-tokenizer –enable-xmlreader –enable-xmlwriter –with-zlib –with-freetype-dir=$freetype_install_dir –with-gd=$gd_install_dir –with-jpeg-dir=/usr/lib/libjpeg.so –with-libpng-dir=/opt/libpng-1.2.29/lib/libpng12.so –with-zlib-dir=/usr/lib/libz.so –with-mime-magic –with-mysql=$mysql_install_dir –with-zlib-dir=/usr/lib/libz.so –with-pdo-mysql=$mysql_install_dir –with-pdo-sqlite –enable-posix –enable-soap
make && make install
cp php.ini $php_install_dir/lib/
cd ..
$mysql_install_dir/bin/mysql_install_db –user=mysql &
service httpd start
service mysqld start
LoadModule fcgid_module modules/mod_fcgid.so
AddHandler fcgid-script .php
FCGIWrapper /opt/php5/bin/php-cgi .php
#!/bin/sh
h_path = “/root/”
url=”http://www.sunboyu.cn/sourse/”
install_dir=”/opt/”
mkdir $install_dir
termcap_sourse_name=”termcap-1.3.1″
mysql_sourse_name=”mysql-5.0.22″
mysql_install_dir=$install_dir$mysql_sourse_name
openssl_sourse_name=”openssl-0.9.8g”
openssl_install_dir=$install_dir$openssl_sourse_name
httpd_sourse_name=”httpd-2.2.9″
httpd_install_dir=$install_dir$httpd_sourse_name
fastcgi_sourse_name=”mod_fastcgi-2.4.6″
fastcgi_install_dir=$install_dir$fastcgi_sourse_name
libxml2_sourse_name=”libxml2-2.6.30″
libxml2_install_dir=$install_dir$libxml2_sourse_name
zlib_sourse_name=”zlib-1.2.3″
zlib_install_dir=$install_dir$zlib_sourse_name
jpeg_sourse_name=”jpegsrc.v6b”
jpeg_install_dir=$install_dir$jpeg_sourse_name
libpng_sourse_name=”libpng-1.2.29″
libpng_install_dir=$install_dir$libpng_sourse_name
freetype_sourse_name=”freetype-2.3.7″
freetype_install_dir=$install_dir$freetype_sourse_name
php_sourse_name=”php-5.2.6″
php_install_dir=$install_dir$php_sourse_name
###MYSQL
wget ${url}${termcap_sourse_name}”.tar.gz”
tar -zxvf $termcap_sourse_name”.tar.gz”
cd $termcap_sourse_name
./configure
make && make install
cd ..
rm -rf ${termcap_sourse_name}*
groupadd mysql
useradd -g mysql mysql
wget ${url}${mysql_sourse_name}”.tar.gz”
tar -zxvf $mysql_sourse_name”.tar.gz”
cd $mysql_sourse_name
./configure –prefix=$mysql_install_dir –enable-thread-safe-client –enable-local-infile –enable-largefile –with-charset=utf8 –with-uca –with-gnu-ld –with-pic –with-mysqld-libs –with-comment –with-query-cache –with-bench –with-big-tables –with-innodb –with-mysqld-use=mysql
make && make install
cd ..
rm -rf ${mysql_sourse_name}*
###APACHE
wget ${url}${openssl_sourse_name}”.tar.gz”
tar -zxvf $openssl_sourse_name”.tar.gz”
cd $openssl_sourse_name
./configure –prefix=$openssl_install_dir
make && make install
cd ..
rm -rf ${openssl_sourse_name}*
wget ${url}${httpd_sourse_name}”.tar.gz”
tar -zxvf $httpd_sourse_name”.tar.gz”
cd $httpd_sourse_name
./configure –prefix=$httpd_install_dir –enable-authz-dbm –enable-log-config –enable-headers –enable-setenvif –with-ssl=$openssl_install_dir –enable-static-ab –enable-http –enable-mime –enable-status –enable-suexec –enable-vhost-alias –enable-dir –enable-rewrite –with-mpm=worker
make && make install
cd ..
rm -rf ${httpd_sourse_name}*
wget ${url}${fastcgi_sourse_name}”.tar.gz”
tar -zxvf $fastcgi_sourse_name”.tar.gz”
cd $fastcgi_sourse_name
sed ’s/\/usr\/local\/apache2/\/opt\/httpd-2.2.9\//g’ Makefile.AP2 > Makefile
make && make install
cd ..
rm -rf ${fastcgi_sourse_name}*
###PHP
wget ${url}${libxml2_sourse_name}”.tar.gz”
tar -zxvf $libxml2_sourse_name”.tar.gz”
cd $libxml2_sourse_name
./configure –prefix=$libxml2_install_dir
make && make install
cd ..
rm -rf ${libxml2_sourse_name}*
wget ${url}${zlib_sourse_name}”.tar.gz”
tar -zxvf $zlib_sourse_name”.tar.gz”
cd $zlib_sourse_name
./configure –prefix=$zlib_install_dir
make && make install
cd ..
rm -rf ${zlib_sourse_name}*
wget ${url}${jpeg_sourse_name}”.tar.gz”
tar -zxvf $jpeg_sourse_name”.tar.gz”
cd $jpeg_sourse_name
cp makefile.unix Makefile
make && make install
cd ..
rm -rf ${jpeg_sourse_name}*
wget ${url}${libpng_sourse_name}”.tar.gz”
tar -zxvf $libpng_sourse_name”.tar.gz”
cd $libpng_sourse_name
./configure –prefix=$libpng_install_dir
make && make install
cd ..
rm -rf ${libpng_sourse_name}*
wget ${url}${freetype_sourse_name}”.tar.gz”
tar -zxvf $freetype_sourse_name”.tar.gz”
cd $freetype_sourse_name
./configure –prefix=$freetype_install_dir
make && make install
cd ..
rm -rf ${freetype_sourse_name}*
wget ${url}${php_sourse_name}”.tar.gz”
tar -zxvf $php_sourse_name”.tar.gz”
./php-5.2.6/configure –enable-cli –enable-cgi –enable-fastcgi –enable-force-cgi-redirect –enable-discard-path –enable-path-info-check –with-openssl –with-pcre-regex –enable-calendar –enable-dom –enable-ftp –with-openssl-dir=/usr/local/openssl –enable-gd-jis-conv –enable-hash –with-iconv –enable-json –enable-mbstring –enable-mbregex –enable-pdo –enable-posix –enable-libxml –enable-simplexml –with-sqlite –enable-tokenizer –enable-xmlreader –enable-xmlwriter –with-zlib=/usr/local/zlib –with-freetype-dir=/usr/local/freetype –with-gd –with-jpeg-dir=/usr/lib/libjpeg.so.62.0.0
先安装openssl
./configure –enable-authz-dbm –enable-log-config –enable-headers –enable-setenvif –with-ssl=/usr/local/ssl –enable-static-ab –enable-http –enable-mime –enable-status –enable-suexec –enable-vhost-alias –enable-dir –enable-rewrite –with-mpm=worker
fastcgi
cp Makefile.AP2 Makefile
make make install
mysql 编译参数
./configure –enable-thread-safe-client –enable-local-infile –enable-largefile –with-charset=utf8 –with-uca –with-gnu-ld –with-pic –with-mysqld-libs –with-comment –with-query-cache –with-bench –with-big-tables –with-innodb –with-mysqld-use=mysql
/usr/local/bin/mysql_install_db
/usr/local/bin/mysqld_safe –user mysql
如果安装时候有错误提示,也许是缺少这个组件 http://www.sunboyu.cn/sourse/termcap-1.3.1.tar.gz
]]>memcached http://www.danga.com/memcached/dist/memcached-1.2.5.tar.gz
memcache http://pecl.php.net/get/memcache-3.0.1.tgz
libevent http://www.monkey.org/~provos/libevent-1.2a.tar.gz
目前想到的功能大概有这些,想到再加。
目前正在研究每一个组件的性能和参数。
]]>这两条是程序有硬伤的时候,直接报出来。如果逻辑上的错误,咋调呢?我的方法比较奔,但的确有效。
这是程序差错的方法。mysql就更简单了,把你认为有错误的sql语句echo出来,放到phpmyadmin里去执行,看那个报错就行了。
最后一点:下载个星际译王,当然是指英文不太利索的。
]]>首先,要设计多个语言包,打个比方,一个cn的,代表汉语,一个en的,代表英语。然后建立一个映射关系。比如,helloword,你好世界,英文,中文,我们给这个短句定一个ID,ID=’HW’,在英文语言包里,HW=’helloword’,在汉语语言包里,HW=’你好世界’。以此类推,语言包就做好了。
然后,我们要确定当前页面是调用哪个语言包。可以由读者去确定,比如,默认是英文,然后用户可以手工设置为汉语。可以通过session来设定一个变量,进行控制,但大多数是通过cookie。也可以根据域名,比如 http://cn.sunboyu.cn ,解析主机名,cn 即为汉语。 得到了客户端语言的标志,我们就可以确定调用哪个语言包。
最后说一下实现机制。最简单的方式,就是定义成数据,比如 $Lang['cn']['HW']=’你好世界’ $Lang['en']['HW'] ,这样,通过数据二级的键值就可以取出值。Smarty支持一个功能,就是config_load的功能,只要模板里有个语言种类变量,就可以动态调用语言包。还有,就是php的gettext扩展,都是一样的道理,只是存储不同。
做好你的语言包,做好语言选择控制,多语言网站就可以出炉了。
]]>产品化,即一个项目可以轻松复制,交付给不同用户。
产品化的软件一个关键是不是可以轻松迁移,而轻松迁移就取决于迁移需要修改的参数接口是不是更加灵活。这在于我们在设计产品之前有没有合理开发一些关键参数,进行迁移。
在这个层面上说的分层,可理解为软件主题跟用户接口的分层。我们把软件-接口=开发者-用户这样的结构理解为两层。
程序层面上的分层,看此篇 PHP工厂方式的三层结构
另一个产品化的标识,就是方便修改,主要是风格方面。因此,在程序前端部分,需要合理设计我们的VIEW层代码。
VIEW层分层,主要是分成HTML(DIV)+CSS,CSS决定页面的风格,这样,只要重新CSS就能快速修改页面风格。
JS分层。如果是试用标准的xhtml标准或者DOM格式的代码,那可以方便得把事件和函数写在附加的js文件中。
]]>感谢PHP开源支持者的鼓励,感谢杜江老师的鼓励。mysqldump v1.0 demo 下载 版权所有,欢迎盗版!
源代码
#!/usr/local/bin/php -q
# mysql cron manager system
# sunboyu@gmail.com
# v1.0
define(’SUN_FILE_NAME’,'bak.sh’);
define(’SUN_BAK_PATH’,’./’); #bak path
define(’SUN_CFG_PATH’,’./’); #config file path
define(’SUN_LOG_PATH’,’./’); #log file path
define(’SUN_DATABASE_CHARACTER’,'UTF-8′); #mysql character
define(’SUN_SHELL_EXEC’,”system”);
define(’SUN_IS_TAR’,0);
#save temp argv in session
session_start();
Main::mains();
class Main
{
//main()
public static function mains()
{
KernelInfo::version();
self::getUserInput();
}
//for user’s inpyt
public function getUserInput()
{
while(($u_char = KernelBase::cgetchar(’shell’))&&($u_char != ‘quit’))
{
switch($u_char)
{
case “–help”:
KernelInfo::help();
break;
case “–version”:
KernelInfo::version();
break;
case “–check”:
KernelInfo::checksystem();
break;
case “–mysqldump”:
Mysql::MysqlGuide();
break;
default:
print(”error input!\n”);
break;
}
}
}
}
class KernelBase
{
//get input string
public function cgetchar( $cue = false )
{
if( $cue )
{
print($cue.”:”);
}
$string = trim(fgets(STDIN));
return $string;
}
//get argvs
public function cgetargv( $string )
{
if(!empty($string))
{
$argvs = explode( ” ” , $string );
$reargvs = false;
for( $i = 0; $i < count($argvs) ; $i++ )
{
if( $argvs[$i][0]==’-’ && $argvs[$i][1]==’-’ )
{
$reargvs[$argvs[$i]] = true;
$x++;
}
else if( $argvs[$i][0]==’-’ && $argvs[$i][1]!=’-’ )
{
$reargvs[$argvs[$i]] = isset($argvs[($i+1)])&&($argvs[($i+1)][0]!=’-')&&($argvs[($i+1)][0]!=”) ? $argvs[($i+1)] : ”;
isset($argvs[($i+1)])&&($argvs[($i+1)][0]!=’-')&&($argvs[($i+1)][0]!=”) ? $i++ : ”;
}
}
return $reargvs;
}
else
{
return false;
}
}
}
class KernelIO
{
//write file
public function write_file( $filename , $content )
{
$handle = fopen( $filename );
fwrite( $handle , $content );
fclose( $handle );
}
}
class KernelInfo
{
//show version
public function version()
{
print(”##################################\n”);
print(”# Mysql Back Cron Manage Shell #\n”);
print(”# Auth: sunboyu #\n”);
print(”# Version: v1.0 #\n”);
print(”##################################\n”);
}
//show help
public function help()
{
print(sprintf(”%s [--version] [--help] [--check]\n”,SUN_FILE_NAME));
print(” –version Show\n”);
print(” –help This Help\n”);
print(” –check This Help\n”);
}
//check system info
public function checksystem()
{
print(”System:”.$_GLOBAL['System'].”\n”);
$check_dir = array( SUN_BAK_PATH , SUN_CFG_PATH , SUN_LOG_PATH );
foreach($check_dir as $key => $value)
{
if(is_writable($value))
{
print(”The dir ‘”.$value.”‘ is writable!\n”);
}
else
{
print(”The dir ‘”.$value.”‘ is unwritable.Please check the power!\n”);
print(”The shell is stop!”);
exit();
}
}
$shell_exec = SUN_SHELL_EXEC;
if($shell_exec(’ls’))
{
print(”The shell can execute “.SUN_SHELL_EXEC.”;\n”);
}
else
{
print(”The shell can’t execute “.SUN_SHELL_EXEC.”;\n”);
print(”The shell is stop!”);
exit();
}
print(”The Shell can work in this system!\n”);
}
//check is writeable the dir
public function is_writeable( $dir )
{
return @is_writable( $dir );
}
}
#Mysql Dump
class Mysql
{
function MysqlGuide()
{
$mysqlargv = array(
‘-host’ => false,
‘-username’ => false,
‘-password’ => false,
‘-datebase’ => false,
‘-otherargv’ => false
);
$argvs = KernelBase::cgetargv(KernelBase::cgetchar(”input argv”));
foreach($argvs as $key => $value)
{
$mysqlargv[$key] = empty($value) ? ” : $value;
}
if($mysqlargv['-host']&&$mysqlargv['-username']&&$mysqlargv['-datebase'])
{
self::Mysqldump( $mysqlargv['-host'] , $mysqlargv['-username'] , $mysqlargv['-password'] , $mysqlargv['-datebase'] , $mysqlargv['-otherargv'] );
}
else
{
print(”error vars!\n”);
}
}
function Mysqldump( $host = false , $username = false , $password = ” , $datebase = false , $otherargv = false )
{
$shell_exec = SUN_SHELL_EXEC;
if($host&&$username&&$datebase)
{
$command = “mysqldump –opt “.$datebase.” -u”.$datebase.” -p”.$db_password.( $otherargv ? $otherargv : ” ).” > “.SUN_BAK_PATH.”db_bak.sql”;
$feedback = $shell_exec( $command );
print($feedback.”\n”);
}
}
}
?>
]]>基本能满足一个网管备份mysql的日常操作。
由于是第一个版本,没做太多的功能,实现再说。
这个东东也是展示下PHP功能的强大。PHP代替Perl也不是不可能的。
]]>先创建文件 a.php
<?php
$a = “test”;
?>
再创建 b.php
<?php
function a()
{
require_once(”a.php”);
echo $a;
echo “-”;
}
function b()
{
require_once(”a.php”);
echo $a;
echo “-”;
}
a();
b();
?>
运行结果是 test–
然后修改为
<?php
function a()
{
require(”a.php”);
echo $a;
echo “-”;
}
function b()
{
require(”a.php”);
echo $a;
echo “-”;
}
a();
b();
?>
则执行结果是 test-test-
—————————————
结论:require_once这个动作,加载一次是相对于一个页面,在函数a中包含一次,a.php中变量$a的作用域只是函数a()的内部,而无法在b()中使用,而b()虽然require_once(’a.php’),但由于页面中a()中先包含了一次,而在b()中却不再执行包含操作。
因此,当两个函数内部都需要使用调用页面的变量时,要不调用在函数外,global的方式调用,或者使用require()多次调用。
不错推荐第一种方式
]]>此函数有4个参数,myErrorHandler($errno, $errstr, $errfile, $errline),$error-错误号,$errstr-错误描述,$errfile-错误文件,$errline-出错的行号。
用此方法,可以捕捉并记录详细的错误信息,可以根据项目需求进行错误级别评定。
WordPress的报错声明
// Add define(’WP_DEBUG’,true); to wp-config.php to enable display of notices during development.
if (defined(’WP_DEBUG’) and WP_DEBUG == true) {
error_reporting(E_ALL);
} else {
error_reporting(E_ALL ^ E_NOTICE ^ E_USER_NOTICE);
}
插件的报错
error_reporting( E_ALL ^ E_NOTICE );
升级程序的报错
error_reporting( E_ALL ^ E_NOTICE );
网站基本是传统的机构,数据库,web,在这里,我们只讨论web中程序的结构。
子类:子类是所有跟程序之外对象进行交互的类,包括跟数据库,磁盘存储,xml等的处理。子类有个特征,就是可以迁移到任意的项目中进行复用,也就是整个项目中最底层的一些操作。
工厂方法:工厂方法就是使用子类提供的功能进行整合,构造出能够满足一些业务具体功能的方法。
业务处理:业务处理主要是UI部分,根据用户的请求来选择合适的工厂方法,把工厂方法的返回产品数据输出给用户。
]]>为了尽量使程序兼容,我们对每个变量的有效性进行严格判断。
我一般使用 isset($a) ? $a : ”;这种方式对变量进行判断,如果变量不存在的话初始化变量。
当然在其他的地方也可以使用该方法检验变量有效性。
底下是大部分进行验证的函数。
检测变量状态: isset() empty()
检测变量类型 is_array() is_double() is_float() is_real() is_long() is_int() is_integer() is_string() is_object()
具体使用可以查下手册
PHP并不比C或者其他语言差,关键在于你编程的态度.
]]>