原文链接: The 7 signs of failure for internet startups
导致互联网初创公司失败的七个信号
1. 不是全职创业
2. 超过四个创始人
3. 没有技术合伙人
4. 没有根据业务类型,选择合适的创业组合
5. 没有实行中央集权
6. 一意孤行,没有汲取客户的反馈
7. 在一个没有经过验证的市场环境,扩张太快
在如果在创业公司的你,闻到了几个信号?
导致互联网初创公司失败的七个信号
1. 不是全职创业
2. 超过四个创始人
3. 没有技术合伙人
4. 没有根据业务类型,选择合适的创业组合
5. 没有实行中央集权
6. 一意孤行,没有汲取客户的反馈
7. 在一个没有经过验证的市场环境,扩张太快
在如果在创业公司的你,闻到了几个信号?
Connection reset by peer: socket write error错误分析:
常出现的Connection reset by peer: 原因可能是多方面的,不过更常见的原因是:
①:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉;
②:客户关掉了浏览器,而服务器还在给客户端发送数据;
③:浏览器端按了Stop
通常原因为:远程主机上对等方应用程序突然停止运行,或远程主机重新启动,或远程主机在远程方套接字上使用了“强制”关闭 (参见setsockopt(SO_LINGER))。另外,在一个或多个操作正在进行时,如果连接因“keep-alive”活动检测到一个失败而中 断,也可能导致此错误。此时,正在进行的操作以错误码WSAENETRESET失败返回,后续操作将失败返回错误码WSAECONNRESET。
但是如果频繁出现,就表示很 多客户端连接到Apache服务器的响应时间太长了,可能是网络的问题或者服务器性能问题。
---
备注:如果平时运行得好好的一个程序,在后面用curl去访问时出现了上述范围,其一般来说是网络的问题。
防火墙:引起该问题的原因是由于此时Server端连接已经被复位,而Client依然通过该连接在接收和发送数据,在网上搜索了一下 该错误,发现该错误引起的原因大都是防火墙的原因。
常出现的Connection reset by peer: 原因可能是多方面的,不过更常见的原因是:
①:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉;
②:客户关掉了浏览器,而服务器还在给客户端发送数据;
③:浏览器端按了Stop
通常原因为:远程主机上对等方应用程序突然停止运行,或远程主机重新启动,或远程主机在远程方套接字上使用了“强制”关闭 (参见setsockopt(SO_LINGER))。另外,在一个或多个操作正在进行时,如果连接因“keep-alive”活动检测到一个失败而中 断,也可能导致此错误。此时,正在进行的操作以错误码WSAENETRESET失败返回,后续操作将失败返回错误码WSAECONNRESET。
但是如果频繁出现,就表示很 多客户端连接到Apache服务器的响应时间太长了,可能是网络的问题或者服务器性能问题。
---
备注:如果平时运行得好好的一个程序,在后面用curl去访问时出现了上述范围,其一般来说是网络的问题。
防火墙:引起该问题的原因是由于此时Server端连接已经被复位,而Client依然通过该连接在接收和发送数据,在网上搜索了一下 该错误,发现该错误引起的原因大都是防火墙的原因。
php的filter扩展:在CentOS/RHEL5下安装PHP的filter和json扩展
Php/Js/Shell/Go jackxiang 2012-10-8 14:23
做为一个合格的web开发人员,一定会牢记一个原则——永远不能相信用户输入的数据,行走江湖,安全第一是很重要的。用户通过表单或url传过来的数据,一定要仔细检查过了,才往后台数据库里存进去。在一个成熟的开发团队里,贯彻这个原则不成问题;但是如果在一个新人老手混搭的小team里,很容易就忽视了这个问题,那么各种安全漏洞比如跨站攻击,sql注入等等真是防不胜防。
实际上,用php 5自带的filter扩展能够较好的解决这个问题。我在从前的blog里记录了filter扩展的常规用法——直接利用filter来校验数据,这样有不少额外的代码量,所以我得介绍一个比较偷懒的办法——自动对所有输入变量进行过滤,这只需要对php.ini增加一行配置,然后重启apache或fastcgi让php配置生效。
filter.default=”special_chars”
开启了这项配置后,会自动使用filter_input方法对$_GET, $_POST, $_COOKIE, $_REQUEST以及$_SERVER变量进行过滤转义。配置中special_chars是常量FILTER_SANITIZE_SPECIAL_CHARS的缩写,它能自动转义大部分危险字符例如: '"<>。而php手册对它的解释是:
HTML-escape ‘”<>& and characters with ASCII value less than 32, optionally strip or encode other special characters.
在这个情况下,新人们写出这样的代码我也不会太担心:
$foo = $_GET['foo'];
echo $foo;
在部分场合,我们可能还是需要未转义的变量,比如某个ajax接受的参数是一段json串,用这段代码即可获得原始数据:
$foo = filter_input (INPUT_GET, 'foo', FILTER_UNSAFE_RAW);
fitler扩展与yahoo使用的yiv如出一辙,印象里似乎就是yahoo对yiv做了些修改贡献给php社区,但是暂时没找到出处。
来自:http://www.ooso.net/archives/559
安装:http://blog.suchasplus.com/2008/11/centos-rhel-install-php-5-filter-and-json-extension-howto-chinese.html
【社区开学季】360提供的Php防注入代码,上面这个模块也就不用下面这些代码来防止注入了。
实际上,用php 5自带的filter扩展能够较好的解决这个问题。我在从前的blog里记录了filter扩展的常规用法——直接利用filter来校验数据,这样有不少额外的代码量,所以我得介绍一个比较偷懒的办法——自动对所有输入变量进行过滤,这只需要对php.ini增加一行配置,然后重启apache或fastcgi让php配置生效。
filter.default=”special_chars”
开启了这项配置后,会自动使用filter_input方法对$_GET, $_POST, $_COOKIE, $_REQUEST以及$_SERVER变量进行过滤转义。配置中special_chars是常量FILTER_SANITIZE_SPECIAL_CHARS的缩写,它能自动转义大部分危险字符例如: '"<>。而php手册对它的解释是:
HTML-escape ‘”<>& and characters with ASCII value less than 32, optionally strip or encode other special characters.
在这个情况下,新人们写出这样的代码我也不会太担心:
$foo = $_GET['foo'];
echo $foo;
在部分场合,我们可能还是需要未转义的变量,比如某个ajax接受的参数是一段json串,用这段代码即可获得原始数据:
$foo = filter_input (INPUT_GET, 'foo', FILTER_UNSAFE_RAW);
fitler扩展与yahoo使用的yiv如出一辙,印象里似乎就是yahoo对yiv做了些修改贡献给php社区,但是暂时没找到出处。
来自:http://www.ooso.net/archives/559
安装:http://blog.suchasplus.com/2008/11/centos-rhel-install-php-5-filter-and-json-extension-howto-chinese.html
【社区开学季】360提供的Php防注入代码,上面这个模块也就不用下面这些代码来防止注入了。
PHP的Fileinfo扩展
Php/Js/Shell/Go jackxiang 2012-10-8 14:21
PHP的Fileinfo扩展是libmagic库的一个封装,可以用来获得文件的一些信息,如MIME类型,可以用来更好地代替magic_mime扩展中的 mime_content_type()函数。本文介绍本人在Windows环境下使用Fileinfo扩展获得文件MIME类型的实现步骤:
到下载适合自己PHP版本的Fileinfo扩展到你的PHP扩展目录,即php.ini中由extension_dir指定的目录
将存放文件类型信息的magic和magic.mime两个文件放置到一个目录下,不妨设为E:\php\extras下。这两个文件在附件压缩包中,是我从GnuWin32的share文件夹中提取出来的。其中magic可以用apache的conf目录下的magic代替;PHP的extras文件夹也有一个magic.mime文件,但是用它的话fileinfo扩展无法正确工作,不能用来代替附件中的这个magic.mime
修改php.ini,加入这样一行:
extension=php_fileinfo.dll
之后重新启动web服务器,确认成功加载扩展之后进行下一步代码测试
新建一个php脚本文件,用如下代码进行测试
file($testFile);
?>
输出:application/msword
上述代码中$magicFile即为上述所提到的文件magic,必须保证magic.mime与magic两个文件放在同一个文件夹
到下载适合自己PHP版本的Fileinfo扩展到你的PHP扩展目录,即php.ini中由extension_dir指定的目录
将存放文件类型信息的magic和magic.mime两个文件放置到一个目录下,不妨设为E:\php\extras下。这两个文件在附件压缩包中,是我从GnuWin32的share文件夹中提取出来的。其中magic可以用apache的conf目录下的magic代替;PHP的extras文件夹也有一个magic.mime文件,但是用它的话fileinfo扩展无法正确工作,不能用来代替附件中的这个magic.mime
修改php.ini,加入这样一行:
extension=php_fileinfo.dll
之后重新启动web服务器,确认成功加载扩展之后进行下一步代码测试
新建一个php脚本文件,用如下代码进行测试
file($testFile);
?>
输出:application/msword
上述代码中$magicFile即为上述所提到的文件magic,必须保证magic.mime与magic两个文件放在同一个文件夹
PHP Tokenizer 的学习笔记_PHP教程
Php/Js/Shell/Go jackxiang 2012-10-8 14:17
简述
在某个项目中需要分析 PHP 代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑,这都不是最优的方式。
查询了 PHP 手册,发现其实 PHP 已经内置解析器的接口,那就是 PHP Tokenizer,这工具正是我想要的。使用 PHP Tokenizer 能简单、高效、准确的分析出 PHP 源代码的组成。
实例
官方站点对 Tokenizer 的文档很少,不过这不影响我们理解它。Tokenizer 组件仅仅包含两个函数:token_get_all 以及 token_name,它们分别用于分析 PHP 代码以及获取代码对应的标识符名称。
下面是个简单的实例,说明如何使用这两个函数:
以下为引用的内容:
对应的输出为
以下为引用的内容:
1 - T_OPEN_TAG <?php
1 - T_ECHO echo
1 - T_WHITESPACE
1 - T_CONSTANT_ENCAPSED_STRING "string1"
1 - T_CONSTANT_ENCAPSED_STRING "string2"
1 - T_WHITESPACE
1 - T_CLOSE_TAG ?>
这里顺便说明下,$token 如果为数组,那么分别对应的三个数组成员为 token 标识符(可以用 token_name 获得字面量)、对应的源代码内容、以及对应的行号。
还有中情况就是 $token 为字符串,这可能的情况之一就是为 T_CONSTANT_ENCAPSED_STRING 等常量,在分析代码时要注意。如果对这点很在意,可以考虑使用这里的代码。
是的,调用方式非常的简单,我们的野心当然远远要比写个简单的循环要大得多。我们可以利用这个组件做写实事,例如下面的代码用于“压缩” PHP 代码,去除不不要的换行、空白以及注释
以下为引用的内容:
调用方式很简单,只需要使用
以下为引用的内容:
CompactCode::compact($source_code);
即可,返回的字符串就是压缩以后的内容。
在某个项目中需要分析 PHP 代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑,这都不是最优的方式。
查询了 PHP 手册,发现其实 PHP 已经内置解析器的接口,那就是 PHP Tokenizer,这工具正是我想要的。使用 PHP Tokenizer 能简单、高效、准确的分析出 PHP 源代码的组成。
实例
官方站点对 Tokenizer 的文档很少,不过这不影响我们理解它。Tokenizer 组件仅仅包含两个函数:token_get_all 以及 token_name,它们分别用于分析 PHP 代码以及获取代码对应的标识符名称。
下面是个简单的实例,说明如何使用这两个函数:
以下为引用的内容:
对应的输出为
以下为引用的内容:
1 - T_OPEN_TAG <?php
1 - T_ECHO echo
1 - T_WHITESPACE
1 - T_CONSTANT_ENCAPSED_STRING "string1"
1 - T_CONSTANT_ENCAPSED_STRING "string2"
1 - T_WHITESPACE
1 - T_CLOSE_TAG ?>
这里顺便说明下,$token 如果为数组,那么分别对应的三个数组成员为 token 标识符(可以用 token_name 获得字面量)、对应的源代码内容、以及对应的行号。
还有中情况就是 $token 为字符串,这可能的情况之一就是为 T_CONSTANT_ENCAPSED_STRING 等常量,在分析代码时要注意。如果对这点很在意,可以考虑使用这里的代码。
是的,调用方式非常的简单,我们的野心当然远远要比写个简单的循环要大得多。我们可以利用这个组件做写实事,例如下面的代码用于“压缩” PHP 代码,去除不不要的换行、空白以及注释
以下为引用的内容:
调用方式很简单,只需要使用
以下为引用的内容:
CompactCode::compact($source_code);
即可,返回的字符串就是压缩以后的内容。
My set up ,必须要写明路径,否则认不到这个扩展在哪儿:
由于Zend新产品ZendGuardLoader的面世,Zend Optimizer已经不支持php5.3了,官方给出的版本是ZendGuardLoader代替,
zend optimizer是支持php5.2.x系列的!
zend Guard Loader是支持php5.3.x系列的!
也就是说,php5.3.x系列的版本优化引擎改为了zend Guard Loader。
ZendGuardLoader的安装还是和原版差不多的
下文的 php.ini(再php.ini 最后的地方加上) 文件根据实际情况修改成你服务器上的路径
[Zend Guard Loader]
zend_extension="E:\wamp\bin\zend\ZendGuardLoader-php-5.3-Windows\php-5.3.x\ZendLoader.dll"
重启。
HP 5.3 安装 Zend Guard Loader 说明
PHP 5.3 下,Zend Optimizer 已经被全新的 Zend Guard Loader 取代
------------------------------------------------
1. 下载 Zend Guard Loader 压缩包。(官方下载地址:http://www.zend.com/en/products/guard/downloads)
2. 解压并提取 ZendGuardLoader.so(Linux)或 ZendLoader.dll(Windows),对应你的PHP版本。
3. 在你的 php.ini 文件添加下面一行,用来加载 Zend Guard Loader:
Linux 和 Mac OS X: zend_extension = 完整路径/ZendGuardLoader.so
Windows(非线程安全): zend_extension = 完整路径/ZendLoader.dll
4. 在 php.ini 额外新增一行,启用 Zend Guard Loader:
zend_loader.enable = 1
5. 可选:可以在 php.ini 文件添加以下行到 Zend Guard Loader 配置位置:
;禁用许可证检查(为了性能的原因)
zend_loader.disable_licensing = 0
;让 Zend Guard Loader 支持混淆级别。级别在 Zend Guard 的官方详细文档。 0 - 不启用混淆
zend_loader.obfuscation_level_support = 3
;从这个路径寻找Zend产品授权的产品许可证。欲了解更多有关如何创建一个许可证文件的信息,请参阅 Zend Guard 用户指南.
zend_loader.license_path =
6. 如果您使用 Zend debugger,请确保加载 Zend guard Loader。
7. 如果您使用 ioncube loader,请务必在它之前加载 Zend guard Loader。
8. 重新启动Web服务器。
-------------------------------------------
转载请注明出处:http://hi.baidu.com/phpbuff/blog/item/2470f4d63fb58e3906088bb8.html
ea和zguard同时安装:
http://www.ithov.com/linux/107828_2.shtml
http://hi.baidu.com/cyzxlsf/item/05c413d1637091302a35c7dc
http://www.doc88.com/p-993593494490.html
DownLoad: http://www.zend.com/en/products/guard/downloads
由于Zend新产品ZendGuardLoader的面世,Zend Optimizer已经不支持php5.3了,官方给出的版本是ZendGuardLoader代替,
zend optimizer是支持php5.2.x系列的!
zend Guard Loader是支持php5.3.x系列的!
也就是说,php5.3.x系列的版本优化引擎改为了zend Guard Loader。
ZendGuardLoader的安装还是和原版差不多的
下文的 php.ini(再php.ini 最后的地方加上) 文件根据实际情况修改成你服务器上的路径
[Zend Guard Loader]
zend_extension="E:\wamp\bin\zend\ZendGuardLoader-php-5.3-Windows\php-5.3.x\ZendLoader.dll"
重启。
HP 5.3 安装 Zend Guard Loader 说明
PHP 5.3 下,Zend Optimizer 已经被全新的 Zend Guard Loader 取代
------------------------------------------------
1. 下载 Zend Guard Loader 压缩包。(官方下载地址:http://www.zend.com/en/products/guard/downloads)
2. 解压并提取 ZendGuardLoader.so(Linux)或 ZendLoader.dll(Windows),对应你的PHP版本。
3. 在你的 php.ini 文件添加下面一行,用来加载 Zend Guard Loader:
Linux 和 Mac OS X: zend_extension = 完整路径/ZendGuardLoader.so
Windows(非线程安全): zend_extension = 完整路径/ZendLoader.dll
4. 在 php.ini 额外新增一行,启用 Zend Guard Loader:
zend_loader.enable = 1
5. 可选:可以在 php.ini 文件添加以下行到 Zend Guard Loader 配置位置:
;禁用许可证检查(为了性能的原因)
zend_loader.disable_licensing = 0
;让 Zend Guard Loader 支持混淆级别。级别在 Zend Guard 的官方详细文档。 0 - 不启用混淆
zend_loader.obfuscation_level_support = 3
;从这个路径寻找Zend产品授权的产品许可证。欲了解更多有关如何创建一个许可证文件的信息,请参阅 Zend Guard 用户指南.
zend_loader.license_path =
6. 如果您使用 Zend debugger,请确保加载 Zend guard Loader。
7. 如果您使用 ioncube loader,请务必在它之前加载 Zend guard Loader。
8. 重新启动Web服务器。
-------------------------------------------
转载请注明出处:http://hi.baidu.com/phpbuff/blog/item/2470f4d63fb58e3906088bb8.html
ea和zguard同时安装:
http://www.ithov.com/linux/107828_2.shtml
http://hi.baidu.com/cyzxlsf/item/05c413d1637091302a35c7dc
http://www.doc88.com/p-993593494490.html
DownLoad: http://www.zend.com/en/products/guard/downloads
各种浏览器如何模拟在较低网速下对同一网页浏览的一个情况
Php/Js/Shell/Go jackxiang 2012-9-29 16:15
在做一些测试时,往往自己是搞开发的,网速还成,但是我们的用户会在偏远的山区,56K上网,为此,我们能保证我们看到的就是用户看到的么?当然不能,尤其是图片和css在一个较低的网速加载时会出现变形,图片加载时出现Load不进来,这一切都不是我们能预料的,为此,我们的网络是快,但我们的用户可能会用一个慢的网速来访问,会有各种情况,所以,我们必须和果模拟出这样一种情形,好提高我们的访问质量。
有同事推荐,NetLimiter这个软件,我是Win7,发现确实不怎么的,安都安不上,于是重启动了电脑,同事说是QQ电脑管家有一个这样的软件,So,我又没有安这个(当时安了做了下更新,后来就卸载了,不想让它更新Win7,再就是占用资源),在网上闲逛了一下,发现有一个这样的独立软件可以用,太好了,Url:http://www.huacolor.com/soft/59780.html 名字: 网络流量管理器 6.8.2383.401正式版(QQ电脑管家提取版).rar ,这个是个好玩意,呵呵,在此介绍给大家,至于怎么用,参考:http://www.duote.com/tech/5/14227.html
有同事推荐,NetLimiter这个软件,我是Win7,发现确实不怎么的,安都安不上,于是重启动了电脑,同事说是QQ电脑管家有一个这样的软件,So,我又没有安这个(当时安了做了下更新,后来就卸载了,不想让它更新Win7,再就是占用资源),在网上闲逛了一下,发现有一个这样的独立软件可以用,太好了,Url:http://www.huacolor.com/soft/59780.html 名字: 网络流量管理器 6.8.2383.401正式版(QQ电脑管家提取版).rar ,这个是个好玩意,呵呵,在此介绍给大家,至于怎么用,参考:http://www.duote.com/tech/5/14227.html
PHP类对象多重赋值,出现了很多个->的情况备案。
Php/Js/Shell/Go jackxiang 2012-9-28 17:59
PHP中类的对象经类的重重包含在找出一原先类里的某个变量时出现多次->的原因探究:
其之所以出现多个->,让人一看还真的蒙了,特别是给你看一段代码片段,蒙了,于是经过推敲后,得出如下代码:
其之所以出现多个->,让人一看还真的蒙了,特别是给你看一段代码片段,蒙了,于是经过推敲后,得出如下代码:
[上线用到]yuicompressor-2.4.2,js,css代码压缩。
Php/Js/Shell/Go jackxiang 2012-9-27 15:19
压缩会出现js错误最多的就是少分号,怎么解决避免的:
常看到一些大牛的JS源码 在function 前面加;
;function($,undefined) 是什么用处 ?
;(function($){$.extend($.fn...
现般在一些 JQuery 函数前面有分号
在前面加分号可以有多种用途:
1、防止多文件集成成一个文件后,高压缩出现语法错误。
2、这是一个匿名函数,一般js库都采用这种自执行的匿名函数来保护内部变量 (function(){})()
3、因为undefined是window的属性,声明为局部变量之后,在函数中如果再有变量与undefined作比较的话,程序就可以不用搜索undefined到window,可以提高程序性能
————————————————————————————————————————————————————
Yahoo!给我们带来了YUI compressor!
一.安装Java,配置环境变量。http://java.sun.com/javase/downloads/index.jsp
下载,安装,一路Next,没有任何问题,对了,你可以修改一下路径。
安装完毕以后,需要配置一下JAVA_HOME环境变量。
配置方法如下。
1、点击我的电脑—>属相—>高级—>环境变量—>系统变量
2、新建变量,变量名JAVA_HOME 路径:E:\Program Files\Java\jdk1.6.0_11 (我的是在E盘,你的JDK安装到那个盘,就写那个盘)
3、找到path变量,在后面添加路径:;%JAVA_HOME%\jre6\bin
OK,一路确定,关闭窗口。
打开CMD,输入java -version
看看能不能出来版本?
java version “1.6.0_11″
Java(TM) SE Runtime Environment (build 1.6.0_11-b03)
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing)
二:直接调用包的执行代码:java -jar E:/Tool/yuicompressor/yuicompressor-2.4.2.jar E:/CMS.ContentPager.js -o E:/CMS.ContentPager-min.js --charset utf-8
三:压缩示例,压缩实现:
使用yuicompressor-2.4.2.jar对js文件进行压缩和输出。
示例如下:
Java -jar yuicompressor-2.4.2.jar public.js -o compress/public.js --charset=utf-8
命令说明:
1. java –jar 执行jar包内的主函数
2. public.js 将被压缩的原版JS文件
3. –o 压缩后输出 后面是输出文件路径
4. –charset 压缩文件的编码格式
四:实际运用时,要注意目录中有空格的情况,会出现:Unable to access jarfile D:/Program,要用双引号引起来即可。
cd D:\Program Files\yuicompressor
DownLoad:
下载文件
参考(带文件下载):http://yekui.iteye.com/blog/819278
以上来自来自:
http://yui.github.io/yuicompressor/
在线web压缩:http://ganquan.info/yui/?hl=zh-CN
TBCompressor 基于YUICompressor的淘宝封装的css和js压缩工具(不用命令,直接合用的批处理工具):
http://www.jb51.net/softs/25860.html
描述实现方法:http://wenku.baidu.com/view/163a48f3770bf78a65295423.html
UI界面版本CSDN下载:http://download.csdn.net/download/tianqi520/1499680
Bat脚本实现批量压缩:http://www.cnblogs.com/heiniuhaha/archive/2011/06/15/YUI-Compressor.html
这个哥们写了一个,感觉界面不错利用YUI Compressor :
http://www.ninja911.com/blog/?p=345
-----------【相关下载】-----------
YUI Compressor [ http://yuilibrary.com/downloads/ ]
CSDN:NBCompressor_v1.2.0.2 附带 aauto ,利用YUI Compressor :
http://download.csdn.net/download/anto72/6328001
常看到一些大牛的JS源码 在function 前面加;
;function($,undefined) 是什么用处 ?
;(function($){$.extend($.fn...
现般在一些 JQuery 函数前面有分号
在前面加分号可以有多种用途:
1、防止多文件集成成一个文件后,高压缩出现语法错误。
2、这是一个匿名函数,一般js库都采用这种自执行的匿名函数来保护内部变量 (function(){})()
3、因为undefined是window的属性,声明为局部变量之后,在函数中如果再有变量与undefined作比较的话,程序就可以不用搜索undefined到window,可以提高程序性能
————————————————————————————————————————————————————
Yahoo!给我们带来了YUI compressor!
一.安装Java,配置环境变量。http://java.sun.com/javase/downloads/index.jsp
下载,安装,一路Next,没有任何问题,对了,你可以修改一下路径。
安装完毕以后,需要配置一下JAVA_HOME环境变量。
配置方法如下。
1、点击我的电脑—>属相—>高级—>环境变量—>系统变量
2、新建变量,变量名JAVA_HOME 路径:E:\Program Files\Java\jdk1.6.0_11 (我的是在E盘,你的JDK安装到那个盘,就写那个盘)
3、找到path变量,在后面添加路径:;%JAVA_HOME%\jre6\bin
OK,一路确定,关闭窗口。
打开CMD,输入java -version
看看能不能出来版本?
java version “1.6.0_11″
Java(TM) SE Runtime Environment (build 1.6.0_11-b03)
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing)
二:直接调用包的执行代码:java -jar E:/Tool/yuicompressor/yuicompressor-2.4.2.jar E:/CMS.ContentPager.js -o E:/CMS.ContentPager-min.js --charset utf-8
三:压缩示例,压缩实现:
使用yuicompressor-2.4.2.jar对js文件进行压缩和输出。
示例如下:
Java -jar yuicompressor-2.4.2.jar public.js -o compress/public.js --charset=utf-8
命令说明:
1. java –jar 执行jar包内的主函数
2. public.js 将被压缩的原版JS文件
3. –o 压缩后输出 后面是输出文件路径
4. –charset 压缩文件的编码格式
四:实际运用时,要注意目录中有空格的情况,会出现:Unable to access jarfile D:/Program,要用双引号引起来即可。
cd D:\Program Files\yuicompressor
DownLoad:

参考(带文件下载):http://yekui.iteye.com/blog/819278
以上来自来自:
http://yui.github.io/yuicompressor/
在线web压缩:http://ganquan.info/yui/?hl=zh-CN
TBCompressor 基于YUICompressor的淘宝封装的css和js压缩工具(不用命令,直接合用的批处理工具):
http://www.jb51.net/softs/25860.html
描述实现方法:http://wenku.baidu.com/view/163a48f3770bf78a65295423.html
UI界面版本CSDN下载:http://download.csdn.net/download/tianqi520/1499680
Bat脚本实现批量压缩:http://www.cnblogs.com/heiniuhaha/archive/2011/06/15/YUI-Compressor.html
这个哥们写了一个,感觉界面不错利用YUI Compressor :
http://www.ninja911.com/blog/?p=345
-----------【相关下载】-----------
YUI Compressor [ http://yuilibrary.com/downloads/ ]
CSDN:NBCompressor_v1.2.0.2 附带 aauto ,利用YUI Compressor :
http://download.csdn.net/download/anto72/6328001
json文件格式的查询工具
Php/Js/Shell/Go jackxiang 2012-9-26 11:03
前一阶段开发ios手机程序,客户端和服务器端主要通过json传输数据内容。从服务器端返回来的数据内容是json格式,查看很不方便,因此在网上找到如下的查询工具,方便查询。
我们知道Json是一种特殊Javascript对象,介绍几个Json查看工具。
http://jsonviewer.codeplex.com/
.Net开发的Json查看器,可反编译查看源码,呵呵。
https://addons.mozilla.org/en-us/firefox/addon/jsonview/
火狐的Json查看器插件,可在火狐中打开Json内容查看
https://chrome.google.com/extensions/detail/chklaanhfefbnpoihckbnefhakgolnmc
谷歌浏览器的Json查看器插件,功能同上
http://jsonviewer.stack.hu/
本文来自:http://blog.csdn.net/z343929897/article/details/8009106
最后,我自己的工具:http://tools.jackxiang.com/ 里面有一个Json编辑器。
我们知道Json是一种特殊Javascript对象,介绍几个Json查看工具。
http://jsonviewer.codeplex.com/
.Net开发的Json查看器,可反编译查看源码,呵呵。
https://addons.mozilla.org/en-us/firefox/addon/jsonview/
火狐的Json查看器插件,可在火狐中打开Json内容查看
https://chrome.google.com/extensions/detail/chklaanhfefbnpoihckbnefhakgolnmc
谷歌浏览器的Json查看器插件,功能同上
http://jsonviewer.stack.hu/
本文来自:http://blog.csdn.net/z343929897/article/details/8009106
最后,我自己的工具:http://tools.jackxiang.com/ 里面有一个Json编辑器。
一本全面的Node.js教程及node.js和php性能测试。
Php/Js/Shell/Go jackxiang 2012-9-26 09:51
这书花了两个小时看了一下,这门子语言简单,且实用,就像是搭建积木一样,呵呵,异步等是它的亮点,但PHP+Nginx也有类似的处理,该书Url:
http://www.nodebeginner.org/index-zh-cn.html#a-basic-http-server
再就是node.js和php性能测试 :
http://www.jiangmiao.org/blog/2491.html
http://snoopyxdy.blog.163.com/blog/static/60117440201183101319257/
后记:
Node.js并不适合需要与用户实时交互的系统;它适合集中处理用户发来的大规模“指令”,即不需要及时看到结果的请求。比如微博系统,用户发表一条微博,可能需要在服务器上排队1分钟才能最终保存到数据库。在这一分钟里,用户更多地是看看别人发表的微博,并不十分迫切地想看到自己那条微博。如果希望有更好的体验,其实可以用DOM直接把用户发表的微博先更新到当前页面,同时使用Ajax异步请求保存这条数据。
node作为一种新型的服务器语言从被认可,到广泛用于生产环境要走的路还很长。
个人总结:
node适用小型/单一的任务型应用,具备高效率的特性,例如计数器/访问足迹/comment等高并发ajax操作,结合缓存/nosql和队列是个不错的选择;但做完整项目可能略显复杂,容易导致控制流倒置。
人生苦短, Pythonic! 冗余不做,日子甭过!备份不做,十恶不赦!
http://www.nodebeginner.org/index-zh-cn.html#a-basic-http-server
再就是node.js和php性能测试 :
http://www.jiangmiao.org/blog/2491.html
http://snoopyxdy.blog.163.com/blog/static/60117440201183101319257/
后记:
Node.js并不适合需要与用户实时交互的系统;它适合集中处理用户发来的大规模“指令”,即不需要及时看到结果的请求。比如微博系统,用户发表一条微博,可能需要在服务器上排队1分钟才能最终保存到数据库。在这一分钟里,用户更多地是看看别人发表的微博,并不十分迫切地想看到自己那条微博。如果希望有更好的体验,其实可以用DOM直接把用户发表的微博先更新到当前页面,同时使用Ajax异步请求保存这条数据。
node作为一种新型的服务器语言从被认可,到广泛用于生产环境要走的路还很长。
个人总结:
node适用小型/单一的任务型应用,具备高效率的特性,例如计数器/访问足迹/comment等高并发ajax操作,结合缓存/nosql和队列是个不错的选择;但做完整项目可能略显复杂,容易导致控制流倒置。
人生苦短, Pythonic! 冗余不做,日子甭过!备份不做,十恶不赦!
jQuery链式语法 用js生成页面 并且响应click事件
Php/Js/Shell/Go jackxiang 2012-9-26 09:37
ios产品越狱以后,发现可以安装ssh server,于是开始了ssh ipad的过程。
1、环境
ipad 3代,ios,5.** 已经 越狱
2、首先安装ssh服务
可以直接从cydia中下载openssh即可,具体安装过程省略
3、登录过程
我在SecureCRT中直接登录ssh ip -l root,root默认密码为alpine,记住马上修改你的密码(安全呀)
passwd root
new pwd:
confirm new pwd:
4、发现
执行uname,发现是Darwin,苹果早期的os原型
然后在etc下发现了apt目录,居然可以类似ubuntu一样使用apt,直接安装了vim: aptget install vim即可成功,意外收获
5、可惜ipad放在哪里一段时间后,wifi就断开了,可能需要一个插件吧,让其wifi长链接,这样就可以吧ipad堪称一个类linux的服务器使用了,呵呵
Ipad 存照片位置:
/private/var/mobile/Media/DCIM/100APPLE
QQMusic放音乐的位置:
/private/var/mobile/Applications/DB55E674-3398-4E0F-B562-7BE03857B9F3/Documents
1、环境
ipad 3代,ios,5.** 已经 越狱
2、首先安装ssh服务
可以直接从cydia中下载openssh即可,具体安装过程省略
3、登录过程
我在SecureCRT中直接登录ssh ip -l root,root默认密码为alpine,记住马上修改你的密码(安全呀)
passwd root
new pwd:
confirm new pwd:
4、发现
执行uname,发现是Darwin,苹果早期的os原型
然后在etc下发现了apt目录,居然可以类似ubuntu一样使用apt,直接安装了vim: aptget install vim即可成功,意外收获
5、可惜ipad放在哪里一段时间后,wifi就断开了,可能需要一个插件吧,让其wifi长链接,这样就可以吧ipad堪称一个类linux的服务器使用了,呵呵
Ipad 存照片位置:
/private/var/mobile/Media/DCIM/100APPLE
QQMusic放音乐的位置:
/private/var/mobile/Applications/DB55E674-3398-4E0F-B562-7BE03857B9F3/Documents
[转载评论]Web的Server PUSH架构将是未来主流
Php/Js/Shell/Go jackxiang 2012-9-17 18:08
Rango 18:02:56
http://matyhtf.iteye.com/blog/1679051
回忆未来-向东 18:05:11
对你这篇文章提到了Erlang,其中说到Push这一块,也是我研究的原因,你这块有实例吧?Push到浏览器的实例。
当年搜狐的白社会就是用的Erlang能并发2W,但没有做起来,技术已经是相当先进了。
Rango 18:05:56
只有测试的例子。目前还没有完整的方案
呵呵,并发2W不算什么。
搞到20W都不成问题
回忆未来-向东 18:06:21
带逻辑的,所以并发可能要低一点儿。
Rango 18:06:38
并发跟这个没关系,RPS和同时连接数
...
Rango 18:22:01
对啊。一直保持的,长连接
需要在你的代码中自己去选择关闭
回忆未来 18:22:14
为何要长连接?
Rango 18:22:26
swoole_server_close
...
阅读全文
http://matyhtf.iteye.com/blog/1679051
回忆未来-向东 18:05:11
对你这篇文章提到了Erlang,其中说到Push这一块,也是我研究的原因,你这块有实例吧?Push到浏览器的实例。
当年搜狐的白社会就是用的Erlang能并发2W,但没有做起来,技术已经是相当先进了。
Rango 18:05:56
只有测试的例子。目前还没有完整的方案
呵呵,并发2W不算什么。
搞到20W都不成问题
回忆未来-向东 18:06:21
带逻辑的,所以并发可能要低一点儿。
Rango 18:06:38
并发跟这个没关系,RPS和同时连接数
...
Rango 18:22:01
对啊。一直保持的,长连接
需要在你的代码中自己去选择关闭
回忆未来 18:22:14
为何要长连接?
Rango 18:22:26
swoole_server_close
...

PHP 使用 APC 增進執行速度之apc_stat=0。
Php/Js/Shell/Go jackxiang 2012-9-15 22:16
PHP APC apc stat=0:
如果你覺得自己的 PHP 網站不快,可以在自己的 php.ini 裡面,load 進來 apc.so 後面加上 apc.stat=0 ,對樣對網站的效能會有顯著地提昇。原理是因為 APC 在每次讀取 PHP 程式碼的時候,都會先 stat() 程式碼所在的檔案,以確定要不要重新編譯成 OPCODE ,而 apc.stat=0 則是直接省略 stat() 的步驟,拿原本就有的 opcode 來用。
而當使用了 APC 並且設置 apc.stat=0 之後,其實網站在第一次編譯成 OPCODE 之後,除非重起或是清除快取,要不然就是會一直拿 OPCODE 來跑,而這樣速度也因此有了顯著的提升
当然重启动一下Apache也是可以自动再次加载一次的。
阅读全文
如果你覺得自己的 PHP 網站不快,可以在自己的 php.ini 裡面,load 進來 apc.so 後面加上 apc.stat=0 ,對樣對網站的效能會有顯著地提昇。原理是因為 APC 在每次讀取 PHP 程式碼的時候,都會先 stat() 程式碼所在的檔案,以確定要不要重新編譯成 OPCODE ,而 apc.stat=0 則是直接省略 stat() 的步驟,拿原本就有的 opcode 來用。
而當使用了 APC 並且設置 apc.stat=0 之後,其實網站在第一次編譯成 OPCODE 之後,除非重起或是清除快取,要不然就是會一直拿 OPCODE 來跑,而這樣速度也因此有了顯著的提升
当然重启动一下Apache也是可以自动再次加载一次的。

作者:Alexandra Hoffer URL:http://www.cprogramming.com/gdbtutorial.html
翻译: Hiram Lee
GDB (GNU Debugger的简写)是可以用于C和C++的一款强大的调试工具。调试器这个程序可以让你在程序 运行时检查程序状况来找出错误。你可以看看源代码,观察变量,跟随控制流程,在一个有限的循环中设一个断点,还有更多可以做的事。本文快速介绍一下GDB最常用和最有用的命令和技巧。
开始
要使用GDB调试程序,只需在提示符后键入GDB<程序名字>,你也可先开启GDB,然后如果你有一个发调试的core dump文件的话,可以这样写load<程序名字>。当做完这些时,输入run就可以运行程序了。你可以输入C(表示控制)来与程序交互,这个C会出现在GDB的界面上。输入continue可以从GDB返回到你的程序。GDB中的所有命令都可以缩写为一个独一无二的字母,即它的首字母。因此只需输入c来代替continue。如果你感到困惑的话,GDB有一个内置的帮助系统可以给你演示你可以用GDB做的所有一切和如何做。在提示符下输入help就可进入。一旦你找到你的bug,按control_Dgo 退出GDB。 啥时运行几个GDB会立即让你不解,所确保一次只运行一个GDB程序。
查看
在GDB提示符下有两类命令你可以使用。一种命令是告诉GDB如何做,别一种只是让它给你信息。这小节我们讨论后一种命令。你可以输入print <变量>让GDB告诉你变量的值,这种命令就好像是在C或着C++中运行的一样,举个例子,你可以输入print myarray[5]来查看一个矩阵中特定的元素,或着输入print struc.label来查看一个结构体的成员。
Lisat是另一种有用的命令,它告诉你你在哪,它会给出附近的几行代码。你再输入list,会看到下10行的代码。你可以输入list<行号>来查看某个特定部分的程序。举例来说,如果你想看20行的程序,输入list20。如果程序有多个源文件,你可输入list<文件名>:<行号>来标明你想发查看的部分。你可以选择使用list<函数名>来检查一个函数的开始。
第三个命令backtrace用于查看程序的堆栈,当输入backtrace时,你可以看到一个还没有返回和被调用的函数的清单,输入up 和down来改变范围,这样就可以看到调用函数的状态了。
断点
使用GDB有很多调试的技巧,但有一些是更学用和更有用的。其中之一就是设置断点,断点是程序运行到某一个地方是自动停止,这样你就可以查看整个程序的状态。设置断点,输入break<行号>。break的语法同list.
和break联合使用的一个非常有用的命令叫next,这个next命令会把程序运行至下一行,然后马上再回到GDB的提示符下。 你也可以给next一个参数,例如next 100,这个程序会在运行完第100个指令时停下来。
命令watch也挺有用,无论变量的值如何改变你都可以观测这个变量和设置断点。然而,设置一个观察点会友让GDB的速度下降很多,困此除非你有自己的unix机器,尽量避免使用。
Messing with
有一组命令虽然不经常使用,这些指令实际上是在程序运行时进行修正。比如指令call会调用一个特殊的函数,set variable指令会把程序的一个变量设置为一个特称的值,,比如set varibale i = 0, Return 这个指令会把当前的函数返回到调用它的函数。
技巧
现在你已经学了这些简洁的命令,如何使用它们呢。 这里有一些常见的调试的问题,这些技巧就用了用武之地。
1 Segfaults and Core Dumps
当你的程序发生这个错误时,怎么办?最简单的办法就是在GDB里运行直到发生了段错误。当程序崩溃时,GDB就会告诉你哪一行出错了。一般是程序中试图要对一些变量进行内存复杂操作时发生的。你可以用bt(或着backtrace)找出你所以栈的位置,再用p来查看变量,观察是否有超出范围或过多临时量的情况。有一个捷径,你用GDB调试你的程序,然后load 文件corefile,这个文件导致了崩溃。
2无限循环
无限循环是一个很难自己找到的错误,但用gdb很简单,在GDB里load程序,运行到循环。点击control_c迫使回到GDB提示符。输入bt,就可以知道现在在哪一行。使用list查看代码,看是否能找到什么引起了循环。如果找不到的话,使用n(或着next)把一次进行一个循环,同时 使用p来查看变量。
3隐晦错误
大部分错误难以简单分类,经常出现的是你的程序给出一些不明显的原因导致 的错误输出,当出现这种问题时有这样一此技巧。一种是当你的程序要求输入时设置一个断点,然后一路next
再观察栈和变量,难保一切都是按预想的进行。如果你认为你的问题是因为鞭一个变量引起的,代码上很难看出,那你就监测变量。
翻译: Hiram Lee
GDB (GNU Debugger的简写)是可以用于C和C++的一款强大的调试工具。调试器这个程序可以让你在程序 运行时检查程序状况来找出错误。你可以看看源代码,观察变量,跟随控制流程,在一个有限的循环中设一个断点,还有更多可以做的事。本文快速介绍一下GDB最常用和最有用的命令和技巧。
开始
要使用GDB调试程序,只需在提示符后键入GDB<程序名字>,你也可先开启GDB,然后如果你有一个发调试的core dump文件的话,可以这样写load<程序名字>。当做完这些时,输入run就可以运行程序了。你可以输入C(表示控制)来与程序交互,这个C会出现在GDB的界面上。输入continue可以从GDB返回到你的程序。GDB中的所有命令都可以缩写为一个独一无二的字母,即它的首字母。因此只需输入c来代替continue。如果你感到困惑的话,GDB有一个内置的帮助系统可以给你演示你可以用GDB做的所有一切和如何做。在提示符下输入help就可进入。一旦你找到你的bug,按control_Dgo 退出GDB。 啥时运行几个GDB会立即让你不解,所确保一次只运行一个GDB程序。
查看
在GDB提示符下有两类命令你可以使用。一种命令是告诉GDB如何做,别一种只是让它给你信息。这小节我们讨论后一种命令。你可以输入print <变量>让GDB告诉你变量的值,这种命令就好像是在C或着C++中运行的一样,举个例子,你可以输入print myarray[5]来查看一个矩阵中特定的元素,或着输入print struc.label来查看一个结构体的成员。
Lisat是另一种有用的命令,它告诉你你在哪,它会给出附近的几行代码。你再输入list,会看到下10行的代码。你可以输入list<行号>来查看某个特定部分的程序。举例来说,如果你想看20行的程序,输入list20。如果程序有多个源文件,你可输入list<文件名>:<行号>来标明你想发查看的部分。你可以选择使用list<函数名>来检查一个函数的开始。
第三个命令backtrace用于查看程序的堆栈,当输入backtrace时,你可以看到一个还没有返回和被调用的函数的清单,输入up 和down来改变范围,这样就可以看到调用函数的状态了。
断点
使用GDB有很多调试的技巧,但有一些是更学用和更有用的。其中之一就是设置断点,断点是程序运行到某一个地方是自动停止,这样你就可以查看整个程序的状态。设置断点,输入break<行号>。break的语法同list.
和break联合使用的一个非常有用的命令叫next,这个next命令会把程序运行至下一行,然后马上再回到GDB的提示符下。 你也可以给next一个参数,例如next 100,这个程序会在运行完第100个指令时停下来。
命令watch也挺有用,无论变量的值如何改变你都可以观测这个变量和设置断点。然而,设置一个观察点会友让GDB的速度下降很多,困此除非你有自己的unix机器,尽量避免使用。
Messing with
有一组命令虽然不经常使用,这些指令实际上是在程序运行时进行修正。比如指令call会调用一个特殊的函数,set variable指令会把程序的一个变量设置为一个特称的值,,比如set varibale i = 0, Return 这个指令会把当前的函数返回到调用它的函数。
技巧
现在你已经学了这些简洁的命令,如何使用它们呢。 这里有一些常见的调试的问题,这些技巧就用了用武之地。
1 Segfaults and Core Dumps
当你的程序发生这个错误时,怎么办?最简单的办法就是在GDB里运行直到发生了段错误。当程序崩溃时,GDB就会告诉你哪一行出错了。一般是程序中试图要对一些变量进行内存复杂操作时发生的。你可以用bt(或着backtrace)找出你所以栈的位置,再用p来查看变量,观察是否有超出范围或过多临时量的情况。有一个捷径,你用GDB调试你的程序,然后load 文件corefile,这个文件导致了崩溃。
2无限循环
无限循环是一个很难自己找到的错误,但用gdb很简单,在GDB里load程序,运行到循环。点击control_c迫使回到GDB提示符。输入bt,就可以知道现在在哪一行。使用list查看代码,看是否能找到什么引起了循环。如果找不到的话,使用n(或着next)把一次进行一个循环,同时 使用p来查看变量。
3隐晦错误
大部分错误难以简单分类,经常出现的是你的程序给出一些不明显的原因导致 的错误输出,当出现这种问题时有这样一此技巧。一种是当你的程序要求输入时设置一个断点,然后一路next
再观察栈和变量,难保一切都是按预想的进行。如果你认为你的问题是因为鞭一个变量引起的,代码上很难看出,那你就监测变量。
出两个变态的题目,题目很变态,但是都是实战中遇到的真实案例,
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,关联因素可能才是根源,解决了根源,表象才会彻底解决。
来自:http://hi.baidu.com/cpyblwuqdubbvzd/item/7253e0fb3cfa1cee1a111f64
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,关联因素可能才是根源,解决了根源,表象才会彻底解决。
来自:http://hi.baidu.com/cpyblwuqdubbvzd/item/7253e0fb3cfa1cee1a111f64