对HHVM的兼容始于2013年12月。到了2015年7月,我们自豪地宣布 完全兼容HHVM。Symfony 2.3和所有仍在维护的Symfony分支仍然兼容。这是一个漫长旅程,耗费了我们大量时间才达成。我们也得到了HHVM团队的支持,因为他们修复了我们在Symfonhy中难以企及的bug。
彼时,HHVM较之PHP的最大卖点在于性能。HHVM是一种比PHP快的方式。但时隔n久,PHP团队着手搞了一项研究,巨幅提升了PHP的性能。PHP7诞生了,HHVM与PHP之间的性能差异不再明显。
在进行了一次 Twitter投票 之后,我们决定在Symfony 4.0中拿掉对HHVM的支持。投票结果显示,Symfony社区中的HHVM的使用率极低 (仅有不到 4% 的人说他们正使用HHVM并且希望能继续得到Symfony的支持)。
但如果今日Symfony继续支持HHVM,为何我们还要从4.0中拿掉?如果HHVM和PHP半斤八两 (相同功能,相同bug,相同行为 ...),支持一下便不是问题。但现实非如此。某些PHP 7+的功能(尚且)不能够使用在HHVM中。Symfony代码中拥有关乎HHVM的大量存在。我们的核心扩展团队中根本没人使用HHVM。更重要的是,当我们决定在 composer.json
中强行约束PHP最低版本是7+时,我们意识到没有办法让代码通过测试。第一个障碍就是,使用PHP 7时,Composer不兼容 HHVM。而这问题是一年前存在的。当我半年前差不多要发布Twig 2.0时,我发现了这问题并尝试令其能够运行。但没有任何改观。看起来像是PHP的兼容性已经不再优先考虑HHVM团队。
由于使用率太低,兼容性问题,不明显的性能差距,我们除了在Symfony 4中放弃官方支持别无选择。
然而我们将在Symfony 3.4中保持HHVM的相关代码,这表明那些使用了HHVM的项目仍然能够在Symfony中使用HHVM直到2020年11月 (因为3.4是3年期的LTS长期维护版本)。这便给了足够的时间来从HHVM中,或从Symfony中迁移出来。
Symfony在PHP项目中不是第一个放弃对HHVM支持的。Doctrine, CakePHP, 以及 MongoDB 皆已放弃或即将放弃对 HHVM 的支持 (就像在Twitter投票中的留言那样)。Laravel自打5.3以来 (9个月之前发布的) 就放弃了支持。我可以预见有更多的PHP库会放弃支持,因为它们将面对PHP7条件下和Symfony相同的问题。
这也是为何我作出从我的其他重要项目比如Twig(2.0起), Silex, 以及 Swiftmailer中,放弃对HHVM的支持之决定的原因。
在 HHVM repository 上我还创建了一个pull request以求 从HHVM兼容性测试矩阵中移除我的项目 。因为我们不希望人们认为Symfony仍然在兼容HHVM,然而实际上却未通过适当的测试。更重要的是,测试是跑在一个超老且不再受到维护的Symfony版本 (2.4.8)。我希望其他项目宜做出同样举动以避免迷惑。