实战Guzzle抓取

虽然早就知道很多人用 Guzzle 爬数据,但是我却从来没有真正实践过,因为在我的潜意识里,抓取是 Python 的地盘。不过前段时间,当我抓汽车之家数据的时候,好心人跟我提起 Goutte 搭配 Guzzle 是最好的爬虫,让我一直记挂在心上,加上最近打算更新一下车型数据,于是我便重写了抓取汽车之家数据的脚本。

继续阅读

谈谈PHP的Reload操作

通常修改了 PHP 的配置后,为了让修改生效会执行 reload,而不是 restart,因为有很多前辈告诫过我们,reload 能保证整个过程的平滑性,所谓平滑性指的是在 reload 的过程中,旧的进程在处理完当前请求前不会提前终止。很多年来,我一直坚信这个结论,直到有一天,当我 reload 的时候,出现了 502 错误,让我不得不重新思考。

继续阅读

一个PHP实现的ID生成器

通常来说,不管使用什么数据库,表里都有一个名为 id 的主键,既然是主键,那么必然要满足唯一性,对于 MySQL 用户来说,它多半是一个 auto_increment 自增字段,也有一些别的用户喜欢使用 UUID 做主键,不过对 MySQL(特别是 InnoDB)来说,UUID 通常不是一个好选择,因为聚簇索引要求物理数据按照主键排序,而 UUID 本身是无序的,所以会带来很多不必要的 IO 消耗。于是乎我们得到一个结论:ID 最好是顺序的唯一值。

继续阅读

实战Pinba

谁都知道监控系统很重要,但是要自己搭建一套好用的系统却不是一件简单的事情。国内已经有不少厂商提供类似的服务,比如:OneAPM听云,其原理就是通过在服务器上部署一套探针,把数据汇总上报,但是问题却不像说起来这么简单,我曾经买过国内某个厂商高大上的 APM 服务,谁知道它监控的指标太多了,并且无法自定义,结果导致一上线,系统性能就下降百分之二十,最后无奈只好放弃。

继续阅读

如何正确发布PHP代码

几乎每一个 PHP 程序员都发布过代码,可能是通过 ftp 或者 rsync 同步的,也可能是通过 svn 或者 git 更新的。一个活跃的项目可能每天都要发布若干次代码,但是现实却是很少有人注意其中的细节,实际上这里面有好多坑,很可能你就在坑中却浑然不知。

继续阅读

Dependency Injection 和 Service Locator

如果说学院派的 Java 程序员骨子里都浸淫着学究范儿的话,那么游击队出身的 PHP 程序员则从头到脚洋溢着乡土气息。通常他们不太在意理论,一切以实现为先,虽然这样的做法在项目早期能获得不错的收益,但是随着项目的推进,复杂度的提升,缺乏理论基础的弊端终将显现。好在 PHP 社区没有裹足不前,比如说十几年前 Java 社区中流行的 IoC 概念,最近一两年终于被 PHP 社区所接纳。

继续阅读