Improved PHP performance for core blocks registration


Early block.json Registration Method
Starting with WordPress 5.8, extenders were encouraged to begin to utilize block.json to register blocks through a unified registration process. The benefits offered by this update provide consistency and convenience when registering blocks through PHP or JavaScript.
However, while this block.json scanning convention is extremely convenient, it does add additional processing when core blocks are instantiated. On each page load, block registration undergoes the following steps:
- Scan folders for
block.jsonfiles. - When a
block.jsonfile is found, read its contents into memory. - Call
json_decodeon the file contents to convert it to a PHP array. - Register the block using the decoded data.
With over 70 core block files to scan and load, this presented an opportunity for optimization.
Core Block Registration Update
To reduce filesystem reads and processing of block.json files, which should benefit all WordPress sites and improve performance, block registration has been updated to:
- Introduce a new Grunt task (
copy:block-json) that scans and converts coreblock.jsonfiles to PHP arrays and stores them in a singleblocks-json.phpat build time. - Use the new
blocks-json.phpfile in theregister_block_type_from_metadata()function. - Assign the block registration data to a static variable (cache) so that it’s only loaded once per request.
The addition of an extra build task to compile the decoded JSON data to PHP reduces block registration filesystem reads from ~70 files to just a single file. And since blocks-json.php is a native PHP array, it can be used directly without additional conversion.
The conversion from block.json files to PHP arrays is achieved through the json2php package, which is already utilized in Core and Gutenberg.
References
- Trac #55005: Improve PHP performance for block.json files
- PR #2252: Improve block loading PHP performance
Props to @aristath for source material and collaboration, and to @milana_cap for review of this dev note.


