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