Saturday, January 23, 2010

顺手把新版本的 eAccelerator 编译了

上次编译大概是两周前吧,写makefile成功后的第二次编译,但是当时svn拿到的代码 php5.3.1 下编译有错,具体记不得了。
刚才svn update了下,改动不少。
重新export一份到 php-5.3.1\ext\eAccelerator 下,makefile.txt 依旧在 win32下。
Visual Studio 2008 Command Prompt 进到目录,直接 nmake -f makefile.txt 轻松成功。把当前目录生成的dll copy到 php53\ext 下,php -v php -m 都成功了。
顺手把 php 5.2 的源码目录和二进制目录都更新了。5.2.12。把eAccelerator 的目录也copy到了相应目录下。

5.3 和 5.2 的扩展编译的第一个区别是 buildconf + configure.

5.3 下上次编译的时候,直接解压的源码包,进到ext目录,nmake -f makefile.txt 貌似报错是 config.h 不存在还是什么的。回到 php 源码根目录,buildconf.bat && cscript configure.js 再去编译就好了。
当然需要把那个 php5ts.lib copy到 eAccelerator的目录里。

5.2 这次编译,我第一下也去 buildconf + configure 了,结果发现还需要把win32build 那个环境搭起来。印象中以前编译那些乱七八糟的扩展基本都没这么折腾。直接尝试去 nmake,一切顺利。不提示缺那个文件。
PS: VS2008下提示
        cl.exe /nologo ../optimize.c /Fo"optimize.o" /O1 /c /I ../../../ /I ../../../Zend /I ../../../TSRM /I ../../../main /I ../../ /D NDEBUG /D ZEND_DEBUG=0 /D WIN32 /D _WINDOWS /D _USRDLL /D HAVE_EACCELERATOR /D COMPILE_DL_EACCELERATOR /D ZEND_WIN32 /D PHP_WIN32 /D ZTS=1 /D HAVE_EXT_SESSION_PHP_
SESSION_H=1 /D WITH_EACCELERATOR_CRASH_DETECTION /D WITH_EACCELERATOR_OPTIMIZER /D WITH_EACCELERATOR_SESSIONS /D WITH_EACCELERATOR_CONTENT_CACHING /D WITH_EACCELERATOR_SHM /D WITH_EACCELERATOR_INFO
optimize.c
F:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\sys/stat.inl(44) : error C2466: cannot allocate an array of constant size 0
F:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\sys/stat.inl(49) : error C2466: cannot allocate an array of constant size 0
g:\build\phpbuild\vc9\x86\php-5.2.12\tsrm\readdir.h(10) : warning C4005: '_WIN32_WINNT' : macro redefinition
C:\Program Files\Microsoft SDKs\Windows\v6.1\include\sdkddkver.h(186) : see previous definition of '_WIN32_WINNT'
F:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\sys/utime.inl(39) : error C2466: cannot allocate an array of constant size 0
F:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\sys/utime.inl(44) : error C2466: cannot allocate an array of constant size 0
F:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\sys/utime.inl(49) : error C2466: cannot allocate an array of constant size 0
F:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\sys/utime.inl(78) : error C2466: cannot allocate an array of constant size 0
F:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\wtime.inl(37) : warning C4133: 'function' : incompatible types - from 'const time_t *' to 'const __time32_t *'
F:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\wtime.inl(43) : warning C4133: 'function' : incompatible types - from 'const time_t *' to 'const __time32_t *'
F:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\time.inl(38) : warning C4133: 'function' : incompatible types - from 'const time_t *' to 'const __time32_t *'
F:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\time.inl(44) : warning C4133: 'function' : incompatible types - from 'const time_t *' to 'const __time32_t *'
F:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\time.inl(51) : warning C4133: 'function' : incompatible types - from 'const time_t *' to 'const __time32_t *'
F:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\time.inl(57) : warning C4133: 'function' : incompatible types - from 'const time_t *' to 'const __time32_t *'
F:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\time.inl(64) : warning C4133: 'function' : incompatible types - from 'const time_t *' to 'const __time32_t *'
F:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\time.inl(69) : warning C4133: 'function' : incompatible types - from 'const time_t *' to 'const __time32_t *'
F:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\time.inl(81) : warning C4133: 'function' : incompatible types - from 'time_t *' to '__time32_t *'
NMAKE : fatal error U1077: '"F:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\cl.exe"' : return code '0x2'


