Category: PHP

Anything about PHP

  • PPA source for PHP-YAF

    PHP-YAF is a PHP framework extension likes Zend Framework, but much more lighter, more faster and better extendability. It is developed by laruence. PHP-YAF could work with PEAR, Zend Framework and many others libraries.

    YAF supported PECL good. It is convenient using PECL to install YAF on Ubuntu box. There is a saying that “When in Rome, do as the Romans do”. Thus why we are here: a PPA source for PHP-YAF.

    I have put all dependences on the github.

    (more…)

  • PHP-YAF 的 PPA 源

    PHP-YAFlaruence 开发的类似 Zend Freamwork 的 PHP 扩展框架。轻巧、快速,扩展性良好。并且可以与 PEAR、Zend Freamwork 这些库协调工作,兼容良好。因此,这一年多,我基本上已经放弃 ZF 为主体的集成框架(还记得 Ninny Project 吗?),并将其移植到了 YAF 上。

    虽然,作为 PHP 开发者,laruence 一早就对 YAF 进行了 PECL 的支持,使用 PECL 安装 YAF 也很方便。但是作为一个重度 apt 依赖患者,还是希望能够使用源方式维护安装包。

    因此,这个 PHP-YAF 的 PPA 源诞生了!

    由于完全不会用 bzr,因此没有用 launchpad 的服务,我将打包程序和相关配置放在了 github 上。

    (more…)

  • 如何采集部分内容图片化的网站

    首先要声明:虽然这是互联网行业的一个普遍现象,但本文讨论的内容,与我所在的公司和所从事的行业无关。

    事情的起因是在一个讨论 yaf 的 qq 群有人问如何抓取某网站内容,比如这里。我得说,这个网站在防采集和防抓取方面一直做得很出色。当然更出色的是他们运营的内容的价值。

    在几年之前,我就探索过这个问题。对内容的数字、标点进行部分图片化,并且不是固定图片。URL 甚至 md5 值都是变化的。那么最基本的思路就是图像内容的识别。
    例如这是其中一个放大了 5 倍的数字:。蓝色背景是我手工加上去的,因为还有这样一个图:,你会发现原来同样的内容的图中还会有干扰点和偏移量的存在。那么难道真得要祭出像 opencv 这样的神器吗?其实,用一个采样/阈值匹配的办法,用 php 和 gd 库就可以实现一个简单的图像识别。
    (more…)

  • 关于 QQ OAuth 封装出现 T_PAAMAYIM_NEKUDOTAYIM 的解决办法

    许多网友在使用我的 OAuth 的腾讯微博封装(腾讯微博开放平台的PECL的OAuth封装)时都遇到了 T_PAAMAYIM_NEKUDOTAYIM 的错误。为了方便大家,干脆这里统一说明一下吧。

    这个错误的责任在我。
    由于我使用的开发和部署环境都是 Ubuntu 环境,PHP 版本 5.3.3。我在编码的时候使用了一个 5.2.x 不支持的特性。在 XY/QQ/Store.php 的 28 行:

    $class::setParams($params);
    

    经不完全验证在 5.2.x 及以下版本会报 T_PAAMAYIM_NEKUDOTAYIM 错误。

    解决办法其实很简单,将 28 行代码替换为:

    call_user_func(array($class, 'setParams'), $params);
    

    仅此即可。

    真是抱歉了!同时感谢 ahusjolzy 提供的关键信息!

  • 腾讯微博开放平台的PECL的OAuth封装

    这是腾讯微博开放平台使用 PECL OAuth 扩展例子,我在“微博擂台”中已经使用的。现在抽取出来作为一个独立的库。

    Token 的存储提供了 Session 和 Memcache 两种方式。Session 方式是默认方式,也就是说不进行任何设置默认使用 Session 存储 OAuth 的 Token。

    如果想用后台进程,例如 Gearman 之类的异步调用腾讯的 API ,建议使用 Memcache。当然,也可以自己扩展存储接口,实现 Mysql 之类的存储方式。

    下载代码

  • 使用 PECL 的 OAuth 库访问 QQ 微博 API

    大势所趋,QQ 也在自家门上开了个小洞让诸位看客过过瘾。不过 API 文档不给力,疏漏多、讲得粗,没有 SDK,没有 Step by step,关键细节交代不清……幸而,摸索两日,总算是探得一个靠谱的办法——PECL 的 OAuth 库访问。

    特别记录于此,供众玩家观赏。
    (more…)

  • 使用 PECL 的 OAuth 访问腾讯微薄 API 的一点麻烦

    尝试用 PECL 的 OAuth 访问腾讯微薄,到 Access Token 那步总是有问题。 5% 的成功率。在 Request Token 的时候,也总有不成功的情况发生。

    捕捉到异常:“Invalid auth/bad request (got a 401, expected HTTP/1.1 20X or a redirect)”,服务器返回“Invalid / expired Token”。

    奇怪的是同样的代码,那 5% 的成功率是哪里来的。上 Q 一问,腾讯某大牛提示检查检查 nonce 或者 timestamp 是不是正确。于是乎,检查了一下 OAuth 的代码

    	if (soo->nonce) {
    		nonce = estrdup(soo->nonce);
    	} else {
    		struct timeval tv;
    		int sec, usec;
    		/* XXX maybe find a better way to generate a nonce... */
    		gettimeofday((struct timeval *) &tv, (struct timezone *) NULL);
    		sec = (int) tv.tv_sec;
    		usec = (int) (tv.tv_usec % 0x100000);
    		spprintf(&nonce, 0, "%ld%08x%05x%.8f", php_rand(TSRMLS_C), sec, usec, php_combined_lcg(TSRMLS_C) * 10);
    	}
    

    看到“spprintf(&nonce, 0, “%ld%08x%05x%.8f”, php_rand(TSRMLS_C), sec, usec, php_combined_lcg(TSRMLS_C) * 10);”了吗?!悲剧啊!

    现在明白腾讯文档上那句“随机串(32个字符长度)”是什么意思了,RFC 5849 完全没提 nonce 需要 32 字符长度。腾讯自己说自己复合 OAuth 1.0a 标准,然后在标准上搞出了小标准⋯⋯

    我比较懒,简单搞掂:

    $oauth->setNonce(md5(rand()));
    
  • Web编程异步模型的 Gearman 实现(残)

    写了 PHP 原生的二段式异步模型的实现,我就想着用 Gearman 实现一个 callback 方式的异步。还没准备好怎么去写,就看到了靓文一篇《Gearman 心得》

    看过之后,甚感压力:好文!!于是,弃笔不写,洗洗睡罢了……

    补充一下,在“心得”文中仅仅说明了不阻塞的后台作业。对于异步获取数据并未说明。所以我这里罗嗦一下……

    worker 如果用 php 来实现,并且不用《Web编程异步模型的PHP 原生实现》中的异步方式,是无法实现 php 的 client 的异步的。比较好的实现方式是 worker 不使用 php,用 python、perl 或者 c,实现一个线程池来执行 job。当然,私下觉得用 stackless python 可能是更好的选择。

    2010年07月18日补充:
    好吧,终于有人撰文,正好可以补充完整这个异步思路:
    淺談coroutine與gevent
    就他了,太棒了!

  • Web编程异步模型的PHP原生实现

    这是基于上一篇随笔:关于Web编程异步模型的白日梦的实现。这一思路我记得在 05 年还是 07 年的时候就在 ChinaUnix 上有高人所讨论,只是自己当时愚钝未能明晰本质,纠结于 PHP 的多线程之中……

    这个实现写好有段时间了,最近琐碎的事情很多,一直没有整理出来。今日得闲记录下来。

    利用PHP自带的 stream_select 函数实现异步,利用这个函数使得 PHP 原生支持的异步调用实现,无须第三方服务或库。不过只能实现二段式异步调用,就是说会有明显的 Begin 和 End 两个阶段。
    (more…)

  • 关于Web编程异步模型的白日梦

    早上刷牙,处于半睡状态。突然想起昨天晚上看到的那个 go-lang 的 MVC 框架,若使用 go func() 方式异步获取数据,应当是不错的。窃喜……梦醒……

    在地铁上被前前后后那些特种男女逼到车角,无奈。又想起早上那个白日梦,遂上网搜索了一番。得老赵的佳作一篇《F# 与ASP.NET(1):基于事件的异步模式与异步Action》。之前看过,由于对微软无爱,未能细品。今日一读,如醍醐灌顶,豁然开朗。

    遂整理思路如下,以待后用。
    (more…)