Cet article est aussi disponible en français.
The month of May 2014 that’s just ended has seen 816 messages on PHP’s
internals@ mailing-list. After a calm month of April, we’re back to a higher volume of discussions!
As a graph representing the number of mails per month for the last three years, we’d get (the full history since 1998 is available here):
The initial idea started with the fact the PHP engine works with data-structures that always require memory allocations and reference counting – a typical PHP application can spend 20% of its CPU time managing memory, 10% manipulating HashTables, 30% in internal functions and only 30% in the VM. Reworking internal data-structures to minimize memory allocations should help with that.
This means a great deal of refactoring (4 months of work) has been done on the PHP engine. It improves performance, memory usage, and sets up the first steps that could be used as a foundation for other future evolutions, such as JIT compiling.
This work is, of course, not finished yet (it would require at least a couple of months before one could consider it as
alpha), but people quickly suggested it could be one of the big things for PHP 6 – which could be released in something like two years.
phpng should not have any impact on behavior has seen by users, but it will require updates on all PHP extensions to adapt them (changes on data-structures used internally by PHP have to be taken into account by extensions, as they are close to PHP itself). To document the migration to phpng for developers of PHP or extensions, a wiki page has been initialized: Upgrading from PHP5 to NG.
During the conversation, the idea of removing old SAPIs has been talked about once again – some going as far as suggesting that
mod_php should not be supported anymore, as it’s often better to replace it with
nginx/php-fpm. Still, even if those have a better architecture, one must not forget that swapping a component has a cost.
Pierre Joye quickly noticed the
phpng branch conflicts with the work done since several months on 64 bits support (it has not been merged to PHP 5.x branch as it brings too many changes). To prevent this kind of situation from happening again, it really is necessary to communicate more – and working in an open mode would allow more developers to help.
He then posted a few numbers about the impact the
64bits branch has on memory usage: it needs between 2% and 5.5% more memory on real applications. The relative impact would be greater with the
phpng branch, as it changes several internal data-structures. If you want to know more, here are a few notes about the goals of this branch.
A bit later, Anatol Belski announced votes were opened on the corresponding RFC: 64 bit platform improvements for string length and integer in zval. In the thread, Ferenc Kovacs summarized part of the problem: on one side,
phpng aims to improve performances and reduce memory usage, and, on the other side, the
64bits branch aims to get better internal typing while using a bit more memory.
As discussions weren’t really constructive anymore, Nikita Popov suggested to find a common ground, using some evolutions from the
64bits branch (64 bits integers, unsigned-sizes, size_t for strings' length) but not going to 64 bits where it costs too much memory and corresponds to less interesting features (lines numbers, numbers of parameters, HashTables sizes).
This proposal has been quite appreciated. As Rasmus Lerdorf answered, this idea is coherent and takes into account work done on both sides. Because of problems with the mailing-list, a new RFC has not been created right away and sould land soon.
At the end of the month, after a post writen by Joe Watkins about phpng had appeared on php.net, Ferenc Kovacs asked what should be done about it: keep it as-is, delete it, re-write it to be more formal and more factual, or post another article clarifying the matter is still subject to controversy and this post was more the personal opinion of one developer than an official statement.
Several expressed their surprise about this post, as php.net is not supposed to be used as a personal blog. In addition, as many websites had already re-posted the news, just deleting it did not seem to be the best approach – but, in the same time, it’s probably too early to begin talking officially about these evolutions and this post was not really formulated in a way that was objective and professional.
Still, as Philip Sturgeon said, several high-traffic websites had already started talking about phpng – not always successfully summarizing what it is and what it means for the future of PHP (and, of course, posting about PHP in a negative way is often a good way to generate traffic).
Levi Morrison then brought some explanations about the idea behind this post: as “phpng” was being talked about in the community, bringing some clarifications about it was a reasonable idea. In a way, it could be perceived as an attempt to communicate towards developers using PHP, about what was being discussed on
internals@1; and trying to move forward is never easy.
Joe Watkins added he didn’t intend to post a news on php.net and was trying to launch a developers blog. This idea, by the way, is close to one of the missions of planet-php. In fact, this idea of “blog of developers”, with posts about what’s happening around the development of PHP and
internals@, is kind of what I didn’t find when I begun posting these digests – even if it would be interesting having posts going farther into details, less in a “digest” mode.
Introducing a large amount of new macros and a more verbose syntax seems to be of interest to some, but others noted this would lead to heavier code. As Pierre Joye said, it would also be great to clean internal APIs: a more pleasing code-base would facilitate work for the next 10 years.
On the other hand, a gain of a few percents (between 2% and 5%) on performances, while only updating the most important functions… In effect, The RFC should insist of the fact the idea is to update only a few functions of PHP.
Stas Malyshev announced the RFC: Keeping PHPT Tests Green had passed, with 16 “yes” votes and no vote “against”. When a test doesn’t pass anymore, two solutions are possible: revert the change that broke it (after two days), or update the test. Of course, the second option should only be chosen when the new behavior is expected.
In the following days, Stas Malyshev sent some mails when changes broke the build, asking for the corresponding problems to be fixed. Reactions have been quite positive, and this should be a good thing for stability.
Andrea Faulds indicated that, in order to pass, an RFC needs 50%+1 votes “for” – and 2/3 votes “for” if it’s about a change that impacts the language itself. That being said, he noted that “change impacting the language” is not always easy to judge and that “50%+1 to pass” means some RFCs can be accepted even if they only have a small majority.
As a consequence, he proposed that all RFCs could now require 2/3 of “yes” votes in order to pass. This way, only changes well accepted by developers would pass (in effect, all RFCs that have been accepted for PHP 5.6 had at least 2/3 of “yes” votes – which means this idea would not really stop PHP from evolving).
Zeev Suraski answered that 50%+1 was, in his opinion, good enough for changes on extensions, functions, version numbers – basically, for targeted changes with no impact on the general direction PHP is going to. On the other hand, it could be interesting if only developers really concerned by a change could vote on it (for instance, developers working on the engine would vote for a central change, while those working on documentation would vote on changes linked to it). Still, as Andrea Faulds answered, changes on the Zend layer will tend to impact everyone.
Actually, as Dmitry Stogov indicated, some changes on the engine require a real technical expertise to be understood. And this technical expertise could help getting to better solutions – which is something that’s sometimes being done, as several recent RFCs have been written by teams of developers, with newcomers being guided by more ancient ones.
In the end, judging for the discussion, these 50%+1 and 2/3 will probably remain as they are today – and the distinction between the two types of RFCs should be made more clear.
A few mails arrived in the thread about the RFC: Return Type Declarations. Mainly, the proposed syntax has the advantage of being similar to what’s used by other languages and to be compatible with the one chosen by Hack.
Josh Watzman posted some notes about some incompatibilities between this RFC and Hack’s implementation. For example, Hack uses
this as return type where PHP would prefer
After points of views had sometimes been expressed with a bit of vehemence, Levi Morrison reminded us that, even if each one can have his own vision of how PHP could be improved, the goal of everyone is the same – and he posted a list of a few points he considers as OK or not.
Martin Keckeis suggested for PEAR to not be integrated to PHP’s sources anymore. Still, as Hannes Magnusson answered, PEAR is also used to install PECL extensions – which means it is still useful and cannot be removed for now.
Michael Wallner said he started thinking about the loading of extensions that depend on others (today, it’s up the the user to deal with that himself, to load those extensions in the right order). Julien Pauli answered that something had been started on the subject a while ago and it could be interesting to share ideas. As a matter of facts, as noted by Hannes Magnusson, the extension mechanism might need more work than this single point!
Sara Golemon wrote the RFC: Add typehint accessors to
ReflectionParameter which aims to have better handling of type-hints when using Reflection. Levi Morrison noted that taking into account the RFCs on return types and nullable types could be useful too; and, as a consequence, the RFC has been updated.
Sara Golemon also wrote the RFC: Fix handling of custom session handler return values – as the corresponding fix breaks backward-compatibility, an RFC can be required (at least, to decide for which PHP version this can be done).
email@example.com is the mailing-list of the developers of PHP; it is used to discuss the next evolutions of the language and to talk about enhancement suggestions or bug reports.
This mailing-list is public and anyone can subscribe from the page Mailing Lists, or read its archives using HTTP from php.internals or through the news server
zend_parse_parameters()is the C function used internally by all functions of PHP and its extensions when they need to receive parameters. This changes would, as a consequence, be invisible for developers using PHP. ↩︎