Tag Archives: PHP

手机之家的架构分享

在上周日奇遇花园咖啡馆举办的 Beta 技术沙龙上,手机之家高春辉和他的战友们带来了他们网站技术架构与大家分享。

之前就手机之家的架构采访过老高,这次是来了图文并茂版了。希望过几天能有个视频的 :) 读了 PPT 之后,比较感兴趣的是关于 Cache 的处理:

…对数据库记录的缓存的访问做了一定的抽象处理,开发出了Cache 处理器。所有的数据访问都经过cache处理器。这样,系统代替程序员接管了缓存的存取访问。缓存的KEY和VALUE由系统处理,从而避免了冲突和混乱。Cache 处理器的引入减少了40%的数据访问层代码!最重要的是,我们采用了Namespace的方法使得缓存能自动清除了。

Arch_Cache_imobile.png

因为身在杭州,不能分身参加。不过第一时间从老高那里要来了 PPT。共享一下。

最后(最重要的是),手机之家还在招聘 PHP/Java 人手,有意者给老高发邮件: [email protected]

EOF

PHP 中执行排序与 MySQL 中排序

此文首发在 InfoQ 中文站作者:明灵(dragon) , Fenng . Note:要转载的朋友请注意注明这篇文章的第一作者!
这篇文章是dragon 朋友来邮探讨后他做的一个总结。在 DB 中排序还是在 应用程序中排序是个很有趣的话题,dragon 第一份邮件中其实已经总结的很好了,我添加了一点建议而已。现在放上来,与大家共享。这篇文章也投稿到了 InfoQ 中文站

Q:列出在 PHP 中执行排序要优于在 MYSQL 中排序的原因?给一些必须在MYSQL中排序的实例?

A:通常来说,执行效率需要考虑 CPU、内存和硬盘等的负载情况,假定 MYSQL 服务器和 PHP 的服务器都已经按照最适合的方式来配置,那么系统的可伸缩性(Scalability)和用户感知性能(User-perceived Performance)是我们追求的主要目标。在实际运行中,MYSQL 中数据往往以 HASH tables、BTREE 等方式存贮于内存,操作速度很快;同时 INDEX 已经进行了一些预排序;很多应用中,MYSQL 排序是首选。而在应用层(PHP)中排序,也必然在内存中进行,与 MYSQL 相比具有如下优势:

  • 1、 考虑整个网站的可伸缩性和整体性能,在应用层(PHP)中排序明显会降低数据库的负载,从而提升整个网站的扩展能力。而数据库的排序,实际上成本是非常高的,消耗内存、CPU,如果并发的排序很多,DB 很容易到瓶颈。
  • 2、 如果在应用层(PHP)和MYSQL之间还存在数据中间层,合理利用,PHP会有更好的收益。
  • 3、 PHP在内存中的数据结构专门针对具体应用来设计,比数据库更为简洁、高效;
  • 4、 PHP不用考虑数据灾难恢复问题,可以减少这部分的操作损耗;
  • 5、 PHP不存在表的锁定问题;
  • 6、 MYSQL中排序,请求和结果返回还需要通过网络连接来进行,而PHP中排序之后就可以直接返回了,减少了网络IO。

至于执行速度,差异应该不会很大,除非应用设计有问题,造成大量不必要的网络IO。另外,应用层要注意PHP 的 Cache 设置,如果超出会报告内部错误;此时要根据应用做好评估,或者调整Cache。具体选择,将取决于具体的应用。

列出一些 PHP 中执行排序更优的情况:

  • 1、 数据源不在 MYSQL 中,存在硬盘、内存或者来自网络的请求等;
  • 2、 数据存在 MYSQL 中,量不大,而且没有相应的索引,此时把数据取出来用PHP排序更快;
  • 3、 数据源来自于多个 MYSQL 服务器,此时从多个 MYSQL 中取出数据,然后在PHP中排序更快;
  • 4、 除了 MYSQL 之外,存在其他数据源,比如硬盘、内存或者来自网络的请求等,此时不适合把这些数据存入 MYSQL 后再排序;

列出一些必须在 MYSQL 中排序的实例:

  • 1、 MYSQL 中已经存在这个排序的索引;
  • 2、 MYSQL 中数据量较大,而结果集需要其中很小的一个子集;比如 1000000 行数据,取TOP 10;
  • 3、 对于一次排序、多次调用的情况,比如统计聚合的情形,可以提供给不同的服务使用,那么在 MYSQL 中排序是首选的。另外,对于数据深度挖掘,通常做法是在应用层做完排序等复杂操作,把结果存入MYSQL即可,便于多次使用。
  • 4、 不论数据源来自哪里,当数据量大到一定的规模后,由于占用内存/Cache 的关系,不再适合 PHP 中排序了;此时把数据复制、导入或者存在 MYSQL ,并用 INDEX 优化,是优于 PHP 的。不过,用 Java,甚至 C++ 来处理这类操作会更好。 [有些类似大数据集聚合或者汇总的数据,在客户端排序得不偿失。当然,也有用类似搜索引擎的思路来解决类似应用的情况。]

从网站整体考虑,就必须加入人力和成本的考虑。假如网站规模和负载较小,而人力有限(人数和能力都可能有限),此时在应用层(PHP)做排序要做不少开发和调试工作,耗费时间,得不偿失;不如在 DB 中处理,简单快速。对于大规模的网站,电力、服务器的费用很高,在系统架构上精打细算,可以节约大量的费用,是公司持续发展之必要;此时如果能在应用层(PHP) 进行排序并满足业务需求,尽量在应用层进行。

