Jump to Navigation

Document

Programming articles and books.

PHP的PDO遇到MySql has gone away的解决方法

在MySQL特定的数据库参数配置的情况下,在一个超时的连接上调用任意的mysql函数,

会导致PHP的PDO扩展报"MySQL has gone away"警告,导致程序无法继续执行。

在使用多种PHP层的解决方案后,依旧无法避免这一问题的出现。

原因在于PDO架构采用了连接对象缓存机制,在使用相同的dsn串连接数据库时,

PDO会从连接池对象中取出有相同dsn串的连接,问题就出在这个地方。

当该连接出现了"MySQL has gone away"之后,PDO并不知道这一情况,

PDO连接对象仍旧在PDO的连接池中。

下次即使在PHP层检测到这一问题,并重试连接,PDO却返回之前报了错的连接。

问题的原因查找到了,接下来就是寻找解决方法。

由于PDO没有提供关闭连接的方法,而是依靠PHP本身的引用计数与垃圾回收机制关闭连接,

在大多数情况下这都没有问题,但这时候这种机制就略显无力了。

经过多次实践修改测试,总结出来以下两种方式,

简单动态web js/css压缩与cdn系统

1、目标,
优化处理过程,不再需要每次有svn提交重复处理所有文件。

自动化程度更高,添加自动处理多文件控件的动态按需合并功能。

采用实时动态js/css压缩,只在有请求时才有压缩,而不是之前的预先把所有文件压缩好。

相对可靠的自动varnish缓存清理,降低从更新代码到生效的时间延迟。

减少svn钩子端代码量和处理时间,SVN服务器减负。

添加处理日志,帮助处理异常查询。

调整svn目录结构,更合理规范。

2、使用技术组件,
nodejs做js/css压缩。

nginx/varnish做服务与缓存。

graphicsmagick做图片压缩优化。

3、服务组件图,

4、压缩处理程序流程图,

Category:

php扩展编写中的整数参数接收

在php中没有C/C++语言中的unsigned long long,unsigned int这些无符号整数类型,

在C/C++程序中一般表示为uint64_t,uint32_t等。

如果在php扩展中需要接收这些无符号数据类型,则需要特殊的处理方式。

对于在PHP支持的范围内的整数,可以直接使用"l"参数获取,

但对于赶出php支持范围的整数,一般需要使用"s"参数获取,

之后在C/C++语言中转换成无符号整数。

也就是,通用的情况下,参数定义为mixed(integer/string)类型的。

在扩展中使用"z"接收参数,接收到之后,使用宏Z_TYPE_P判断参数的实际类型,

对于Z_TYPE_P == IS_LONG的时候,直接转换成无符号类型,

因为这情况情况说明PHP正确传递了整数类型的参数。

如果超出了PHP处理的范围,参数会被转换为浮点数,宏Z_TYPE_P应该为IS_DOUBLE类型。

这样就可以根据扩展中判断出来的类型做不同的接收处理。

当使用字符串类型传递这种参数时,Z_TYPE_P == IS_STRING,转换一次就可以。

Category:

svn到git的迁移与过渡方案

svn与git都是源代码版本控制软件,但它们属于不同的时候。
svn特点在集中式的管理方式,而git更适合于当前分布式管理方式。
当前从svn到git的迁移方案,都是以git为目标,从git的角度提供了相对的迁移策略。
使用的比较多的是,git-svn 和 subgit。

前者出现的早,一直是在git包里自带,用的人多些,在最新的版本里对分支的支持已经非常完善了。
但是它只是一个客户端口的解决方案,能让使用人员用git的方式管理svn代码库,并最终把代码存储在服务器的svn服务器上。
后者属于第三方的解决方案,并且是个商业产品。客户端的使用纯git命令而非git-svn命令,
并在git服务器上提供服务器端的配置支持,让服务器上的git与svn服务器保持同步。

在客户端上则看不到svn的影子,只是把git-svn拿到服务器上使用,并且自动化了。

这两种方案最终都是使用 git或者类似git命令管理代码,与向git的迁移目标一致。

Category:

gitlab安装

