php+mysql+memcache实战型技术测试(答案公布)

标签: 默认分类 | 发表时间:2010-01-08 19:37 | 作者:caoz 逆风迎上
出处:http://hi.baidu.com/caoz

出两个变态的题目,题目很变态,但是都是实战中遇到的真实案例,

1:我写一个程序,既要使用mysql也要使用memcache,

第一行是 mysql_connect,第二行是memcache_connect

换过来写,第一行是memcache_connect,第二行是mysql_connect

caoz发现实践中这两种写法有很大的区别,区别在哪里?

2:我写一个程序,使用了mysql,生成了一个页面最后用 echo $html; 输出

一种写法是

mysql_close();

echo $html;

另一种是

echo $html;

mysql_close();

caoz发现实践中这两种区别很大,区别在哪里?

两个全是实践中发现并调整的案例。

---------------------------------------------半夜黑眼圈更新博客的分割线--------------------------------

caoz写程序不是追求BT的人,caoz经常和工程师强调,不追求极端的技术体现或者技术炫耀,所以,如果读者认为这里的题目是为了所谓的诸如某个写法比某个写法资源开销小一点或者其他什么,那么这真不是caoz的本意。

这两道题都是真实运营环境中遇到的典型案例,典型在哪里呢?就是当你遇到一个系统故障的时候,你怎么分析,怎么思考,怎么判断多种关联因素的影响,所以这个题目答出答不出并不重要,重要的是怎么思考系统彼此的关系。

一个典型的系统故障是, mysql 连接过多,或者说too many connections,这个问题困扰了我们很久,如果这是因为索引导致的,或者因为数据并发请求导致的,定位到原因并不复杂,但是当上述问题解决后,诡异的现象发生了,数据库几乎没有压力,没有阻塞进程,没有慢查询,但是mysql连接很多,而且都是sleep连接。此时,webserver的链接也很多,换句话说,因为php执行阻塞,导致mysql链接无法迅速释放,那么,php为什么会阻塞? 逐个断点分析发现,原来echo耽误了最多时间。

这个事情让caoz涨了点经验,之前从来不会认为echo是一个时间阻塞点(如果你在本机测试,你会认为其时间延迟几乎是0),但是实例跟踪发现,echo实际上在我们的工作环境中,代表的网络传输的过程,换言之,会因为路由,带宽的因素而等待,而此时,mysql的链接还在那里没有释放,是的,看到题目每个人都会想到,mysql_close要放在echo后面,但是为什么echo会耽误时间,很少人会想到。当然,这个也与工作环境有关,caoz只知道我们配置的webserver会有这种情况,是不是存在其他的配置模式,caoz没有实测,不敢乱说,但是这里的经验是,mysql_close放到echo前面,大量的sleep链接会迅速减少。

echo并不耗费太多系统资源,但是会等待网络传输,在高并发的网络环境下,注意这一点对数据库很有好处。

这个问题解决后,mysql健康了很多,但是偶然还会出现链接过多的问题,又困扰了很久,直到有一天,根据用户反馈的一些错误信息,发现memcached服务器有不稳定因素,原来是memcached流量过高产生阻塞,php进程等待链接,导致mysql链接大量等待,这是第一个题目的由来,其实这个题目本身没有标准答案,但是应该有一个意识,当你在一个脚本中同时启动A,B两个链接,那么如果你不能保证这两个链接是必然可靠的(通常是无法保障的),那么后者一旦阻塞,就会导致前者大量链接等待,而前者阻塞,通常不会影响后者。所以,这个答案取决于,哪个链接对你的应用更重要,以及哪个链接有更大的并发支撑性。

两道题说到底就是一个意思,当遇到系统问题和故障的时候,多想想一些关联的因素影响,多思考整个架构响应先后过程的逻辑,数据库连接过多,不一定是数据库造成的,web链接过多,也不一定非要去优化webserver,关联因素可能才是根源,解决了根源,表象才会彻底解决。


类别:默认分类 查看评论

相关 [php mysql memcache] 推荐:

php+mysql+memcache实战型技术测试(答案公布)

- 逆风迎上 - caoz的和谐blog
出两个变态的题目,题目很变态,但是都是实战中遇到的真实案例,. 1:我写一个程序,既要使用mysql也要使用memcache,. 第一行是 mysql_connect,第二行是memcache_connect. 换过来写,第一行是memcache_connect,第二行是mysql_connect.

