很早就想写这么一篇文章了。我离开中国雅虎已经一年有余,在中国雅虎工作的那段时光是我最珍贵的回忆之一,和以前的同事吃饭聊天的时候也经常会怀念一下中国雅虎,怀念得多了,就觉得不如写篇文章好好回顾一下。很多事情虽然已经过去,但有些话不说出来,到底意难平。
转载说明 :我的紫色情结. --作者是我以前小组的同事
一般很少有用PHP做服务的, 但是如果你的已有业务逻辑都是PHP实现的, 而现在却需要基于已有的业务逻辑提供一套Socket服务, 怎么办?
当然, 解决方法很多, 但最简单的办法, 还是直接使用PHP做Socket服务.
而这样做要解决的问题有很多, 主要要解决的问题有如下几个:
1. 作为后台服务,需要常驻后台运行, 那么丁点的内存泄露都是不能接受的. 2. 作为后台服务,畸形数据导致进程异常退出, 也是不可接受的. 3. 作为后台服务, 要能做到graceful restart. 4. 作为后台服务, 对资源的使用必须在可接受的范围以内.
最近,我就基于PHP写一个简单的提供Socket服务的框架. 取其名为Mpass(Multi-Processes Socket Server).
对于Apache来说, 如果URL和PATH_INFO中出现%2f(/)或者%5c(\), 会被认为这是个不合法的请求, Apache将会直接返回404结束.
对于使用mod_rewrite做URL改写的情况来说, 可能会比较容易遇到这个问题.
解决的办法有两种.
1. 进行俩次encode, /变为%252f 2. 在apache的配置中增加: AllowEncodedSlashes On
具体可以参看:http://httpd.apache.org/docs/2.2/mod/core.html#allowencodedslashes
PHP的命名空间, 实现的还真是简单.
当你有如下代码:
<?php namespace Yaf; class Application { }
其实就相当于, 你声明了一个名字为A\B的类, 当然, 你不能直接这么申明(只是不能在PHP脚本中这么申明).
with 20 Comments同事发现一个在使用set_error_handler的时候, 能100%重现的core, 提炼后的重现代码如下(环境必须不能访问internet):
<?php function err_handler(){ exit; return true; } set_error_handler('err_handler'); $client = file_get_contents("http://www.laruence.com/ServiceNoWse.asmx?WSDL");
这段代码, 放在webServer中, 第一次访问不会有事, 第二第三次的时候就会出core.
快有一个月没有更新Blog了, 一来是最近项目比较紧张, 二来就是在忙着开发Yaf(Yet another Framework)
一直以来, 我研究PHP的内核, 虽然有文章不少, 但却鲜有一些借助这些研究成果而来的, 实际的东西, 也就无法让更多人学习到对Zend API的实际运用.
我思考了一段时间, 觉得有必要写一个扩展出来, 这个扩展要用到很多Zend API, 要用到很多在网上的PHP扩展开发中,鲜有叙及的部分(比如, 实现类/接口, 继承, 自动加载,等等), 让更多的PHP扩展开发者可以借鉴.
with 54 Comments首先说个题外话: Vim发布7.3了..
在翻看Vim插件的时候, 发现了一个比较有意思的应用(非插件): 把PHP的手册融如Vim中, 在Vim中, 按"K", 就可以跳转到光标下函数的手册说明...
PHP的异常机制的原理是什么?
在PHP每一个可独立执行的op array最后的ZEND_HANDLE_EXCEPTION是用来干什么呢?
有同学问了一个问题:
<?php for($i = 'A'; $i <= 'Z'; $i++) { echo $i; }
输出是啥?
说个题外话: Blog现在支持订阅评论了, 同学们有提问以后等我回答的, 可以在留言提问的时候, 选择:Notify me of followup comments via e-mail
今天在老王的技术手册看到一个问题:
<?php if ($a = 100 && $b = 200) { var_dump($a, $b); }
输出是什么?
这个问题, 咋一看或许觉得简单, 但其实仔细推敲并不简单.