深入理解PHP内核

Thinking In PHP Internal

附录D 怎样为PHP贡献

既然你在阅读本书,那说明你也是对PHP很感兴趣的读者,在窥探到PHP内部实现之后 或许也蠢蠢欲动想要共享自己的力量。下面进行一些简单的说明。

很多人以为为PHP做贡献(contribute)只是简单的为PHP提交补丁,其实在广义上来说, 为PHP做贡献有很多种方式,这包含但不限于:

  • 宣传和参与PHP的讨论
  • 发现和报告或者提到补丁修复PHP的bug
  • 编写和翻译PHP手册
  • 编写PHP相关的书籍
  • 写PHP相关技术的博客
  • 为PHP增加新功能
  • 编写和贡献PHP扩展或者库

所以很可能大部分的读者目前其实已经是在为PHP做贡献了。只不过如果你是本书的读者, 可能更想为PHP-Runtime做贡献,比如:修复PHP代码的bug,提交功能改进。

我们可能根据自己的特长来为PHP做贡献,如果你英语好,那么翻译手册将会是你的强项。 如果你的C比较好,那么可以为PHP修改bug,如果你对PHP语言的语法或者功能有改进想法, 你可以提交改进方法,当然如果你能将该功能实现出来那更好不过了。

下面介绍一下,为PHP做贡献的方方面面。

沟通方式

邮件组

在很多开源项目中,邮件组都是作为最主要的沟通方式,邮件组虽然古老,但是却很有效, 每个人都会有一个邮箱,可以快捷的使用邮件客户端来沟通,目前的邮件客户端都很好用, 可以根据主题进行汇总。Gmail和QQmail就做的不错。

PHP官方的邮件组都列在这里了: http://php.net/mailing-lists.php

IRC

国内IRC使用的不太多,PHP核心开发者都会在 http://www.efnet.org/ 的#php.pecl 频道。 如果你想直接找某个开发者,在#php.pecl频道应该可以找的到 :)

报告和修复Bug

PHP的bug可以在http://bugs.php.net上提交。在这里你可以提交和php相关的各种bug, 虽然是bug管理,其实这里还可以提出你的需求,比如你觉得PHP缺失某个功能, 你可以在这里提交。在提交的同时,如果你能提供实现补丁那再好不过了。没有补丁也没有关系, 如果这的确是个bug,根据紧急和难易程度可能会有同学帮你修复,如果是一个功能改进, 同时对PHP的改动比较大,那么这个需要提交到php-internals邮件组进行讨论, 如果已经有实现了,讨论充分后就可以进行投票了。如果通过投票,那么恭喜你。

这里的bug通指bug和feature,也就是非预期行为以及功能需求。

原则

这里的的Bug指的是PHP语言本身的bug,而不是应用程序的bug,比如某个函数的行为和预期不一致, 或者运行某段程序后PHP崩溃了,或者性能低下,你都可以提交报告。

这有一些基本的原则:

如果是bug:

  1. 你需要确认这的确是PHP的bug,而不是应用程序的bug
  2. 确认你使用正确,也就是是否和PHP手册文档使用一致
  3. 尽量用最少的代码来重现问题。这将有利于问题的追查

修复

如果你发现了PHP的一个bug,而同时你想到了解决方案,可以在[Github][http://github.com/php/php-src] 上提交一个Pull Request,或者也可以直接把修改的patch上传到你所提交的bug页

测试

在你发现了一个bug或者实现一个功能时,你需要为你的bug或者功能编写测试, 测试用例的编写可以参考附录E phpt测试文件说明

测试时可以使用make test TESTS=/path/to/your/bugXXXX.phpt 来进行测试。 通常如果是个bug,那么会将测试的名称命名为bugXXXX.phpt XXXX为bug的ID。

贡献功能

RFC (Request For Comments)

比如你觉得PHP不支持重载很不习惯,你想PHP支持这个特性,对于这个特性来说, 这是一个非常大的变动,这样的话你最好编写一个RFC说明一下你为什么需要这样一个特性。 因为PHP的用户量是非常大的,任何一个变动都会影响到非常多的人,所以你必须说服 绝大多数人赞同你的想法。

你的RFC可以放在任何地方,比如直接发送到邮件组讨论,或者放在github上, 不过通常,你可以把RFC放在PHP官方的wiki上方便讨论。

  1. https://wiki.php.net/start?do=register上申请一个账号。
  2. 发送邮件到: [email protected] 申请RFC的编写权限(Request for RFC karma), 同时你得提供你的wiki用户名,最好同时说明你要创建什么样的一个RFC。

好了后你就可以编写RFC了,具体流程见官方的说明吧:https://wiki.php.net/rfc/howto

邮件组讨论

编写好了后,[email protected]当然为了防止 你的RFC白写了,你可以直接把你的需求发送到邮件组看看大家的反应,看看大家是否 对这个特性或者变动感兴趣。

为了保证你收到大家的邮件,最好在http://php.net/mailing-lists.php订阅一下 邮件组的邮件,同时也推荐大家订阅这个邮件组,可以知道PHP发展的最新动态。

邮件发出来以后,大家可能会质疑你的想法,这时你就需要对家的疑问进行解答。 尽可能的把自己的想法表达清楚。

经过一番讨论后,如果感觉进展还可以,那么你就可以发起投票了。投票是在 wiki上进行的,可以参考https://wiki.php.net/rfc/trailing-comma-function-args

修改wiki后需要再给邮件组发送邮件,通知到大家来进行投票。

提议被接受的比如为:50%+1

代码实现

如果你已经实现了你想要的功能,记得在RFC中体现,很多时候有一些功能可能大家 都希望有,但是由于没有人来实现或者现有的实现不够好。如果有一个实现可能会 大大提高你的RFC被接受的可能性。

如果你不太熟悉PHP内核也没有关系,如果的确是个不错的主意,肯定会有人来帮你实现的。

所以如果你有不错的想法欢迎反馈

贡献PECL扩展

如果你写了一个扩展,想分享给大家可以通过pecl来发布你的扩展。

官方有明确的说明:http://pecl.php.net/account-request.php

不过在发起之前请留意: 1. 首先你要确保你的扩展的许可:推荐使用PHP3.0.1、BSD或者类Apache许可。 2. 你的扩展是否已经有个类似的实现了?如果有人也实现了,社区可能不太会认同。

Composer

从目前来看,目前很少有人维护pear的库了,和ruby社区的gem比起来太过冷清了。 目前一个新起之秀: http://getcomposer.org/ Composer表现不俗,目前绝大多数 的PHP开源项目都是用composer来进行包管理,所以你如果有开源库的话,也推荐使用composer。

改进和增加文档

目前PHP的文档还算比较全,不过随着版本的升级可能会有些文档没有跟上,或者有的地方 会有错误。PHP目前提供了一个方便的平台来协同维护文档。登陆:http://edit.php.net 即可对文档进行修改。修改后会有人对修改进行review,如果合适的话会把修改合并进去。

同时手册的中文版本也需要维护,所以如果你感兴趣也可以对文档进行翻译。

如果你有想法,可以参考:http://marc.info/?l=phpdoc&m=136370213519136&w=2