全新安装Mac OSX 开发者环境 同时使用homebrew搭建 PHP,Nginx ,MySQL,Redis,Memcache ... ... (LNMP开发

- - 操作系统 - ITeye博客
重新安装系统,在苹果商店下载好OS X Mavericks安装文件,然后准备一支16G的USB3.0 U盘. 制作 OS X Mavericks 全新安装启动U盘. untitled 是你的u盘盘符,根据实际情况来. 看到上面的信息说明启动盘制作成功. 安装起来so easy :). 安装完成系统之后, 暂时还没有去迁移文件,由于本人喜好摄影,有大量RAW格式的原图在Aperture 的照片库中,尼康D800一张RAW文件有40M左右,到时候迁移照片库和照片流希望不要掉坑里了.

php mysql读写分离

- - 开源软件 - ITeye博客

CentOS 6下搭建Apache+MySQL+PHP+SSL

- 〤依然特雷西 - 博客园-首页原创精华区
网上的一些文章都已经比较老了,现在版本高了之后,其实配置是很省力的(不考虑什么负载的话). 分享全过程,出了文中提到的安装epel rpmfushion 源指令不同外,其他的过程也适用与Centos 5. 1.安装CentOS 6 ,可以选择最小安装,也可以安装桌面. 3.安装mysql,并设置mysql开机自启动,同时启动mysql.

PHP最佳实践:MySQL的连接

- - IT技术博客大学习
标签:   MySQL连接. 从PHP 5.5版本开始, mysql函数将被官方废弃,即所有 mysql_* 格式函数 将在5.5版本后当产生一个. E_DEPRECATED 错误. 废弃mysql函数的主要原因为:此函数为 的MySQL  3.23版本开发的,而目前的MySQL版本已经到了 5.6,中间产生了非常多的特性没有被函数所支持.

PHP查询MySQL大量数据的内存占用分析

- Avenger - OurMySQL
这篇文章主要是从原理, 手册和源码分析在PHP中查询MySQL返回大量结果时, 内存占用的问题, 同时对使用MySQL C API也有涉及.. 昨天, 有同事在PHP讨论群里提到, 他做的一个项目由于MySQL查询返回的结果太多(达10万条), 从而导致PHP内存不够用. 所以, 他问, 在执行下面的代码遍历返回的MySQL结果之前, 数据是否已经在内存中了.

PHP+MySQL环境下SQL Injection攻防总结

- rokeyhu - 老王的技术手册 ( 我的新博客:http://huoding.com )
程序员们写代码的时候讲究TDD(测试驱动开发):在实现一个功能前,会先写一个测试用例,然后再编写代码使之运行通过. 其实当黑客SQL Injection时,同样是一个TDD的过程:他们会先尝试着让程序报错,然后一点一点的修正参数内容,当程序再次运行成功之时,注入也就随之成功了. 假设你的程序里有类似下面内容的脚本:.

centos 下 编译安装 nginx + mysql + php 服务

- - CSDN博客系统运维推荐文章
1.6、创建nginx启动脚本. 1.7、修改nginx配置文件. 2.2、创建mysql用户. 2.4、解压安装mysql. #执行三条语句 解决 /bin/rm: cannot remove `libtoolT': No such file or directory. 2.5、修改配置文件并启动数据库.

Windows下Apache+PHP+MySQL简易配置教程

- - 蓝飞技术部落格
首先自然是下载软件,然后该解压的解压(注意要非中文目录,这里的软件目录以均以 C:\Program Files为例),该安装的安装(MySQL的安装会有许多选项,英文好的看着按自己需要勾勾填填就行了,实在不行的参考 这里,这里的版本比较旧,不过配置选项大致还是差不多的). Apache: httpd-2.4.3-win32.zip( 更多版本).

在Debian下搭建基于Apache-Php-MySQL的wordpress博客

- - CSDN博客互联网推荐文章
wordpress是一个流行的博客搭建框架,为不会html,css和js的人提供了搭建博客的便捷方式.我这里是在我的笔记本上搭建了一个wordpress博客,这里把详细的搭建过程写出来.. 具体的操作过程如下描述.. 1.安装apache2服务器. 其中apache2-doc是apache服务器的说明和配置文件,libapache2-mod-php5是apache的php模块库文件..