EOF

Discuz! 优化的误区

很多 Discuz! 的用户在论坛规模达到一定程度上,就要经常性的考虑优化的问题。现在网络上的很多热心的技术人都分享了 Discuz! 的优化经验,应该说,很多经验还是不错的,但也有的帖子可能会让用户走入误区。

误区一:SQL 慢,加索引

多数情况下,数据库可能是瓶颈。通过 Slow Query Log 发现执行时间比较长的 SQL 并不难,于是有的人一看 SQL 走了全表扫描,干脆添加个索引好了。

其实这个地方值得商榷的。第一,必须确定一下该 SQL 执行次数到底是怎样的? 执行真的很频繁? 那么对应的页面是否通过 Cache 可以减少对 DB 的冲击? 如果可以,尽量不要添加索引,索引本身对表的负面影响也是很大的,比如降低更新速度,影响并发能力等。

误区二:瓶颈一定在数据库上

前面说,数据库”可能”是瓶颈,但不总是瓶颈,优化的第一步,必需要有针对瓶颈优化。很多时候,图片访问带来的压力甚至比数据库压力还大 — 有的用户数据库、用户上传的图片文件、Web 服务器都扔到一台服务器上,这时候,第一手去调整 MySQL 或许会有作用,但价值不大。

应该说,瓶颈的有效定位的确是个技术活儿,对于一个新的论坛环境,也有人用逐一尝试法来做,这倒也没什么。

误区四:盲目的静态编译 MySQL

静态编译 MySQL 有好处,但如果系统已经在线上运行了,在原有环境中进行静态编译未必能带来多大好处。我问过一些朋友,静态编译到底带来多大好处? 没有几个人能说清楚。

对于 PHP 也是这样,如果一次优化从其它方式上能带来更清晰、直接的开销,就不要重新编译

误区五:反复尝试,但不建立基准数据

这其实是第四点的延伸。而建立基准数据,实在应该是优化的最基本的步骤。这样才能有效的评估优化的效果。否则的话,象误区一描述的,添加了一个索引,短期内可能感觉快了,长期看,性能可能又会慢下来。

误区六:一次进行多个优化步骤

这可能是比较普遍的”习惯”了,有的朋友喜欢一次调整多个参数或是多个环境的设置,然后观察效果。如果每个步骤都是”对”的话,那么效果看起来是好的。如果有的步骤调节”错”的话,可能会抵消那些有效果的优化步骤。

优化策略是个见仁见智的问题。以上只是个人浅见,欢迎留言探讨。

EOF

此文作者:, 位于 Web 分类 标签: , on .
转载须以超链接形式标明文章原始出处和作者信息及版权声明.

招聘:创业团队找 PHPer

我们将基于千万级的用户群基础开发一个互联网网站平台,前所未有,不同以往,寻求开发高手加盟。

开发语言以 PHP 为主,数据库 MySQL,搜索用 Lucene 实现。

您将在以下环境下工作:

1、一个完全自行开发的高度定制 Full Stack PHP 框架,单一入口方式,全面支持分布式部署的多层架构方案。开发简单,安全高效;

2、开发环境与生产环境完全基于 Slackware Linux,软件版本更新与时俱进,高度定制编译优化,大致列举如下:

  • Nginx 0.7.3
  • PHP 5.2.6
  • MySQL 5.1.25
  • jQuery 1.2.6
  • Xcache 1.2.2
  • Memcached 1.2.5
  • ImageMagick 6.4.2-0
  • Varnish 2.0.0 tech preview 1
  • Lucene 2.3.2

等等,不再列举;

3、一个基于 Lucene 实现的可应付高并发请求的搜索框架,集成简单,伸缩性好。

4、高度注重对前端体验的优化,并在框架内实现了透明化的优化处理;

5、注重任何细节,为了减少 1ms 的程序执行时间,或者为了减少哪怕一个 http 请求,我们可以研究一整天,一直到认为最优化为止;

注:我们认为的典型页面请求的合理执行时间为 20ms 以内;

6、对框架和整体代码进行不断的 review,以理论上的的安全和高效执行的标准来严格要求,多一分不行,少一分也不可;

7、注重国内外技术趋势,乐于参加各种业内聚会。第一期上线后,我们也会总结我们的经验教训,与大家共分享。

目前进展

  • 1、第一期功能需求的开发工作即将完成,只要通过最终的代码检查和上线测试,即可上线;
  • 2、在整体框架下实现的前端体验,不需要任何特殊处理,任何页面均可达到 YSlow 的 95-99 分以上的评价;
  • 3、目前正在为各个功能的跨 PC、手持设备的浏览器页面自适应,绞尽脑汁中。

如果您想加入团队,您需要有以下资格:

  • 1、熟悉 Linux 下的 PHP5 + MySQL5 的开发,对面向对象、三层结构开发方式有深刻的理解;
  • 2、逻辑思维能力清晰,有良好的自我管理能力和团队工作心态,乐于沟通、分享和共同成长;
  • 3、有 XHTML+CSS+Javascript 前端能力者更佳。有 Java、C 或者开源软件开发经验者更佳。

如何认定资格?

  • 1、无任何学历限制,通过我们的面试即可。

薪酬待遇

  • 1、以斐波纳契数列中第六个数字为起点。

有兴趣者,请发您的简历与 zhanghe4(at)163.com 联系。

工作地点:北京东北三环。


以上是代朋友发的招聘信息(如果有笔误是我的事儿)。另外,杭州本地也在帮其它朋友找 PHPer ,有兴趣可以联系我。