gitlab是与github类似的git开放代码管理平台,不过gitlab是开源的版本,
可以在自己服务器上搭建类似github的代码管理平台。
gitlab是使用ruby on rails开发的,目前来说已经比较成熟。
在经历上次安装5.x版本的gitlab失败后,最近有抽了点时间,
为了能推动使用git库开发,再次尝试安装了一次,还算比较满意。
现在把安装过程和安装中遇到的问题与解决办法简单总结下来,
以备后续参考。

安装版本选择,
这次选用的是最新的6.4.0版本。
其他主要使用的包版本如下:
https://github.com/gitlabhq/gitlabhq/archive/v6.4.0.tar.gz
centos-6.5-x86_64
ruby-2.0.0-338
python2.7
mysql-5.5
nginx-1.4.3
redis-2.8
git-1.8.5.2

Category:

git submodule 引用一个repo的branch分支

git submodule add -b branch_name git@abc.org:account/efg.git cname
git submodule add -b [branch] [URL] [DirectoryName]

参数在于-b branch_name

这个功能应该是在git-1.8.2加入的,
如果之前需要使用这个类似svn:externals类似的引用任意分支的功能则使用上比较复杂。

在.gitmodules中显示比普通的submodule多了一个branch属性:

[submodule "cname"]
path = cname
url = git@abc.org:account/efg.git
branch = branch_name

Category:

实际项目中的常见算法

【编者按】本文原始内容来源于stackexchange,遵循cc-wiki协议;

近日Emanuele Viola在Stackexchange上提了这样的一个问题,他希望有人能够列举一些目前软件、硬件中正在使用的算法的实际案例来证明算法的重要性,对于大家可能给到的回答,他还提出了几点要求:

JSON-RPC协议与网络传输

通常据说的JSON-RPC协议指的是数据格式协议,
对于数据包的传输,可以使用不同的网络连接协议实现,
最基本的只使用tcp传输,所有传递的数据包以 json格式为准。
对于无法识别成json格式的数据包,像其他的类似软件一样认为协议错误。

另外,其他的像http,websocket这些通用协议,都可以作为JSON-RPC的传输层使用。
RPC的概念是一个远程过程调用,想当于通过网络执行一段远程服务器上的代码。
那么这段代码可以理解成普通编程语言中的函数,
它有函数名字和函数参数,这样程序的其他位置可以通过名字与参数调用。
JSON-RPC协议也是如此,给远程服务器一段功能代码一个名字与输入参数,
然后通过网络发起这段功能代码的调用,执行并返回结果。

所以,JSON-RPC协议标准,每次调用都需要提供一个方法名,一组方法参数。

40多个关于人脸检测/识别的API、库和软件

自从谷歌眼镜被推出以来,围绕人脸识别,出现了很多争议。我们相信,不管是不是通过智能眼镜,人脸识别将在人与人交往甚至人与物交互中开辟无数种可能性。

Category:

初步尝试opencv图像识别训练

在了解了一些关于opencv的功能与基本用法之后,开学尝试使用opencv做一些实际应用。
本次选定一个功能应用,识别验证码功能。
验证码用于网站的防伪,一般为大小写字母与数字,4-6个字符不等。

使用opencv识别,分解为以下步骤,
验证码图片的切割,把图片中的几个字符拆开成单独的字符图片。
使用拆开的字符图片执行opencv训练,
使用训练好的分类器文件,识别目标中的字符。

对于图片验证码的切割,又分为下面几个步骤,
图像去噪,去除图像的背景,混淆随机点/线
图像的加强或者平滑处理,让其中的字符更清楚
根据字符轮廓,切割出字符图片。

这一步中,对于稍微复杂的验证码,也非常难以做到,
例如在去噪的时候,会把字符线条也去掉了部分,对于比较细的字体,可能就被过滤掉了。
对于有比较粗的混淆线时,这种线一般与字符交叉重叠,
在计算字符的轮廓时,会出现两个字符粘连一在起的情况。
图片加强时,也会加强没有去掉的混淆点/线,影响识别字符轮廓
还有些字符距离可能由于倾斜或者字体大小不同而靠的非常近,

页面

订阅 RSS - Document


Main menu 2

by Dr. Radut