直接进到 源码的
\main\config.w32.h
注释掉
#define _USE_32BIT_TIME_T 1




不过,php 5.2 编译的时候,需要单独编译 eAccelerator 目录的 fnmatch.c 否则找不到符号
cl.exe /nologo php5ts.lib odbc32.lib odbccp32.lib /link /out:"eAccelerator.dll" optimize.o opcodes.o mm.o eaccelerator.o ea_store.o ea_dasm.o debug.o ea_info.o ea_restore.o /dll
Creating library eAccelerator.lib and object eAccelerator.exp
eaccelerator.o : error LNK2019: unresolved external symbol _fnmatch referenced in function _ea_match
eAccelerator.dll : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: '"F:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\cl.exe"' : return code '0x2'
Stop.
php 5.3.1 的 fnmatch 直接在 php的源码包 \win32 下有了。

Friday, January 15, 2010

折腾@jwc

教务管理系统之烂,估计每个学校都各有特色。尤其是在这种*假学分制*前提的选课需求下,选课成了抢课,于是一群人“挤破脑壳”只为刷进系统选上一门老师“好”点的课。

理工教务处用的是“正方现代教学信息管理系统”。这个系统据了解是一群人做了套东西然后浙江大学挂名交钱才推广起来的。所以核心代码都在 /bin/zjdx.dll 浙江大学.dll lol。手头有一份06年弄到手的web系统文件,之前略微看过反编译出来的源码,验证了我找到的两个“疑似注入点”并否定了一个上传点。至于那个Delphi写的客户端,手脱壳之后,dede版本太低,看不了,于是就没折腾。

系统是 IIS + ASP.Net + Oracle。 应用和数据库分离,分别跑在windows和Solaris上。

选课这个功能也是用的这套系统的,但是由于这个系统本身很2的功能实现,基本选课人一多,页面就耍不开了。有时候辛辛苦苦刷开页面,却发现js菜单或者css没加载,而且这页面是IE only的 XD。更恶心的,基本每个页面都检查了referer,即便你看到了页面源码里的地址,直接copy到地址栏也没用。

于是第一个问题,页面的资源偏多,而且没有做任何缓存或者其他的处理,每次访问页面都会载入耗费大量的时间加载图片等。这些资源的处理也是交给IIS的。这种情况下,显然nginx更适合用来handle这种资源。但是如果剥离资源扔个nginx什么的,显然工作量很大。所以,前端配一个nginx高版本或者squid,把后端服务器的图片资源全缓存起来,应用服务器负载会小很多。
于是kangkai 配了一层squid,同时我也拿nginx最新版配了个proxy 加了cache。基本这样处理起来,把所有的请求都走代理过去,只要能刷开页面,基本就不会出现js菜单不加载的情况。不过恶心在url的处理上。

做了这些,于是建立在页面刷开的前提下的用户体验会改善些。
但是,系统的问题还是没有触及皮毛。
现在的系统,经常就出现 web application error 之类的红字警告,然后就是service unavailable了。想起去年选课期间教务处挂在操场上的喷绘,被人用黑笔写了很明显的 service unavailable。lol

某天去教务处机房,零距离接触了服务器。听说这种情况基本重启一下IIS就会好,不过过一会儿又会反复。想到 春生 之前提到的apache 定期 graceful 一下,让 kangkai 试试定时重启IIS。 按今天kangkai说的,这个有点用,不过最后负载又回到数据库上了,这是后话。

从教务处回来,突然想到,出现那种情况有可能是IIS虚拟主机资源分配的问题。以前教务处曾用过两个三个应用服务器,后来都被挪作他用了。据kangkai说现在这个应用服务器高峰期的资源占用也不算高。于是想到可以一台机器多开几个应用,前端的squid来做负载均衡。只是实验性的,因为对IIS资源分配问题也只是怀疑,没法说。只能试试。但是 service unavailabe 这样子感觉应该问题比 web application error 这个要底层,更像是IIS的问题,所以尝试还是有意义的,毕竟据我之前的观察,不同虚拟主机用的是不同的进程跑的。


最后得到的消息,就是刚才说的数据库。据说高峰期数据库服务器的负载上了20,三cpu的机器吧,有点太狠了。。。。
而且以前himo说的,那个系统对数据库简直是滥用,什么样的查询都有。
选课的时候,查询量肯定不会小,一累加就更大了。


可惜kangkai不是专门做技术维护的,只能这样了。