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