xref: /PHP-8.3/UPGRADING (revision cd6bac7f)
1PHP 8.3 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- Core:
23  . Programs that were very close to overflowing the call stack may now throw an
24    Error when using more than
25    `zend.max_allowed_stack_size-zend.reserved_stack_size` bytes of stack
26    (`fiber.stack_size-zend.reserved_stack_size` for fibers).
27  . Executing proc_get_status() multiple times will now always return the right
28    value on posix systems. Previously, only the first call of the function
29    returned the right value. Executing proc_close() after proc_get_status()
30    will now also return the right exit code. Previously this would return -1.
31    Internally, this works by caching the result on posix systems. If you want
32    the old behaviour, you can check the "cached" key in the array returned by
33    proc_get_status() to check whether the result was cached.
34  . Zend Max Execution Timers is now enabled by default for ZTS builds on
35    Linux.
36  . Uses of traits with static properties will now redeclare static properties
37    inherited from the parent class. This will create a separate static
38    property storage for the current class. This is analogous to adding the
39    static property to the class directly without traits.
40  . Assigning a negative index n to an empty array will now make sure that the
41    next index is n+1 instead of 0.
42  . Class constant visibility variance is now correctly checked when inherited
43    from interfaces.
44  . WeakMaps entries whose key maps to itself (possibly transitively) may now
45    be removed during cycle collection if the key is not reachable except by
46    iterating over the WeakMap (reachability via iteration is considered weak).
47    Previously, such entries would never be automatically removed.
48  . In addition to whitespace characters, now comments are allowed between
49    `yield` and `from`. The whole "construct" (e.g. `yield /* comment */ from`)
50    is reported as a single `T_YIELD_FROM` token by the tokenizer.
51
52- DOM:
53  . DOMChildNode::after(), DOMChildNode::before(), DOMChildNode::replaceWith()
54    on a node that has no parent is now a no-op instead of a hierarchy
55    exception, which is the behaviour spec demands.
56  . Using the DOMParentNode and DOMChildNode methods without a document now
57    works instead of throwing a HIERARCHY_REQUEST_ERR DOMException. This is in
58    line with the behaviour spec demands.
59  . createAttributeNS() without specifying a prefix would incorrectly create
60    a default namespace, placing the element inside the namespace instead of
61    the attribute. This bug is now fixed.
62  . createAttributeNS() would previously incorrectly throw a NAMESPACE_ERR
63    when the prefix was already used for a different uri. It now correctly
64    chooses a different prefix when there's a prefix name conflict.
65  . New methods and properties were added to some DOM classes. If you inherit
66    from these and you happen to have a method or property with the same name,
67    you might encounter errors if the declaration is incompatible.
68    Consult sections 2. New Features and 6. New Functions for a list of
69    newly implemented methods and properties.
70
71- FFI:
72  . C functions that have a return type of void now return null instead of
73    returning the following object object(FFI\CData:void) { }
74
75- Opcache:
76  . The opcache.consistency_checks INI directive was removed. This feature was
77    broken with the tracing JIT, as well as with inheritance cache, and has
78    been disabled without a way to enable it since PHP 8.1.18 and PHP 8.2.5.
79    Both the tracing JIT and inheritance cache may modify shm after the script
80    has been persisted by invalidating its checksum. The attempted fix skipped
81    over the modifiable pointers but was rejected due to complexity. For this
82    reason, it was decided to remove the feature instead.
83
84- Phar:
85  . The type of Phar class constants are now declared.
86
87- Standard:
88  . The range() function has had various changes:
89    * A TypeError is now thrown when passing objects, resources, or arrays
90      as the boundary inputs
91    * A more descriptive ValueError is thrown when passing 0 for $step
92    * A ValueError is now thrown when using a negative $step for increasing ranges
93    * If $step is a float that can be interpreted as an int, it is now done so
94    * A ValueError is now thrown if any argument is infinity or NAN
95    * An E_WARNING is now emitted if $start or $end is the empty string.
96      The value continues to be cast to the value 0.
97    * An E_WARNING is now emitted if $start or $end has more than one byte,
98      only if it is a non-numeric string.
99    * An E_WARNING is now emitted if $start or $end is cast to an integer
100      because the other boundary input is a number. (e.g. range(5, 'z');)
101    * An E_WARNING is now emitted if $step is a float when trying to generate
102      a range of characters, except if both boundary inputs are numeric strings
103      (e.g. range('5', '9', 0.5); does not produce a warning)
104    * range() now produce a list of characters if one of the boundary inputs is
105      a string digit instead of casting the other input to int
106      (e.g. range('5', 'z');)
107  . The file() flags error check now catches all invalid flags. Notably
108    FILE_APPEND was previously silently accepted.
109
110- SNMP:
111  . The type of SNMP class constants are now declared.
112
113========================================
1142. New Features
115========================================
116
117- Core
118  . Anonymous classes may now be marked as readonly.
119  . Readonly properties can now be reinitialized during cloning.
120    RFC: https://wiki.php.net/rfc/readonly_amendments
121  . Class, interface, trait, and enum constants now support type
122    declarations. RFC: https://wiki.php.net/rfc/typed_class_constants
123  . Closures created from magic methods can now accept named arguments.
124  . The final modifier may now be used when using a method from a trait.
125  . Added the #[\Override] attribute to check that a method exists
126    in a parent class or implemented interface.
127    RFC: https://wiki.php.net/rfc/marking_overriden_methods
128  . Class constants can now be accessed dynamically using the C::{$name}
129    syntax.
130    RFC: https://wiki.php.net/rfc/dynamic_class_constant_fetch
131  . Static variable initializers can now contain arbitrary expressions.
132    RFC: https://wiki.php.net/rfc/arbitrary_static_variable_initializers
133
134- CLI
135  . It is now possible to lint multiple files.
136
137- DOM
138  . Added properties DOMElement::className and DOMElement::id.
139    These are not binary-safe at the moment because of underlying limitations of
140    libxml2. This means that the property values will be cut off at a NUL byte.
141  . Added properties DOMNode::isConnected and DOMNameSpaceNode::isConnected.
142  . Added properties DOMNode::parentElement and DOMNameSpaceNode::parentElement.
143
144- FFI
145  . It is now possible to assign CData to other CData. This means you can
146    now assign CData to structs and fields.
147
148- Opcache
149  . opcache_get_status()['scripts'][n]['revalidate'] now contains a Unix
150    timestamp of when the next revalidation of the scripts timestamp is due,
151    dictated by the opcache.revalidate_freq INI directive.
152
153- Posix
154  . posix_getrlimit() now takes an optional $res parameter to allow fetching a
155    single resource limit.
156  . posix_isatty() now raises type warnings for integers following the usual
157    ZPP semantics.
158  . posix_ttyname() now raises type warnings for integers following the usual
159    ZPP semantics and value warnings for invalid file descriptor integers.
160
161- Streams
162  . Streams can now emit the STREAM_NOTIFY_COMPLETED notification. This was
163    previously not implemented.
164
165========================================
1663. Changes in SAPI modules
167========================================
168
169- $_SERVER['SERVER_SOFTWARE'] value from the built-in CLI server changed to
170  make it compliant with RFC3875.
171
172========================================
1734. Deprecated Functionality
174========================================
175
176- Core
177  . Using the ++ operator on empty, non-numeric, or non-alphanumeric strings
178    is now deprecated. Moreover, incrementing non-numeric strings is soft
179    deprecated and the new str_increment() function should be used instead.
180    RFC: https://wiki.php.net/rfc/saner-inc-dec-operators
181  . Using the -- operator on empty or non-numeric strings is now deprecated.
182    RFC: https://wiki.php.net/rfc/saner-inc-dec-operators
183  . Calling get_class() and get_parent_class() without arguments is now
184    deprecated.
185
186- DBA
187  . Calling dba_fetch() with $dba as the 3rd argument is now deprecated.
188
189- FFI
190  . Calling FFI::cast(), FFI::new(), and FFI::type() statically is now
191    deprecated.
192
193- Intl
194  . The U_MULTIPLE_DECIMAL_SEP*E*RATORS constant had been deprecated, using
195    the U_MULTIPLE_DECIMAL_SEP*A*RATORS instead is recommended.
196  . The NumberFormatter::TYPE_CURRENCY has been deprecated.
197
198- LDAP
199  . Calling ldap_connect() with separate hostname and port is deprecated.
200    RFC: https://wiki.php.net/rfc/deprecations_php_8_3#deprecate_calling_ldap_connect_with_2_parameters
201
202- MBString
203  . Passing a negative $width to mb_strimwidth() is now deprecated.
204
205- Phar
206  . Calling Phar::setStub() with a resource and a length is now deprecated.
207    Such calls should be replaced by:
208    $phar->setStub(stream_get_contents($resource));
209
210- Random
211  . The MT_RAND_PHP Mt19937 variant is deprecated.
212    RFC: https://wiki.php.net/rfc/deprecations_php_8_3#mt_rand_php
213
214- Standard:
215  . The assert_options() function is now deprecated.
216  . The ASSERT_ACTIVE, ASSERT_BAIL, ASSERT_CALLBACK, ASSERT_EXCEPTION, and
217    ASSERT_WARNING constants have been deprecated.
218    RFC: https://wiki.php.net/rfc/assert-string-eval-cleanup
219
220- SQLite3
221  . Using exceptions is now preferred, warnings will be removed in the future.
222    Calling SQLite3::enableExceptions(false) will trigger a depreciation
223    warning in this version.
224
225- Zip:
226  . The ZipArchive::FL_RECOMPRESS constant is deprecated and will be removed
227    in a future version of libzip
228
229========================================
2305. Changed Functions
231========================================
232
233- Core:
234  . gc_status() has added the following 8 fields:
235    "running" => bool
236    "protected" => bool
237    "full" => bool
238    "buffer_size" => int
239    "application_time" => float: Total application time, in seconds (including
240    collector_time)
241    "collector_time" => float: Time spent collecting cycles, in seconds
242    (including destructor_time and free_time)
243    "destructor_time" => float: Time spent executing destructors during
244    cycle collection, in seconds
245    "free_time" => float: Time spent freeing values during cycle collection, in
246    seconds
247    See GH-9336, GH-11523
248  . class_alias() now supports creating an alias of an internal class.
249  . Setting `open_basedir` at runtime using `ini_set('open_basedir', ...);` no
250    longer accepts paths containing the parent directory (`..`). Previously,
251    only paths starting with `..` were disallowed. This could easily be
252    circumvented by prepending `./` to the path.
253  . User exception handlers now catch exceptions during shutdown.
254  . The resultant HTML of highlight_string and highlight_file has changed.
255    Whitespace between outer HTML tags is removed. Newlines and spaces
256    are no longer converted to HTML entities. The whole HTML is now wrapped in
257    <pre> tag. The outer <span> has been merged with <code>.
258
259- Calendar
260  . easter_date() now supports years from 1970 to 2,000,000,000 on 64-bit
261    systems, previously it only supported years in the range from 1970 to 2037.
262
263- Curl:
264  . curl_getinfo() now supports two new constants: CURLINFO_CAPATH and
265    CURLINFO_CAINFO. If option is null, the following two additional keys are
266    present: "capath" and "cainfo".
267
268- Dom:
269  . Changed DOMCharacterData::appendData() tentative return type to true.
270  . DOMDocument::loadHTML(), DOMDocument::loadHTMLFile(),
271    DOMDocument::loadXML() and DOMDocument::loadXMLFile() now have a tentative
272    return type of bool. Previously, this was documented as having a return
273    type of DOMDocument|bool, but DOMDocument cannot be returned since PHP 8.0
274    as it is no longer statically callable.
275
276- Gd:
277  . Changed imagerotate signature, removed the `ignore_transparent` argument
278    as it was not used internally anyway from PHP 7.x.
279
280- Intl:
281  . datefmt_set_timezone (and its alias IntlDateformatter::setTimeZone)
282    now returns true on success, previously null was returned.
283  . IntlBreakiterator::setText() now returns false on failure, previously
284    null was returned.
285    now returns true on success, previously null was returned.
286  . IntlChar::enumCharNames is now returning a boolean.
287    Previously it returned null on success and false on failure.
288  . IntlDateFormatter::construct throws an U_ILLEGAL_ARGUMENT_ERROR
289    exception when an invalid locale had been set.
290
291- MBString:
292  . mb_strtolower, mb_strtotitle, and mb_convert_case implement conditional
293    casing rules for the Greek letter sigma. For mb_convert_case, conditional
294    casing only applies to MB_CASE_LOWER and MB_CASE_TITLE modes, not to
295    MB_CASE_LOWER_SIMPLE and MB_CASE_TITLE_SIMPLE.
296  . mb_decode_mimeheader interprets underscores in QPrint-encoded MIME
297    encoded words as required by RFC 2047; they are converted to spaces.
298    Underscores must be encoded as "=5F" in such MIME encoded words.
299  . In rare cases, mb_encode_mimeheader will transfer-encode its input
300    string where it would pass it through as raw ASCII in PHP 8.2.
301  . mb_encode_mimeheader no longer drops NUL (zero) bytes when
302    QPrint-encoding the input string. This previously caused strings in
303    certain text encodings, especially UTF-16 and UTF-32, to be
304    corrupted by mb_encode_mimeheader.
305  . mb_detect_encoding's "non-strict" mode now behaves as described in the
306    documentation. Previously, it would return false if the same byte
307    (for example, the first byte) of the input string was invalid in all
308    candidate encodings. More generally, it would eliminate candidate
309    encodings from consideration when an invalid byte was seen, and if the
310    same input byte eliminated all remaining encodings still under
311    consideration, it would return false. On the other hand, if all candidate
312    encodings but one were eliminated from consideration, it would return the
313    last remaining one without regard for how many encoding errors might be
314    encountered later in the string. This is different from the behavior
315    described in the documentation, which says: "If strict is set to false,
316    the closest matching encoding will be returned."
317
318- mysqli:
319  . mysqli_fetch_object now raises a ValueError instead of an Exception when
320    the constructor_args argument is non empty with the class not having
321    constructor.
322  . mysqli_poll now raises a ValueError when the read nor error arguments are
323    passed.
324  . mysqli_field_seek and mysqli_result::field_seek now specify return type
325    as true instead of bool.
326
327- ODBC
328  . odbc_autocommit() now accepts null for the $enable parameter.
329    Passing null has the same behaviour as passing only 1 parameter,
330    namely indicating if the autocommit feature is enabled or not.
331
332- PGSQL:
333  . pg_fetch_object now raises a ValueError instead of an Exception when the
334    constructor_args argument is non empty with the class not having
335    constructor.
336  . pg_insert now raises a ValueError instead of a WARNING when the table
337    specified is invalid.
338  . pg_insert and pg_convert raises a ValueError or a TypeError instead of a
339    WARNING when the value/type of a field does not match properly with a
340    PostGreSQL's type.
341  . The $row param of pg_fetch_result(), pg_field_prtlen() and
342    pg_field_is_null() is now nullable.
343
344- Random:
345  . Changed mt_srand() and srand() to not check the number of arguments to
346    determine whether a random seed should be used. Passing null will generate
347    a random seed, 0 will use zero as the seed. The functions are now
348    consistent with Mt19937::__construct().
349
350- Reflection:
351  . Return type of ReflectionClass::getStaticProperties() is no longer nullable.
352  . Calling ReflectionProperty::setValue() with only one parameter is deprecated.
353    To set static properties, pass null as the first parameter.
354
355- Standard:
356  . E_NOTICEs emitted by unserialize() have been promoted to E_WARNING.
357    RFC: https://wiki.php.net/rfc/improve_unserialize_error_handling
358  . unserialize() now emits a new E_WARNING if the input contains unconsumed
359    bytes.
360    RFC: https://wiki.php.net/rfc/unserialize_warn_on_trailing_data
361  . array_pad() is now only limited by the maximum number of elements an array
362    can have. Before, it was only possible to add at most 1048576 elements at a
363    time.
364  . strtok() raises a warning in the case token is not provided when starting
365    tokenization.
366  . password_hash() will now chain the underlying Random\RandomException
367    as the ValueError’s $previous Exception when salt generation fails.
368  . proc_open() $command array must now have at least one non empty element.
369  . proc_open() returns false if $command array is invalid command instead of
370    resource object that produces warning later. This was already the case for
371    Windows but it is now also the case if posix_spawn implementation is in use
372    (most Linux, BSD and MacOS platforms). There are still some old platforms
373    where this behavior is not changed as posix_spawn is not supported there.
374  . array_sum() and array_product() now warn when values in the array cannot
375    be converted to int/float. Previously arrays and objects where ignored
376    whilst every other value was cast to int. Moreover, objects that define
377    a numeric cast (e.g. GMP) are now casted instead of ignored.
378    RFC: https://wiki.php.net/rfc/saner-array-sum-product
379  . number_format() $decimal parameter handles rounding to negative places. It
380    means that when $decimals is negative, $num is rounded to $decimals
381    significant digits before the decimal point. Previously negative $decimals
382    got silently ignored and the number got rounded to zero decimal places.
383  . The $before_needle argument added to strrchr() which works in the same way
384    like its counterpart in strstr() or stristr().
385  . str_getcsv() and fgetcsv() return empty string instead of a string with
386    a single zero byte for the last field which contains only unterminated
387    enclosure.
388
389========================================
3906. New Functions
391========================================
392
393- Date:
394  . Added DatePeriod::createFromISO8601String() as a replacement for the
395    overloaded constructor of DatePeriod.
396
397- DOM:
398  . Added DOMNode::contains().
399  . Added DOMElement::getAttributeNames().
400  . Added DOMNode::getRootNode(). The $options argument does nothing at the
401    moment because it only influences the shadow DOM, which we do not support
402    yet.
403  . Added DOMParentNode::replaceChildren().
404  . Added DOMNode::isEqualNode().
405  . Added DOMElement::insertAdjacentElement() and
406    DOMElement::insertAdjacentText().
407  . Added DOMElement::toggleAttribute().
408
409- Intl:
410  . Added IntlCalendar::setDate() and IntlCalendar::setDateTime()
411    as partial replacements for the overloaded IntlCalendar::set() method.
412  . Added IntlGregorianCalendar::createFromDate() and
413    IntlGregorianCalendar::createFromDateTime()
414    as partial replacements for the overloaded IntlGregorianCalendar
415    constructor.
416
417- JSON:
418  . Added json_validate(), which returns whether the json is valid for
419    the given $depth and $options.
420    RFC: https://wiki.php.net/rfc/json_validate
421
422- LDAP:
423  . Added ldap_connect_wallet().
424  . Added ldap_exop_sync().
425
426- MBString:
427  . Added mb_str_pad(), which is the mbstring equivalent of str_pad().
428    RFC: https://wiki.php.net/rfc/mb_str_pad
429
430- Posix:
431  . Added posix_sysconf call to get runtime informations.
432  . Added posix_pathconf call to get configuration value from a directory/file.
433  . Added posix_fpathconf call to get configuration value from a file
434    descriptor.
435  . Added posix_eaccess call to check the effective user id's permission for
436    a path.
437
438- PGSQL:
439  . Added pg_set_error_context_visibility to set the visibility of the context
440    in error messages (with libpq >= 9.6).
441
442- Random:
443  . Added Randomizer::getBytesFromString().
444    RFC: https://wiki.php.net/rfc/randomizer_additions
445  . Added Randomizer::nextFloat(), ::getFloat(), and IntervalBoundary.
446    RFC: https://wiki.php.net/rfc/randomizer_additions
447
448- Reflection:
449  . Added ReflectionMethod::createFromMethodName().
450
451- Sockets:
452  . Added socket_atmark to checks if the socket is OOB marked.
453
454- Standard:
455  . Added the str_increment() and str_decrement() functions.
456    RFC: https://wiki.php.net/rfc/saner-inc-dec-operators
457  . Added stream_context_set_options() as a replacement for
458    stream_context_set_option() when passed an array of options.
459
460- Zip:
461  . Added ZipArchive::setArchiveFlag and ZipArchive::getArchiveFlag methods.
462
463========================================
4647. New Classes and Interfaces
465========================================
466
467========================================
4688. Removed Extensions and SAPIs
469========================================
470
471========================================
4729. Other Changes to Extensions
473========================================
474
475- Core:
476  . WeakMaps now have ephemeron-like behavior: Entries whose key maps to itself
477    (possibly transitively) may be removed during cycle collection if the key
478    is not reachable except by iterating over the WeakMap (reachability via
479    iteration is considered weak). Previously, such entries would never be
480    automatically removed. (See GH-10932.)
481  . The ++ and -- operators now emit warnings when attempting to increment
482    values of type bool as this will change in the next major version.
483    A warning is emitted when trying to decrement values of type null, as
484    this will change in the next major version.
485    Internal objects that implement an _IS_NUMBER cast but not a do_operator
486    handler that overrides addition and subtraction now can be incremented
487    and decrement as if one would do $o += 1 or $o -= 1
488
489- DOM:
490  . The DOM lifetime mechanism has been reworked such that implicitly removed
491    nodes can still be fetched. Previously this resulted in an exception.
492
493- SQLite3
494  . The SQLite3 class now throws \SQLite3Exception (extends \Exception) instead
495    of \Exception.
496  . The SQLite error code is now passed in the exception error code instead of
497    being included in the error message.
498
499========================================
50010. New Global Constants
501========================================
502
503- Curl:
504  . CURLINFO_CAPATH
505  . CURLINFO_CAINFO
506  . CURLOPT_MIME_OPTIONS
507  . CURLMIMEOPT_FORMESCAPE
508  . CURLOPT_WS_OPTIONS
509  . CURLWS_RAW_MODE
510  . CURLOPT_SSH_HOSTKEYFUNCTION
511  . CURLOPT_PROTOCOLS_STR
512  . CURLOPT_REDIR_PROTOCOLS_STR
513  . CURLOPT_CA_CACHE_TIMEOUT
514  . CURLOPT_QUICK_EXIT
515  . CURLKHMATCH_OK
516  . CURLKHMATCH_MISMATCH
517  . CURLKHMATCH_MISSING
518  . CURLKHMATCH_LAST
519
520- Intl:
521  . MIXED_NUMBERS (Spoofchecker).
522  . HIDDEN_OVERLAY (Spoofchecker).
523
524- OpenSSL:
525  . OPENSSL_CMS_OLDMIMETYPE
526  . PKCS7_NOOLDMIMETYPE
527
528- PCNTL:
529  . SIGINFO
530
531- PDO_ODBC
532  . PDO_ODBC_TYPE
533
534- PGSQL:
535  . PGSQL_TRACE_SUPPRESS_TIMESTAMPS
536  . PGSQL_TRACE_REGRESS_MODE
537  . PGSQL_ERRORS_SQLSTATE
538  . PGSQL_SHOW_CONTEXT_NEVER
539  . PGSQL_SHOW_CONTEXT_ERRORS
540  . PGSQL_SHOW_CONTEXT_ALWAYS
541
542- Posix:
543  . POSIX_SC_ARG_MAX
544  . POSIX_SC_PAGESIZE
545  . POSIX_SC_NPROCESSORS_CONF
546  . POSIX_SC_NPROCESSORS_ONLN
547  . POSIX_PC_LINK_MAX
548  . POSIX_PC_MAX_CANON
549  . POSIX_PC_MAX_INPUT
550  . POSIX_PC_NAME_MAX
551  . POSIX_PC_PATH_MAX
552  . POSIX_PC_PIPE_BUF
553  . POSIX_PC_CHOWN_RESTRICTED
554  . POSIX_PC_NO_TRUNC
555  . POSIX_PC_ALLOC_SIZE_MIN
556  . POSIX_PC_SYMLINK_MAX
557
558- Sockets:
559  . SO_ATTACH_REUSEPORT_CBPF (Linux only).
560  . SO_DETACH_BPF (Linux only).
561  . SO_DETACH_FILTER (Linux only).
562  . TCP_QUICKACK (Linux only).
563  . IP_DONTFRAG (FreeBSD only).
564  . IP_MTU_DISCOVER (Linux only).
565  . IP_PMTUDISC_DO (Linux only).
566  . IP_PMTUDISC_DONT (Linux only).
567  . IP_PMTUDISC_WANT (Linux only).
568  . IP_PMTUDISC_PROBE (Linux only).
569  . IP_PMTUDISC_INTERFACE (Linux only).
570  . IP_PMTUDISC_OMIT (Linux only).
571  . AF_DIVERT (FreeBSD only).
572  . SOL_UDPLITE.
573  . UDPLITE_RECV_CSCOV.
574  . UDPLITE_SEND_CSCOV.
575  . SO_RERROR (NetBSD only).
576  . SO_ZEROIZE (OpenBSD only).
577  . SO_SPLICE (OpenBSD only).
578  . TCP_REPAIR (Linux only).
579  . SO_REUSEPORT_LB (FreeBSD only).
580  . IP_BIND_ADDRESS_NO_PORT (Linux only).
581
582- Zip:
583  . ZipArchive::ER_DATA_LENGTH (libzip >= 1.10)
584  . ZipArchive::ER_NOT_ALLOWED (libzip >= 1.10)
585  . ZipArchive::AFL_RDONLY (libzip >= 1.10)
586  . ZipArchive::AFL_IS_TORRENTZIP (libzip >= 1.10)
587  . ZipArchive::AFL_WANT_TORRENTZIP (libzip >= 1.10)
588  . ZipArchive::AFL_CREATE_OR_KEEP_FILE_FOR_EMPTY_ARCHIVE (libzip >= 1.10)
589  . ZipArchive::FL_OPEN_FILE_NOW
590  . ZipArchive::LENGTH_TO_END as default value for addFile and replaceFile
591  . ZipArchive::LENGTH_UNCHECKED (libzip >= 1.10.1)
592
593========================================
59411. Changes to INI File Handling
595========================================
596
597- assert.*
598  . The assert.* INI settings have been deprecated.
599    This comprises the following INI settings:
600     - assert.active
601     - assert.bail
602     - assert.callback
603     - assert.exception
604     - assert.warning
605    If the value of the setting is equal to the default value, no deprecation
606    notice is emitted.
607    The zend.assertions INI setting should be used instead.
608
609- zend.max_allowed_stack_size
610  . New INI directive to set the maximum allowed stack size. Possible
611    values are `0` (detect the process or thread maximum stack size), `-1`
612    (no limit), or a positive number of bytes. The default is `0`. When it
613    is not possible to detect the the process or thread maximum stack size,
614    a known system default is used. Setting this value too high has the same
615    effect as disabling the stack size limit. Fibers use fiber.stack_size
616    as maximum allowed stack size. An Error is thrown when the process call
617    stack exceeds `zend.max_allowed_stack_size-zend.reserved_stack_size`
618    bytes, to prevent stack-overflow-induced segmentation faults, with
619    the goal of making debugging easier. The stack size increases during
620    uncontrolled recursions involving internal functions or the magic methods
621    __toString, __clone, __sleep, __destruct.  This is not related to stack
622    buffer overflows, and is not a security feature.
623
624- zend.reserved_stack_size
625  . New INI directive to set the reserved stack size, in bytes. This is
626    subtracted from the max allowed stack size, as a buffer, when checking the
627    stack size.
628
629========================================
63012. Windows Support
631========================================
632
633- Minimum supported Windows version has been bumped to Windows 8 or
634  Windows Server 2012
635
636========================================
63713. Other Changes
638========================================
639
640- Core:
641  . An Error is now thrown when the process call stack exceeds a certain size,
642    to prevent stack-overflow-induced segmentation faults, with the goal of
643    making debugging easier. The maximum allowed stack size is controlled
644    by the INI directives zend.max_allowed_stack_size,
645    zend.reserved_stack_size and fiber.stack_size.
646
647- FFI:
648  . FFI::load() is now allowed during preloading when opcache.preload_user is
649    the current system user. Previously, calling FFI::load() was not possible
650    during preloading if the opcache.preload_user directive was set.
651
652- FPM:
653  . FPM CLI test now fails if the socket path is longer than supported by OS.
654
655- Opcache:
656  . In the cli and phpdbg SAPIs, preloading does not require the
657    opcache.preload_user directive to be set anymore when running as root. In
658    other SAPIs, this directive is required when running as root because
659    preloading is done before the SAPI switches to an unprivileged user.
660
661- Streams:
662  . Blocking fread() on socket connection returns immediately if there are
663    any buffered data instead of waiting for more data.
664  . Memory stream no longer fails if seek offset is past the end. Instead
665    the memory is increase on the next write and date between the old end and
666    offset is filled with zero bytes in the same way how it works for files.
667  . stat() access operations like file_exists() and similar will now use real
668    path instead of the actual stream path. This is consistent with stream
669    opening.
670
671========================================
67214. Performance Improvements
673========================================
674
675- DOM:
676  . Looping over a DOMNodeList now uses caching. Therefore requesting items no
677    longer takes quadratic time by default.
678  . Getting text content from nodes now avoids an allocation, resulting in a
679    performance gain.
680  . DOMChildNode::remove() now runs in O(1) performance.
681
682- Standard:
683  . The file() flags error check is now about 7% faster.
684
685- SPL:
686  . RecursiveDirectoryIterator now performs less I/O when looping over a
687    directory.
688