• 23 六 2009 /  杂项

    php 5.2.10发布了,喜欢用fpm的朋友又要头痛怎么样打patch了,因为Andrei去忙他更感兴趣的项目去了,最新版本fpm一直维持在0.6.10针对php 5.2.8的版本上。下面介绍如何使用那个patch来升级php 5.2.10

    首先解压php 5.2.10的压缩包到一个目录,然后执行
    gzip -cd php-5.2.8-fpm-0.5.10.diff.gz | patch -d php-5.2.10 -p1
    会输出一些错误,可以忽略这些错误,然后修改php-5.2.10/sapi/cgi/fastcgi.c文件,找到下面的代码,将下面“-”号开头的代码删除。

             if (!tcp) {
                chmod(path, 0777);
    -       } else {
    -           char *ip = getenv("FCGI_WEB_SERVER_ADDRS");
    -           char *cur, *end;
    -           int n;
    -
    -           if (ip) {
    -               ip = strdup(ip);
    -               cur = ip;
    -               n = 0;
    -               while (*cur) {
    -                       if (*cur == ',') n++;
    -                       cur++;
    -               }
    -               allowed_clients = malloc(sizeof(in_addr_t) * (n+2));
    -               n = 0;
    -               cur = ip;
    -               while (cur) {
    -                       end = strchr(cur, ',');
    -                       if (end) {
    -                               *end = 0;
    -                               end++;
    -                       }
    -                       allowed_clients[n] = inet_addr(cur);
    -                       if (allowed_clients[n] == INADDR_NONE) {
    -                                       fprintf(stderr, "Wrong IP address '%s' in FCGI_WEB_SERVER_ADDRS\n", cur);
    -                       }
    -                       n++;
    -                       cur = end;
    -               }
    -               allowed_clients[n] = INADDR_NONE;
    -                       free(ip);
    -               }
    }

    然后在php代码的根目录下执行
    ./buildconf --force

    用于清除默认的configure脚本
    然后就可以标准的编译流程了

    ./configure --enable-fastcgi --enable-fpm
    make
    make install

    为什么这样就行了呢?因为patch执行的时候只有两个文件产生了冲突,并且都是跟实际程序没有太大关系的代码(例如一些显示输出),所以,把这些干掉自然就可以正常编译。而buildconf –force可以将配置文件脚本根据当前的代码情况自动生成匹配的新的,这个也适用于你要将一些而外的模块编译到php程序里。在此案例里面就是不用重新修复那个错乱的configure文件了,直接根据当前的情况来生成新的。

    从php-fpm邮件列表来看,php-fpm已经切换成BSD的授权形式了,有位大侠Michael Shadle正在跟php的作者协调,看看能不能将fpm整合到php的标准发行包里面,那样的话就省着每次都做patch了。

    在此呼吁一下,那位有经验在Linux下做C++开发的,是否愿意贡献一下将fpm移植进入php,我可以协助与Michael联系。愿php-fpm蓬勃发展!

    Tags: ,

  • 12 六 2009 /  互联网技术

    通常长连接应用的结构思路网上都有很多介绍,但是很多细节并没有透露。最近实现具体的应用时探索了几点细节,记录下来。主要的问题是客户端浏览器要有实时的消息返回,但通常整个链路上都会出现一些设置问题导致的无法实时返回的情况。

    1、nginx服务器代理模式不会实时返回数据

    因为现在主流的web服务器还没有特别适合事件驱动的,所以长连接部分需要单独写server程序,但我们又希望用统一的80端口来做服务端口,所以我用nignx做了前面的代理,根据规则转发长连接请求到后台的独立服务器上。

    于是问题来了,通过nginx转发并不直接回复给客户端,需要数据传输后断开连接,客户端才能收到返回的所有内容。这是后需要将默认的proxy_pass的buffer关掉,有一个属性是proxy_buffering off;关掉以后nignx会直接返回结果而没有缓存等待所有内容都从后台服务器传送完成才返回给客户端。

    2、Chrome浏览器的实时处理数据机制

    Chrome和其他浏览器不一样,如果你一开始返回一个http头,里面表明有很长的数据需要下载,Chrome没有收到一定量数据前,是不会在浏览器中渲染或者执行这些已经下载的数据的,所以导致你无法通过长连接触发你想触发的javascript或一些你想做的操作。

    解决方案是在后台的服务器上判断如果是Chrome来访则要在内容body里面先输出标准的html头部head和body标签,然后后面跟随至少2048个字节的字符,可以随意,我用点符号来填充,然后才是正式的我要输出的内容。这样Chrome收够了2048字节的内容后就会触发对代码的处理工作,后续的代码也就变成实时触发的效果了。这算是一个针对Chrome的hack吧。

    Tags: , ,

  • 11 六 2009 /  互联网技术

    flash客户端程序能同时保持多少个socket链接?偶然的机会我调试一个程序发现了flash貌似对socket有数字限制。实际测试结果是最大20个连接,如果超过,它就会将最早的一个socket断掉,并且不触发任何的事件。个人认为这是非常变态的,客户端无法得知这些连接出现问题了,并且如果要限制也应该是将新建的socket抛出超过最大限制的异常这样好让人家去处理。

    当然,也许没人在flash用这么多socket链接,我也是在写得不好的程序里发现的这个问题而已。也许flash有默认的处理机制而我发现的是一个bug。总之概率比较小,但是除虫比较烦人,所以如果你看到这个文章解决了你的问题,只能说明你比我幸运,能找到一个比你更早发现并记录这个问题的人了。

    Tags:

  • 08 六 2009 /  互联网技术

    上周末参加了Google在中国的开发者日,印象中比去年人少了,印象中学生比去年少了。这是好事儿,可以安心听课不需要抢座位了。

    开复兄介绍了在过去的一年中google推广的技术的使用情况,然后搬出来刚刚在美国发布的热乎乎的Google Wave给大家尝鲜,的确产品做得很牛,现场掌声不断,相比微软感觉M$真是老了。

    Wave很好很强大,具体的介绍在网上google一下就好了,我这里也不多废话。但是我的体会是,如果你做一个产品或者想尝试复制一个已有的产品来经营的话,如果你在制作过程中没有新的创意或者改进,那就干脆不要做好了。创新才是关键,我愿意为创新而冒着项目有可能会失败的风险,但是值得。试想你就平平淡淡的做一个东西出来,有什么用,都是垃圾,是100%的失败。但是我有创新,那就是50%的概率可以成功,起码有50%的概率,比100%失败强多了。

    Google在很多产品上都有这样的特性,要不就不做,要做就要做得有新意,这样才能真正黏住用户。Wave是一个更大更好的例子。如果40年前没有发明email这个最伟大的互联网应用的话,如果现在用当前的互联网技术来做一个email的话,该是什么样子呢?Wave就是朝着这个目标来前进的,几乎摆脱了所有的当前的技术观念,以一种崭新的思想实现了,结果当然是振奋人心。

    另外一个热词是HTML 5,列表中没有IE,但其它的浏览器在未来的测试版中通通都开始支持HTML 5的草案了。HTML 5计划能在2010年发布,这次人们希望根据实际的需求而推出标准,而不是跟产业脱节的标准出台后4-5年才能被广泛引用,因此Google在努力。

    HTML 5的几个特性让我感到害怕

    1、canvas 能实现2维空间下的绘图

    2、location 能定位用户的位置

    3、video 多媒体标签

    4、本地缓存功能

    感觉Adobe Flash在跟M$的silverlight pk完胜,但是却直接被HTML5吞了,有了HTML5这些东西,要flash干啥?真是可怕。

    Tags: , ,

  • 06 六 2009 /  互联网技术

    首先,探索新鲜事物是有风险的;一个下午时间,工作用的SVN库内容被我搞乱了一点,我本机的代码被误删,这些血的代价换回的是一个整合的开发体验。我将我在开发中用到的几乎所有的内容都整合到Eclipse中了,有点爽。

    先介绍我开发时会用什么,php、python、actionscript、javascript是最近常用的几种语言,用SVN做代码库,Trac进行文档编写和bug管理以及任务分配。因为主要是Web应用,所以nginx做为web server通过fastcgi连接php和python,基本上调试是在开发服务器上完成的,本机也可,但是我的确比较烦windows下这些环境的配置。所以时不时要通过ssh来传送文件到远程的开发服务器上。

    再来讲讲Eclipse,这厮也不是什么新鲜东西了,n年前就听说几大巨头共同投资开发了这样的一个开源的集成开发环境(IDE),当年初次体验时没有什么感觉,那时候还主要用于java或者C/C++的开发,附带的插件还很少。也许Java的fans追捧的比较多。我长时间开始使用Eclipse是因为做一些Flex的项目,Flex Builder本身就是一个Eclipse的变种,被Adobe公司优化后,在那个时候相比直接下载的Eclipse来讲,好用很多,毕竟这个东西是卖钱的,不好用能行嘛。Flex项目完成后对Eclipse的感觉也加深了,总想将php开发的环境也迁移过来,我印象中触动我的新闻消息是Zend Studio也做了Eclipse的版本。但是直到今天前,我还觉得整合不是很完善,也许是没有踏实下来用,也许是插件发展还没有跟上我的要求。

    于是今天,我再次弄了一下这个东西,发现最近一段时间它的插件跟进速度很快,基本上可以满足我上述所有的要求,当然也许是我终于踏实下来研究了一下。下面是配置的一些流程以及一些配置注意项,正常情况下,如果没有什么异常,Eclipse配置好后就可以在windows、linux、mac下完成主流语言的开发、调试工作,并且可以将项目代码通过SVN来共享,并且可以管理自己的Todo list以及Trac上的ticket。怎么样,听起来是不是很爽?ok,如果你不想在试验体验时有血的代价,听好我的流程和注意项,Let’s go!

    访问http://www.eclipse.org/downloads/下载Java Developers版本,这个版本相对比较小一点,预装的东西少一点,后续按需自己安装插件嘛。一开始我选择了Classic版本,也没有什么问题,但是因为增加了所有功能的源代码以及Eclipse开发文档、插件开发库等东西,导致这个软件包比较大,大的坏处是下载很慢并且程序启动的时候因为加载很多无谓的东西导致很慢。所以一切你自己需要来选择初始版本。

    下载后解压到你希望它存在的目录就可以了,然后进入目录,运行eclipse.exe,如果你是其它操作系统的,就照着类似的方法安装启动就可以了。第一次启动会让你选择默认的项目工作目录(workspace),你可以每次都选择来切换不同的工作目录,也可以默认死一个,一个工作目录可以包含多个项目。这里要注意的是未来工作目录下的项目目录是会在建立或者导入项目时清空目录中的内容的,所以未来设置项目路径或者选择工作目录都要小心,我的文件就是这么被误删的,呜呜~~~~

    启动界面如图,默认是一个欢迎界面

    eclipse welcome windows

    可以关闭这个欢迎界面,以后要再想看的话,在目录help->welcome中激活,先不要研究这个,直接切入主题。我们先安装php的开发插件。

    访问这个地址http://www.phpeclipse.com/wiki/Installation,选择你所需要的update源,复制地址,例如我选择的是http://update.phpeclipse.net/update/stable/1.2.x,然后回到Eclipse中,选择目录help->Software Updates,如下图所示将update源地址添加进入更新列表中,然后就可以在列表中选择新安装或者更新的软件包了。

    eclipse add update site

    点击列表左侧每一项前面的加号,就可以展开看到可以安装的软件包,勾选你需要的,对于php来讲,选择全部,然后选择右面的install按钮,等待一会儿会再跟你确认是新装还是update,再次确认后就开始实际的下载安装了。这里我没有考虑网络太慢的原因,如果你实在受不了的话,可以找个地方先下载好软件包,然后还是在这个add site的地方加入,只是选择右面的local按钮选择本地文件罢了。

    好,在建议下重启eclipse以后,你会发现多了一些小东西,首先可以new php的project了,如果你在菜单file->new下无法看到默认的php project不要紧张,直接选择new project也可以,这时候创建项目的向导程序可以允许你选PHP目录下的php project,接下来的事情跟着向导程序一步步走就可以了,你就可以轻松建立一个php的项目了。

    php项目会进入php视图,如果没有的话,可以在菜单windows->open perspective->other里面选到,选好以后应该能发现菜单下多了一排小图标。这里用到的是一个开发环境简化安装的项目XAMPP。phpeclipse可以和xampp联动,做到在开发界面中重启例如apache、mysql等相关的服务,十分方便。不过,我不用XAMPP所以暂时没有研究它怎么调用我自己配置的开发环境。

    同样道理,我们参考上面的流程来安装python的开发插件。我选择的是PyDev,访问http://pydev.sourceforge.net/download.html页面来选择合适的update节点地址,拷贝下来还是到添加站点的地方添加,并且选择安装软件包,稍等片刻后就会安装好。重启后需要做一个配置来映射系统的python解析器,访问菜单Windows->Perferences->Pydev->Interpreter下,如图所示:

    eclipse config pydev

    选择右上角new一个新的python interpreter,起一个名字并且指定python.exe所在的路径,确认后就和上面的截图效果一样,会配置好所有的python库的路径,如果你要添加额外的库,也可以在下面这个框里面添加。至此pydev的设置也都ok了,创建项目和php的那个流程一样。我想其它语言你只要能找到它的插件,按照这个流程安装都应该可以支持。下面我们来说一些辅助的功能,eclipse与svn结合。

    Eclipse默认只有CVS的支持,svn毕竟是一个新东西,但是它的确比cvs好用,所以一直期待这个插件,这次我能完美的安装并使用这个插件了,安装流程和上述的流程都是一样的,非常简单,只是有一个概念要搞清楚。eclipse网站展示的只是svn插件的部分,让它顺利运行还需要安装一个第三方的svn connector接口以及选择一个connector实现。下面两个连接分别是插件和connector的update地址。

    http://download.eclipse.org/technology/subversive/0.7/update-site/

    http://community.polarion.com/projects/subversive/download/eclipse/2.0/update-site/

    安装好重启后可以在新建项目的时候选择Project from svn,这样就可以从svn直接checkout出来一个项目来开发程序了。需要特别注意的是,如果你不选择默认项目work space,你一定要自己制定项目的子目录,如果你选择了一个workspace但并没有选择子目录的话,它会在建立项目时将选择的目录内的所有内容都删除了!我就被删了我所有的开发代码。

    还有要注意的是,如果你直接将你现在的项目import到svn,它会将你当前项目当做目录import进去,所以不要而外再起一个svn的子目录名字了,不然就会多了一层,很乱。

    Eclipse默认还安装了 Mylyn的模块,它基本上是一个开发时的任务管理器,它可以和代码相关,比如你在代码注释里填写TODO:xxxx,它就会自动提取这个把它变成一个todolist。更加增强的是,如果你选择安装mylyn的trac插件,你还可以随时调用trac里面的ticket来做bug或者任务管理。因为目前跟trac 0.11.3的配合还不是太好,需要下载一些patch才能work,所以这部分我打算日后单独写一篇文档来描述,下面只是列出Mylyn的trac插件update地址。

    http://download.eclipse.org/tools/mylyn/update/extras

    总结:Eclipse是名副其实的综合IDE工具,因为它开源的特性导致会有更多的人提供基于它的开发工具特性,它也就会支持更多的开发语言或者开发领域。熟悉这个工具非常值得,因此希望大家玩得开心,happy coding!

    Tags: , , , ,