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