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