xref: /php-src/UPGRADING (revision f68d7252)
1PHP 8.4 UPGRADE NOTES
2
31. Backward Incompatible Changes
42. New Features
53. Changes in SAPI modules
64. Deprecated Functionality
75. Changed Functions
86. New Functions
97. New Classes and Interfaces
108. Removed Extensions and SAPIs
119. Other Changes to Extensions
1210. New Global Constants
1311. Changes to INI File Handling
1412. Windows Support
1513. Other Changes
1614. Performance Improvements
17
18========================================
191. Backward Incompatible Changes
20========================================
21
22- CLI:
23  . The builtin server looks for an index file recursively by traversing parent
24    directories in case the specified file cannot be located. This process was
25    previously skipped if the path looked like it was referring to a file, i.e.
26    if the last path component contained a period. In that case, a 404 error was
27    returned. The behavior has been changed to look for an index file in all
28    cases.
29
30- Core:
31  . The type of PHP_DEBUG and PHP_ZTS constants changed to bool.
32
33- DOM:
34  . Added DOMNode::compareDocumentPosition() and DOMNode::DOCUMENT_POSITION_*
35    constants.
36    If you have a method or constant with the same name, you might encounter errors
37    if the declaration is incompatible.
38  . Some DOM methods previously returned false or a PHP_ERR DOMException if a new
39    node could not be allocated. They consistently throw an INVALID_STATE_ERR
40    DOMException now. This situation is extremely unlikely though and probably
41    will not affect you. As a result DOMImplementation::createDocument() now has
42    a tentative return type of DOMDocument instead of DOMDocument|false.
43  . Previously, DOMXPath objects could be cloned, but resulted in an unusable
44    object. This is no longer possible, and cloning a DOMXPath object now throws
45    an error.
46
47- Intl:
48  . resourcebundle_get(), ResourceBundle::get(), and accessing offsets on a
49    ResourceBundle object now throw:
50    - TypeError for invalid offset types
51    - ValueError for an empty string
52    - ValueError if the integer index does not fit in a signed 32 bit integer
53
54- MBString:
55  . mb_encode_numericentity() and mb_decode_numericentity() now check that
56    the $map is only composed of integers, if not a ValueError is thrown.
57  . mb_http_input() now always throws a ValueError if the $type is invalid.
58  . mb_http_output() now checks that the $encoding parameter does not
59    contain any null bytes. If it does, a ValueError is now thrown.
60  . On invalid strings (those with encoding errors), mb_substr() now interprets
61    character indices in the same manner as most other mbstring functions. This
62    means that character indices returned by mb_strpos() can be passed to mb_substr().
63  . For SJIS-Mac (MacJapanese) strings, character indices passed to mb_substr() now
64    refer to the indices of the Unicode codepoints which are produced when the string
65    is converted to Unicode. This is significant because around 40 SJIS-Mac characters
66    convert to a sequence of multiple Unicode codepoints.
67
68- ODBC:
69  . odbc_fetch_row() returns false when a value less than or equal to 0 is
70    passed for parameter $row. Now, a warning is emitted in this case.
71
72- Opcache:
73  . The JIT config defaults changed from opcache.jit=tracing and
74    opcache.jit_buffer_size=0 to opcache.jit=disable and
75    opcache.jit_buffer_size=64M, respectively. This does not affect the default
76    behavior, the JIT is still disabled by default. However, it is now disabled
77    through the opcache.jit setting, rather than opcache.jit_buffer_size. This
78    may affect users who previously enabled JIT through opcache.jit_buffer_size
79    exclusively, without also specifying a JIT mode using opcache.jit. To enable
80    JIT, set the opcache.jit config value accordingly.
81  . The maximum value of the opcache.interned_strings_buffer setting on 64bit
82    architectures is now 32767 (it was previously 4095).
83
84- PCRE:
85  . The bundled pcre2lib has been updated to version 10.43.
86    As a consequence, this means {,3} is now recognized as a quantifier instead
87    of as text. Furthermore, the meaning of some character classes in UCP mode
88    has changed. Consult https://github.com/PCRE2Project/pcre2/blob/master/NEWS
89    for a full changelog.
90
91- PDO_DBLIB:
92  . setAttribute, DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER and DBLIB_ATTR_DATETIME_CONVERT
93    have been changed to set value as a bool.
94
95- PDO_FIREBIRD:
96  . getAttribute, ATTR_AUTOCOMMIT has been changed to get the value as a bool.
97
98- PDO_MYSQL:
99  . getAttribute, ATTR_AUTOCOMMIT, ATTR_EMULATE_PREPARES, MYSQL_ATTR_DIRECT_QUERY have
100    been changed to get values as bool.
101
102- PDO_PGSQL:
103  . The DSN's credentials, when set, are given priority over their PDO
104    constructor counterparts, being closer to the documentation states.
105
106- PCNTL:
107  . The functions pcntl_sigprocmask(), pcntl_sigwaitinfo() and
108    pcntl_sigtimedwait() now throw:
109    - A ValueError if the $signals array is empty (except for
110      pcntl_sigprocmask() if the $mode is SIG_SETMASK).
111    - A TypeError if a value of the $signals array is not an integer
112    - A ValueError if a value of the $signals array is not a valid signal number
113    Moreover, those functions now always return false on failure.
114    In some case previously it could return the value -1.
115  . The function pcntl_sigprocmask() will also now throw:
116    - A ValueError if $mode is not one of SIG_BLOCK, SIG_UNBLOCK, or SIG_SETMASK
117  . The function pcntl_sigtimedwait() will also now throw:
118    - A ValueError if $seconds is less than 0
119    - A ValueError if $nanoseconds is less than 0 or greater than 1e9
120    - A ValueError if both $seconds and $nanoseconds are 0
121
122- SimpleXML:
123  . Get methods called, or casting to a string on a SimpleXMLElement will no
124    longer implicitly reset the iterator data, unless explicitly rewound.
125    For example, casting an element to a string within a foreach loop would
126    cause an infinite loop because it destroyed the current iterator data.
127    This is no longer the case as a consequence of the bugfixes for GH-12192,
128    GH-12208, #55098.
129  . Calling simplexml_import_dom() with a non-XML object now throws a TypeError
130    instead of a ValueError.
131
132- SPL:
133  . Out of bounds accesses in SplFixedArray now throw an exception of type
134    OutOfBoundsException instead of RuntimeException. As OutOfBoundsException
135    is a child class of RuntimeException, code that uses RuntimeException
136    continues to function.
137
138- Standard:
139  . round() now validates the value of the $mode parameter and throws a ValueError
140    for invalid modes. Previously invalid modes would have been interpreted as
141    PHP_ROUND_HALF_UP.
142  . strcspn() with empty $characters now returns the length of the string instead
143    of incorrectly stopping at the first NUL character. See GH-12592.
144
145- XML:
146  . The xml_set_*_handler() functions now declare and check for an effective
147    signature of callable|string|null for the $handler parameters.
148    Moreover, values of type string that correspond to method names,
149    of object set with xml_set_object() are now checked to see if the method
150    exists on the class of the previously passed object.
151    This means that xml_set_object() must now always be called prior to setting
152    method names as callables.
153    Passing an empty string to disable the handler is still allowed,
154    but not recommended.
155
156- XSL:
157  . XSLTProcessor::setParameter() will now throw a ValueError when its arguments
158    contain null bytes. This never actually worked correctly in the first place,
159    which is why it throws an exception nowadays.
160  . Failure to call a PHP function callback during evaluation now throws
161    instead of emitting a warning.
162    RFC: https://wiki.php.net/rfc/improve_callbacks_dom_and_xsl
163  . Calling XSLTProcessor::importStyleSheet() with a non-XML object now throws
164    a TypeError instead of a ValueError.
165
166========================================
1672. New Features
168========================================
169
170- Core:
171  . Added request_parse_body() function that allows parsing RFC1867 (multipart)
172    requests in non-POST HTTP requests.
173    RFC: https://wiki.php.net/rfc/rfc1867-non-post
174  . Getting the debug info for WeakReference will now also output the object
175    it references, or null if the reference is no longer valid.
176  . The output of Closure::__debugInfo() now includes the name, file, and line
177    of the Closure.
178
179- Curl:
180  . curl_version() returns an additional feature_list value, which is an
181    associative array of all known Curl features, and whether they are
182    supported (true) or not (false).
183
184- Date:
185  . Added static methods
186    DateTime[Immutable]::createFromTimestamp(int|float $timestamp): static.
187  . Added method DateTime[Immutable]::getMicrosecond(): int.
188  . Added method
189    DateTime[Immutable]::setMicrosecond(int $microsecond): static.
190
191- DOM:
192  . Added constant DOMNode::DOCUMENT_POSITION_DISCONNECTED.
193  . Added constant DOMNode::DOCUMENT_POSITION_PRECEDING.
194  . Added constant DOMNode::DOCUMENT_POSITION_FOLLOWING.
195  . Added constant DOMNode::DOCUMENT_POSITION_CONTAINS.
196  . Added constant DOMNode::DOCUMENT_POSITION_CONTAINED_BY.
197  . Added constant DOMNode::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC.
198  . It is now possible to pass any callable to registerPhpFunctions().
199    RFC: https://wiki.php.net/rfc/improve_callbacks_dom_and_xsl
200
201- FPM:
202  . Flushing headers without a body will now succeed. See GH-12785.
203
204- Intl:
205  . NumberFormatter::ROUND_HALFODD added to complement existing
206    NumberFormatter::ROUND_HALFEVEN functionality.
207
208- Phar:
209  . Added support for the unix timestamp extension for zip archives.
210
211- PCRE:
212  . The bundled pcre2lib has been updated to version 10.43.
213    As a consequence, LoongArch JIT support has been added, spaces
214    are now allowed between braces in Perl-compatible items, and
215    variable-length lookbehind assertions are now supported.
216  . Added support for the "r" (PCRE2_EXTRA_CASELESS_RESTRICT) modifier, as well
217    as the (?r) mode modifier. When enabled along with the case-insensitive
218    modifier ("i"), the expression locks out mixing of ASCII and non-ASCII
219    characters.
220
221- PDO:
222  . Added support for driver-specific subclasses.
223    RFC: https://wiki.php.net/rfc/pdo_driver_specific_subclasses
224    This RFC adds subclasses for PDO in order to better support
225    database-specific functionalities. The new classes are
226    instantiatable either via calling the PDO::connect() method
227    or by invoking their constructor directly.
228
229- PDO_DBLIB:
230  . Added class PdoDbLib.
231
232- PDO_FIREBIRD:
233  . Added class PdoFirebird.
234
235- PDO_MYSQL:
236  . Added class PdoMysql.
237
238- PDO_ODBC:
239  . Added class PdoOdbc.
240
241- PDO_PGSQL:
242  . Added class PdoPgsql.
243
244- PDO_SQLITE:
245  . Added class PdoSqlite.
246
247- POSIX:
248  . Added constant POSIX_SC_CHILD_MAX
249  . Added constant POSIX_SC_CLK_TCK
250
251- Readfile:
252  . Added ability to change .php_history path through PHP_HISTFILE env variable.
253
254- Reflection:
255  . ReflectionAttribute now contains a $name property to improve the debugging
256    experience.
257  . ReflectionClassConstant::__toString() and ReflectionProperty::__toString()
258    now returns the attached doc comments.
259  . ReflectionConstant was introduced.
260
261- Standard:
262  . stream_bucket_make_writeable() and stream_bucket_new() will now return a
263    StreamBucket instance instead of an stdClass instance.
264    RFC: https://wiki.php.net/rfc/dedicated_stream_bucket
265
266- SOAP:
267  . Added support for clark notation for namespaces in class map.
268    It is now possible to specify entries in a class map with clark notation
269    to resolve a type with a specific namespace to a specific class.
270    For example: '{http://example.com}foo' => 'FooClass'.
271  . Instances of DateTimeInterface that are passed to xsd:datetime or similar
272    elements are now serialized as such instead of being serialized as an
273    empty string.
274
275- XSL:
276  . It is now possible to use parameters that contain both single and double
277    quotes.
278  . It is now possible to pass any callable to registerPhpFunctions().
279    RFC: https://wiki.php.net/rfc/improve_callbacks_dom_and_xsl
280  . Added XSLTProcessor::$maxTemplateDepth and XSLTProcessor::$maxTemplateVars
281    to control the recursion depth of XSL template evaluation.
282
283========================================
2843. Changes in SAPI modules
285========================================
286
287========================================
2884. Deprecated Functionality
289========================================
290
291- Core:
292  . Implicitly nullable parameter types are now deprecated.
293    RFC: https://wiki.php.net/rfc/deprecate-implicitly-nullable-types
294
295- Curl:
296  . The CURLOPT_BINARYTRANSFER constant is deprecated.
297
298- Date:
299  . Calling DatePeriod::__construct(string $isostr, int $options = 0) is
300    deprecated. Use DatePeriod::createFromISO8601String() instead.
301
302- Intl:
303  . Calling intlcal_set() as well as calling IntlCalendar::set() with
304    more than 2 arguments is deprecated. Use either IntlCalendar::setDate()
305    or IntlCalendar::setDateTime() instead.
306  . Calling intlgregcal_create_instance() as well as calling
307    IntlGregorianCalendar::__construct() with more than 2 arguments is
308    deprecated. Use either IntlGregorianCalendar::createFromDate() or
309    IntlGregorianCalendar::createFromDateTime() instead.
310
311- LDAP:
312  . Calling ldap_connect() with more than 2 arguments is deprecated. Use
313    ldap_connect_wallet() instead.
314  . Calling ldap_exop() with more than 4 arguments is deprecated. Use
315    ldap_exop_sync() instead.
316
317- PgSQL:
318  . Calling pgsql_fetch_result() with 2 arguments is deprecated. Use the
319    3-parameter signature with a null $row parameter instead.
320  . Calling pg_field_prtlen() with 2 arguments is deprecated. Use the
321    3-parameter signature with a null $row parameter instead.
322  . Calling pg_field_is_null() with 2 arguments is deprecated. Use the
323    3-parameter signature with a null $row parameter instead.
324
325- Reflection:
326  . Calling ReflectionMethod::__construct() with 1 argument is deprecated.
327    Use ReflectionMethod::createFromMethodName() instead.
328
329- Session:
330  . Calling session_set_save_handler() with more than 2 arguments is
331    deprecated. Use the 2-parameter signature instead.
332
333- Standard:
334  . Calling stream_context_set_option() with 2 arguments is deprecated.
335    Use stream_context_set_options() instead.
336
337========================================
3385. Changed Functions
339========================================
340
341- Core:
342  . trigger_error() and user_error() now have a return type of true instead of
343    bool.
344
345- DOM:
346  . DOMDocument::registerNodeClass() now has a tentative return type of true.
347    Previously, the return type was bool but only true could be returned in practice.
348
349- Gettext:
350  . bind_textdomain_codeset, textdomain and d(*)gettext functions now throw an exception
351    if the domain argument is empty.
352
353- Hash:
354  . Changed the return type of hash_update() to true. It was already the case that only
355    true could be returned, but the stub was not updated yet.
356
357- Intl:
358  . IntlDateFormatter::__construct() throws a ValueError if the locale is invalid.
359  . NumberFormatter::__construct() throws a ValueError if the locale is invalid.
360  . NumberFormatter::ROUND_TOWARD_ZERO and NumberFormatter::ROUND_AWAY_FROM_ZERO
361    have been added as aliases for NumberFormatter::ROUND_DOWN and
362    NumberFormatter::ROUND_UP to be consistent with the new PHP_ROUND_* modes.
363    RFC: https://wiki.php.net/rfc/new_rounding_modes_to_round_function
364  . ResourceBundle::get() now has a tentative return type of:
365    ResourceBundle|array|string|int|null
366
367- MBString:
368  . The behavior of mb_strcut is more consistent now on invalid UTF-8 and UTF-16
369    strings. (For valid UTF-8 and UTF-16 strings, there is no change.)
370
371- OpenSSL:
372  . The extra_attributes parameter in openssl_csr_new sets CSR attributes
373    instead of subject DN which was incorrectly done previously.
374  . The dn parameter in openssl_csr_new allows setting array of values for
375    a single entry.
376  . New serial_hex parameter added to openssl_csr_sign to allow setting serial
377    number in the hexadecimal format.
378
379- ODBC:
380  . Parameter $row of odbc_fetch_object(), odbc_fetch_array(), and
381    odbc_fetch_into() now has a default value of null, consistent with
382    odbc_fetch_row(). Previously, the default values were -1, -1, and 0,
383    respectively.
384
385- Output:
386  . Output handler status flags passed to the flags parameter of ob_start
387    are now cleared.
388
389- PDO:
390  . getAttribute, enabled to get the value of ATTR_STRINGIFY_FETCHES.
391
392- PDO_FIREBIRD:
393  . getAttribute, enabled to get values of FB_ATTR_DATE_FORMAT, FB_ATTR_TIME_FORMAT,
394    FB_ATTR_TIMESTAMP_FORMAT.
395  . Added new attributes to specify transaction isolation level and access mode.
396    Along with these, five constants (PDO::FB_TRANSACTION_ISOLATION_LEVEL,
397    PDO::FB_READ_COMMITTED, PDO::FB_REPEATABLE_READ, PDO::FB_SERIALIZABLE,
398    PDO::FB_WRITABLE_TRANSACTION) have been added.
399  . When using persistent connections, there is now a liveness check in the
400    constructor.
401
402- PDO_MYSQL:
403  . getAttribute, enabled to get the value of ATTR_FETCH_TABLE_NAMES.
404
405- PGSQL:
406  . pg_select, the conditions arguments accepts an empty array and is optional.
407
408- POSIX:
409  . posix_isatty now sets the error number when the file descriptor/stream argument
410    is invalid.
411
412- Sockets:
413  . Parameter $backlog of socket_create_listen() now has a default value of SOMAXCONN.
414    Previously, it was 128.
415
416- SPL:
417  . SplPriorityQueue::insert() and SplPriorityQueue::recoverFromCorruption()
418    now has a tentative return type of true
419  . SplHeap::insert() and SplHeap::recoverFromCorruption()
420    now has a tentative return type of true instead of bool
421
422- Standard:
423  . The internal implementation for rounding to integers has been rewritten
424    to be easier to verify for correctness and to be easier to maintain.
425    Some rounding bugs have been fixed as a result of the rewrite. For
426    example previously rounding 0.49999999999999994 to the nearest integer
427    would have resulted in 1.0 instead of the correct result 0.0. Additional
428    inputs might also be affected and result in different outputs compared to
429    earlier PHP versions.
430  . The default value of the 'cost' option for PASSWORD_BCRYPT for password_hash()
431    has been increased from '10' to '12'.
432
433    RFC: https://wiki.php.net/rfc/bcrypt_cost_2023
434  . Four new modes have been added to the round() function: PHP_ROUND_CEILING,
435    PHP_ROUND_FLOOR, PHP_ROUND_TOWARD_ZERO, PHP_ROUND_AWAY_FROM_ZERO.
436
437    RFC: https://wiki.php.net/rfc/new_rounding_modes_to_round_function
438  . debug_zval_dump() now indicates whether an array is packed.
439  . Fixed a bug caused by "pre-rounding" of the round() function. Previously, using
440    "pre-rounding" to treat a value like 0.285 (actually 0.28499999999999998) as a
441    decimal number and round it to 0.29. However, "pre-rounding" incorrectly rounds
442    certain numbers, so this fix removes "pre-rounding" and changes the way numbers
443    are compared, so that the values are correctly rounded as decimal numbers.
444  . long2ip() now returns string instead of string|false.
445  . The maximum precision that can be handled by round() has been extended by
446    one digit.
447  . output_add_rewrite_var() now uses url_rewriter.hosts instead of
448    session.trans_sid_hosts for selecting hosts that will be rewritten.
449
450========================================
4516. New Functions
452========================================
453
454- DOM:
455  . Added DOMNode::compareDocumentPosition().
456  . Added DOMXPath::registerPhpFunctionNS().
457    RFC: https://wiki.php.net/rfc/improve_callbacks_dom_and_xsl
458  . Added DOMXPath::quote() to quote a string for use in an XPath expression.
459    Example usage: "//span[contains(text()," . $xpath->quote($string) . ")]"
460
461- Intl:
462  . Added IntlDateFormatter::getIanaID()/intltz_get_iana_id() to
463    the IANA identifier from a given timezone.
464  . Added grapheme_str_split which allow to support emoji and Variation
465    Selectors.
466
467- MBString:
468  . Added mb_trim, mb_ltrim and mb_rtrim functions.
469    RFC: https://wiki.php.net/rfc/mb_trim
470    Note: this was amended by GH-13820 to fix GH-13815.
471  . Added mb_ucfirst and mb_lcfirst functions.
472    RFC: https://wiki.php.net/rfc/mb_ucfirst
473
474- Opcache:
475  . If JIT is enabled, PHP will now exit with a fatal error on startup in case
476    of JIT startup initialization issues.
477
478- PCNTL:
479  . Added pcntl_setns allowing a process to be reassociated with a namespace in order
480    to share resources with other processes within this context.
481  . Added pcntl_getaffinity to get the cpu(s) bound to a process and
482    pcntl_setaffinity to bind 1 or more cpus to a process.
483  . Added pcntl_getcpu to get the cpu id from where the current process runs.
484  . Added pcntl_getqos_class to get the QoS level (aka performance and related
485    energy consumption) of the current process and pcntl_setqos_class to set it.
486
487- Sodium:
488  . Added the sodium_crypto_aead_aegis128l_*() and sodium_crypto_aead_aegis256l_*()
489    functions to support the AEGIS family of authenticated encryption algorithms,
490    that was introduced in libsodium 1.0.19.
491  . sodium_crypto_aead_aes256gcm_*() functions are now enabled on aarch64 CPUs
492    with the ARM cryptographic extensions.
493
494- Standard:
495  . Added the http_get_last_response_headers() and
496    http_clear_last_response_headers() that allows retrieving the same content
497    as the magic $http_response_header variable.
498
499- XSL:
500  . Added XSLTProcessor::registerPhpFunctionNS().
501    RFC: https://wiki.php.net/rfc/improve_callbacks_dom_and_xsl
502
503========================================
5047. New Classes and Interfaces
505========================================
506
507- DOM:
508  . Implemented DOM HTML5 parsing and serialization.
509    RFC: https://wiki.php.net/rfc/domdocument_html5_parser.
510    This RFC adds the new DOM namespace along with new classes and
511    constant aliases.
512    There are two new classes to handle HTML and XML documents:
513    DOM\HTMLDocument and DOM\XMLDocument.
514    These classes provide a cleaner API to handle HTML and XML documents.
515    Furthermore, the DOM\HTMLDocument class implements spec-compliant HTML5
516    parsing and serialization.
517  . Implemented opt-in ext/dom spec compliance RFC.
518    This adds new classes in the DOM namespace that correspond to modern
519    equivalents to the old DOM classes in the global namespaces.
520    The new classes follow the DOM living spec.
521    RFC: https://wiki.php.net/rfc/opt_in_dom_spec_compliance
522
523========================================
5248. Removed Extensions and SAPIs
525========================================
526
527- IMAP:
528  . The IMAP extension has been unbundled and moved to PECL.
529    RFC: https://wiki.php.net/rfc/unbundle_imap_pspell_oci8
530
531- PSpell:
532  . The pspell extension has been unbundled and moved to PECL.
533    RFC: https://wiki.php.net/rfc/unbundle_imap_pspell_oci8
534
535========================================
5369. Other Changes to Extensions
537========================================
538
539- Curl:
540  . The Curl extension now requires at least libcurl 7.61.0.
541
542- Intl:
543  . The class constants are typed now.
544
545- Intl:
546  . The OpenSSL extension now requires at least OpenSSL 1.1.1.
547
548- PDO:
549  . The class constants are typed now.
550
551- Reflection:
552  . The class constants are typed now.
553
554- Spl:
555  . The class constants are typed now.
556
557- Sqlite:
558  . The class constants are typed now.
559
560- XMLReader:
561  . The class constants are typed now.
562
563- XSL:
564  . The typed properties XSLTProcessor::$cloneDocument and
565    XSLTProcessor::$doXInclude are now declared.
566
567========================================
56810. New Global Constants
569========================================
570
571- Core:
572  . PHP_OUTPUT_HANDLER_PROCESSED.
573
574- Intl:
575  . The IntlDateFormatter class exposes now the new PATTERN constant
576    reflecting udat api's UDAT_PATTERN.
577  . The IntlChar class exposes now the new PROPERTY_IDS_UNARY_OPERATOR (new
578    IDS binary operator), PROPERTY_ID_COMPAT_MATH_START,
579    PROPERTY_ID_COMPAT_MATH_CONTINUE (both for mathematical
580    identifier profiling purpose) constants.
581
582- LDAP:
583  . LDAP_OPT_X_TLS_PROTOCOL_MAX.
584  . LDAP_OPT_X_TLS_PROTOCOL_TLS1_3.
585
586- LibXML:
587  . LIBXML_RECOVER.
588
589- OpenSSL:
590  . X509_PURPOSE_OCSP_HELPER.
591  . X509_PURPOSE_TIMESTAMP_SIGN.
592
593- PCNTL:
594  . QosClass::Background (macOs only).
595  . QosClass::Default (macOs only).
596  . QosClass::UserInteractive (macOs only).
597  . QosClass::UserInitiated (macOs only).
598  . QosClass::Utility (macOs only).
599  . SIGCKPT (DragonFlyBSD only).
600  . SIGCKPTEXIT (DragonFlyBSD only).
601
602- Standard:
603  . PHP_ROUND_CEILING.
604  . PHP_ROUND_FLOOR.
605  . PHP_ROUND_TOWARD_ZERO.
606  . PHP_ROUND_AWAY_FROM_ZERO.
607
608- Sockets:
609  . SO_EXCLUSIVEADDRUSE (Windows only).
610  . SOCK_CONN_DGRAM (NetBSD only).
611  . SOCK_DCCP (NetBSD only).
612  . TCP_SYNCNT (Linux only).
613  . SO_EXCLBIND (Solaris/Illumos only).
614
615- Sodium:
616  . SODIUM_CRYPTO_AEAD_AEGIS128L_KEYBYTES
617  . SODIUM_CRYPTO_AEAD_AEGIS128L_NSECBYTES
618  . SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES
619  . SODIUM_CRYPTO_AEAD_AEGIS128L_ABYTES
620  . SODIUM_CRYPTO_AEAD_AEGIS256_KEYBYTES
621  . SODIUM_CRYPTO_AEAD_AEGIS256_NSECBYTES
622  . SODIUM_CRYPTO_AEAD_AEGIS256_NPUBBYTES
623  . SODIUM_CRYPTO_AEAD_AEGIS256_ABYTES
624
625- XML:
626  . Added XML_OPTION_PARSE_HUGE to allow large inputs in xml_parse and
627    xml_parse_into_struct.
628    RFC: https://wiki.php.net/rfc/xml_option_parse_huge.
629
630========================================
63111. Changes to INI File Handling
632========================================
633
634========================================
63512. Windows Support
636========================================
637
638========================================
63913. Other Changes
640========================================
641
642* Closure names have been adjusted to include the parent function's name
643  and the line of definition to make them easier to distinguish, for example
644  within stack traces.
645
646========================================
64714. Performance Improvements
648========================================
649
650- Core:
651  . Improved the performance of floating point number parsing and formatting in
652    ZTS builds under highly concurrent loads. This affects the `printf()` family
653    of functions as well as serialization functions such as `json_encode()`,
654    `serialize()`.
655
656- DOM:
657  . The performance of DOMNode::C14N() is greatly improved for the case without
658    an xpath query. This can give a time improvement of easily two order of
659    magnitude for documents with tens of thousands of nodes.
660
661- FTP:
662  . Improved the performance of FTP uploads up to a factor of 10x for large
663    uploads.
664
665- MBString:
666  . The performance of strspn() and strcspn() is greatly improved.
667    They now run in linear time instead of being bounded by quadratic time.
668  . mb_strcut() is much faster now for UTF-8 and UTF-16 strings.
669  . Looking up mbstring encoding names is much faster now.
670  . The performance of converting SJIS-win to unicode is greatly improved.
671
672- MySQLnd:
673  . Improved the performance of MySQLnd quoting.
674
675- Standard:
676  . Improved the performance of strpbrk().
677  . get_browser() is much faster now, up to 1.5x - 2.5x for some test cases.
678
679