xref: /PHP-7.3/UPGRADING (revision b5cb999e)
1PHP 7.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
16
17
18========================================
191. Backward Incompatible Changes
20========================================
21
22Core:
23  . The ext_skel utility has been completely redesigned with new options and
24    some old options removed. This is now written in PHP and has no external
25    dependencies.
26  . Support for BeOS has been dropped.
27  . Exceptions thrown due to automatic conversion of warnings into exceptions
28    in EH_THROW mode (e.g. some DateTime exceptions) no longer populate
29    error_get_last() state. As such, they now work the same way as manually
30    thrown exceptions.
31  . TypeError now reports wrong types as `int` and `bool` instead of `integer`
32    and `boolean`.
33  . Due to the introduction of flexible heredoc/nowdoc syntax (see New Features
34    section), doc strings that contain the ending label inside their body may
35    cause syntax errors or change in interpretation. For example in
36
37        $str = <<<FOO
38        abcdefg
39            FOO
40        FOO;
41
42    the indented occurrence of "FOO" did not previously have any special
43    meaning. Now it will be interpreted as the end of the heredoc string and
44    the following "FOO;" will cause a syntax error. This issue can always be
45    resolved by choosing an ending label that does not occur within the contents
46    of the string.
47  . "continue" statements targeting "switch" control flow structures will now
48    generate a warning. In PHP such "continue" statements are equivalent to
49    "break", while they behave as "continue 2" in other languages.
50
51        while ($foo) {
52            switch ($bar) {
53                case "baz":
54                    continue;
55                    // Warning: "continue" targeting switch is equivalent to
56                    //          "break". Did you mean to use "continue 2"?
57            }
58        }
59
60  . Array accesses of type $obj["123"], where $obj implements ArrayAccess and
61    "123" is an integer string literal will no longer result in an implicit
62    conversion to integer, i.e., $obj->offsetGet("123") will be called instead
63    of $obj->offsetGet(123). This matches existing behavior for non-literals.
64    The behavior of arrays is not affected in any way, they continue to
65    implicitly convert integeral string keys to integers.
66  . In PHP, static properties are shared between inheriting classes, unless the
67    static property is explicitly overridden in a child class. However, due to
68    an implementation artifact it was possible to separate the static properties
69    by assigning a reference. This loophole has been fixed.
70
71        class Test {
72            public static $x = 0;
73        }
74        class Test2 extends Test { }
75
76        Test2::$x = &$x;
77        $x = 1;
78
79        var_dump(Test::$x, Test2::$x);
80        // Previously: int(0), int(1)
81        // Now:        int(1), int(1)
82
83  . References returned by array and property accesses are now unwrapped as
84    part of the access. This means that it is no longer possible to modify the
85    reference between the access and the use of the accessed value:
86
87        $arr = [1];
88        $ref =& $arr[0];
89        var_dump($arr[0] + ($arr[0] = 2));
90        // Previously: int(4), Now: int(3)
91
92    This makes the behavior of references and non-references consistent. Please
93    note that reading and writing a value inside a single expression remains
94    undefined behavior and may change again in the future.
95
96  . Argument unpacking stopped working with Traversables with non-integer keys.
97    The following code worked in PHP 7.0-7.2 by accident.
98
99        function foo(...$args) {
100            var_dump($args);
101        }
102        function gen() {
103            yield 1.23 => 123;
104        }
105        foo(...gen());
106
107    Now it generates an exception.
108
109BCMath:
110  . All warnings thrown by BCMath functions are now using PHP's error handling.
111    Formerly some warnings have directly been written to stderr.
112  . bcmul() and bcpow() now return numbers with the requested scale. Formerly,
113    the returned numbers may have omitted trailing decimal zeroes.
114
115DOM:
116  . As of PHP 7.3.16, the value of the $childNodes property of DOMDocument,
117    DOMNode, DOMProcessingInstruction, DOMComment, DOMText, DOMCdataSection and
118    DOMNotation is now an empty DOMNodeList instead of NULL, according to the
119    W3C and WHATWG standards and the PHP manual.
120
121IMAP:
122  rsh/ssh logins are disabled by default. Use imap.enable_insecure_rsh if you want
123  to enable them. Note that the IMAP library does not filter mailbox names before
124  passing them to rsh/ssh command, thus passing untrusted data to this function
125  with rsh/ssh enabled is insecure.
126
127MBString:
128  . Due to added support for named captures, mb_ereg_*() patterns using named
129    captures will behave differently. In particular named captures will be part
130    of matches and mb_ereg_replace() will interpret additional syntax. See
131    "New Features" section for more information.
132
133mysqli:
134  . Prepared statements now properly report the fractional seconds for DATETIME/
135    TIME/TIMESTAMP columns with decimals specifier (e.g. TIMESTAMP(6) when using
136    microseconds). Formerly, the fractional seconds part was simply omitted from
137    the returned values.
138
139PDO/MySQL:
140  . Prepared statements now properly report the fractional seconds for DATETIME/
141    TIME/TIMESTAMP columns with decimals specifier (e.g. TIMESTAMP(6) when using
142    microseconds). Formerly, the fractional seconds part was simply omitted from
143    the returned values.
144    Please note that this only affects the usage of PDO_MYSQL with emulated
145    prepares turned off (e.g. using the native preparation functionality).
146    Statements using connections having PDO::ATTR_EMULATE_PREPARES=true (which
147    is the default) were not affected by the bug fixed and have already been
148    getting the proper fractional seconds values from the engine.
149
150Reflection:
151  . Reflection export to string now uses `int` and `bool` instead of `integer`
152    and `boolean`.
153
154- SAPI:
155  . Starting with 7.3.23, incoming cookie names are not url-decoded. This was never
156    required by the standard, outgoing cookie names aren't encoded and this leads
157    to security issues (CVE-2020-7070).
158
159SPL:
160  . If an SPL autoloader throws an exception, following autoloaders will not be
161    executed. Previously all autoloaders were executed and exceptions were
162    chained.
163
164SimpleXML:
165  . Mathematic operations involving SimpleXML objects will now treat the text as
166    an integer or float, whichever is more appropriate. Previously values were
167    treated as integers unconditionally.
168
169Standard:
170  . Undefined variables passed to compact() will now be reported as a notice.
171  . getimagesize() and related functions now report the mime type of BMP images
172    as image/bmp instead of image/x-ms-bmp, since the former has been registered
173    with the IANA (see RFC 7903).
174  . stream_socket_get_name() will now return IPv6 addresses wrapped in brackets.
175    For example "[::1]:1337" will be returned instead of "::1:1337".
176
177========================================
1782. New Features
179========================================
180
181Core:
182  . Implemented flexible heredoc and nowdoc syntax: The closing marker for doc
183    strings is no longer required to be followed by a semicolon or newline.
184    Additionally the closing marker may be indented, in which case the
185    indentation will be stripped from all lines in the doc string.
186    (RFC: https://wiki.php.net/rfc/flexible_heredoc_nowdoc_syntaxes)
187  . Array destructuring now supports reference assignments using the syntax
188    [&$a, [$b, &$c]] = $d. The same is also supported for list().
189    (RFC: https://wiki.php.net/rfc/list_reference_assignment)
190  . instanceof now allows literals as the first operand,
191    in which case the result is always FALSE.
192  . A new CompileError exception has been added, from which ParseError inherits.
193    A small number of compilation errors will now throw a CompileError instead
194    of generating a fatal error. Currently this only affects compilation errors
195    that may be thrown by token_get_all() in TOKEN_PARSE mode, but more errors
196    may be converted in the future.
197  . Trailing commas in function and method calls are now allowed.
198    (RFC: https://wiki.php.net/rfc/trailing-comma-function-calls)
199
200BCMath:
201  . bcscale() can now also be used as getter to retrieve the current scale in use.
202
203MBString:
204  . Support for full case-mapping and case-folding has been added. Unlike simple
205    case-mapping, full case-mapping may change the length of the string. For
206    example:
207
208      mb_strtoupper("Straße")
209      // Produces STRAßE on PHP 7.2
210      // Produces STRASSE on PHP 7.3
211
212    The different casing mapping and folding modes are available through
213    mb_convert_case():
214
215      . MB_CASE_LOWER (used by mb_strtolower)
216      . MB_CASE_UPPER (used by mb_strtoupper)
217      . MB_CASE_TITLE
218      . MB_CASE_FOLD
219      . MB_CASE_LOWER_SIMPLE
220      . MB_CASE_UPPER_SIMPLE
221      . MB_CASE_TITLE_SIMPLE
222      . MB_CASE_FOLD_SIMPLE (used by case-insensitive operations)
223
224    Only unconditional, language agnostic full case-mapping is performed.
225  . Case-insensitive string operations now use case-folding instead of case-
226    mapping during comparisons. This means that more characters will be
227    considered (case insensitively) equal now.
228  . mb_convert_case() with MB_CASE_TITLE now performs title-case conversion
229    based on the Cased and CaseIgnorable derived Unicode properties. In
230    particular this also improves handling of quotes and apostophes.
231  . Data tables have been updated for Unicode 11.
232  . Mbstring now correctly supports strings larger than 2GB.
233  . Performance of the mbstring extension has been significantly improved
234    across the board. The largest improvements are in case conversion functions.
235  . mb_ereg_*() functions now support named captures. Matching functions like
236    mb_ereg() will now return named captures both using their group number and
237    their name, similar to PCRE:
238
239        mb_ereg('(?<word>\w+)', '国', $matches);
240        // => [0 => "国", 1 => "国", "word" => "国"];
241
242    Additionally, mb_ereg_replace() now supports the \k<> and \k'' notations
243    to reference named captures in the replacement string:
244
245        mb_ereg_replace('\s*(?<word>\w+)\s*', "_\k<word>_\k'word'_", ' foo ');
246        // => "_foo_foo_"
247
248    \k<> and \k'' can also be used for numbered references, which also works
249    with group numbers greater than 9.
250
251readline:
252  . Support for the completion_append_character and completion_suppress_append
253    options has been added to readline_info(). These options are only available
254    if PHP is linked against libreadline (rather than libedit).
255
256Standard:
257  . The --with-password-argon2[=dir] configure argument now provides support for
258    both Argon2i and Argon2id hashes in the password_hash(), password_verify(),
259    password_get_info(), and password_needs_rehash() functions. Passwords may be
260    hashed and verified using the PASSWORD_ARGON2ID constant.
261    Support for both Argon2i and Argon2id in the password_* functions now requires
262    PHP be linked against libargon2 reference library >= 20161029.
263    (RFC: https://wiki.php.net/rfc/argon2_password_hash_enhancements).
264
265LDAP:
266  . Full support for LDAP Controls has been added to LDAP querying functions
267    and ldap_parse_result
268
269========================================
2703. Changes in SAPI modules
271========================================
272
273phpdbg:
274  . The unused constants PHPDBG_FILE, PHPDBG_METHOD, PHPDBG_LINENO and
275    PHPDBG_FUNC have been removed.
276
277FPM:
278  . A new global option log_limit has been added. It can be used for setting
279    log limit for logged line which allows to log messages longer than 1024
280    characters without wrapping. It also fixes various wrapping issues.
281  . A new global option log_buffering has been added. It allows an experimental
282    logging without extra buffering.
283  . A new pool option decorate_workers_output has been added. It allows
284    disabling output decoration for workers output when catch_workers_output
285    enabled.
286  . The getallheaders() function is now also available.
287  . In PHP 7.3.11 a new pool option
288    request_terminate_timeout_track_finished has been added. When enabled,
289    request_terminate_timeout will also apply after fastcgi_finish_request()
290    has been called, as well as during execution of shutdown functions.
291
292========================================
2934. Deprecated Functionality
294========================================
295
296Core:
297  . The declaration of case-insensitive constants has been deprecated. Passing
298    true as the third argument to define() will now generate a deprecation
299    warning. The use of case-insensitive constants with a case that differs from
300    the declaration is also deprecated.
301    (RFC: https://wiki.php.net/rfc/case_insensitive_constant_deprecation)
302  . Declaring a function called assert() inside a namespace is deprecated.
303    The assert() function is subject to special handling by the engine, which
304    may lead to inconsistent behavior when defining a namespaced function with
305    the same name.
306
307Filter:
308  . The explicit usage of the constants FILTER_FLAG_SCHEME_REQUIRED and
309    FILTER_FLAG_HOST_REQUIRED is now deprecated; both are implied for
310    FILTER_VALIDATE_URL anyway.
311
312GD:
313  . image2wbmp() has been deprecated.
314
315Intl:
316  . Usage of the Normalizer::NONE form throws a deprecation warning, if PHP is
317    linked with ICU >= 56.
318
319Mbstring:
320  . The following undocumented mbereg_*() aliases have been deprecated. Use the
321    corresponding mb_ereg_*() variants instead.
322     . mbregex_encoding()
323     . mbereg()
324     . mberegi()
325     . mbereg_replace()
326     . mberegi_replace()
327     . mbsplit()
328     . mbereg_match()
329     . mbereg_search()
330     . mbereg_search_pos()
331     . mbereg_search_regs()
332     . mbereg_search_init()
333     . mbereg_search_getregs()
334     . mbereg_search_getpos()
335     . mbereg_search_setpos()
336
337PDO ODBC:
338  . The pdo_odbc.db2_instance_name ini setting has been formally deprecated. It
339    has already been deprecated in the documentation since PHP 5.1.1.
340
341Standard:
342  . Passing a non-string needle to string search functions is deprecated. In the
343    future the needle will be interpreted as a string instead of an ASCII codepoint.
344    Depending on the intended behavior, you should either explicitly cast the
345    needle to string or perform an explicit call to chr(). The following functions
346    are affected:
347      . strpos()
348      . strrpos()
349      . stripos()
350      . strripos()
351      . strstr()
352      . strchr()
353      . strrchr()
354      . stristr()
355  . The fgetss() function and the string.strip_tags stream filter have been deprecated.
356    This also affects the SplFileObject::fgetss() method and gzgetss() function.
357
358========================================
3595. Changed Functions
360========================================
361
362JSON:
363  . A new flag has been added, JSON_THROW_ON_ERROR, which can be used with
364    json_decode() or json_encode() and causes these functions to throw a
365    JsonException upon an error, instead of setting the global error state that
366    is retrieved with json_last_error(). JSON_PARTIAL_OUTPUT_ON_ERROR takes
367    precedence over JSON_THROW_ON_ERROR.
368    (RFC: https://wiki.php.net/rfc/json_throw_on_error)
369
370Session:
371  . session_set_cookie_params() now also supports the following signature:
372    session_set_cookie_params(array $options)
373    where $options is an associative array which may have any of the keys
374    "lifetime", "path", "domain", "secure", "httponly" and "samesite".
375    Accordingly, the return value of session_get_cookie_params() now also has an
376    element with the key "samesite".
377
378Standard:
379  . debug_zval_dump() was changed to display recursive arrays and objects
380    in the same way as var_dump(). Now, it doesn't display them twice.
381  . array_push() and array_unshift() can now also be called with a single
382    argument, which is particularly convenient wrt. the spread operator.
383  . setcookie() and setrawcookie() now also support the following signature:
384    set(raw)cookie(string $name, [string $value, [array $options]])
385    where $options is an associative array which may have any of the keys
386    "expires", "path", "domain", "secure", "httponly" and "samesite".
387
388PCRE:
389  . preg_quote() now also escapes the '#' character.
390
391LDAP:
392  . Added a serverctrls parameter to send controls to the server in ldap_add,
393    ldap_mod_replace, ldap_mod_add, ldap_mod_del, ldap_rename,
394    ldap_compare, ldap_delete, ldap_modify_batch,
395    ldap_search, ldap_list, ldap_read
396  . Added an out parameter to get controls from the server in ldap_parse_result
397  . Fixed support for LDAP_OPT_SERVER_CONTROLS and LDAP_OPT_CLIENT_CONTROLS in
398    ldap_get_option and ldap_set_option.
399
400
401========================================
4026. New Functions
403========================================
404
405Core:
406  . Added monotonic timer function hrtime([bool get_as_num]). It returns an
407    array of the form [seconds, nanoseconds] with the timestamp starting at
408    an unspecified point in the past. If the optional argument is passed as
409    true, the return value is an integer on 64-bit systems or float on
410    32-bit systems, representing the nanoseconds. The timestamp is not
411    adjustable and is not related to wall clock or time of day. The timers
412    are available under Linux, FreeBSD, Windows, Mac, SunOS, AIX and their
413    derivatives. If no required timers are provided by a corresponding
414    platform, the function returns false.
415  . Added net_get_interfaces() to retrieve an array of available network
416    interfaces including several details.
417  . Added the gc_status() function to retrieve status information regarding the
418    cyclic GC.
419
420Date:
421  . Added the DateTime::createFromImmutable() method, which mirrors
422    DateTimeImmutable::createFromMutable().
423
424FPM:
425  . Added fpm_get_status() function which returns FPM status info array.
426
427GMP:
428  . Added gmp_binomial(n, k) for calculating binomial coefficients.
429  . Added gmp_lcm(a, b) for calculating the least common multiple.
430  . Added gmp_perfect_power(a) to check if number is a perfect power.
431  . Added gmp_kronecker(a, b) to compute the Kronecker symbol.
432
433Intl:
434  . Added void Spoofchecker::setRestrictionLevel(int $level) method, available
435    when linked with ICU >= 58.1. Levels are represented as class constants
436    - Spoofchecker::ASCII
437    - Spoofchecker::HIGHLY_RESTRICTIVE
438    - Spoofchecker::MODERATELY_RESTRICTIVE
439    - Spoofchecker::MINIMALLY_RESTRICTIVE
440    - Spoofchecker::UNRESTRICTIVE
441    - Spoofchecker::SINGLE_SCRIPT_RESTRICTIVE
442    For the detailed documentation on the restriction levels, see
443    URestrictionLevel under
444    http://icu-project.org/apiref/icu4c/uspoof_8h.html
445  . Added Normalizer::getRawDecomposition() and normalizer_get_raw_decomposition(),
446    to retrieve the Decomposition_Mapping property of a character.
447
448LDAP:
449  . Added ldap_exop_refresh() to conveniently perform a Refresh extended
450    operation.
451
452OpenSSL:
453  . Added openssl_pkey_derive that derives a shared secret for DH, ECDH and
454    possibly other future algorithms supported by EVP_PKEY_derive.
455
456Sockets:
457  . Added functions to import/export the WSAPROTOCOL_INFO info struct. This
458    implementation complements the already supported SCM_RIGHTS as in
459    man 3 cmsg and is Windows specific. For the import/export, the default
460    system securities apply for the SHM reading/writing. The socket becomes
461    invalid, when the last reference to it is closed.
462    - socket_wsaprotocol_info_export(resource $sock, int $pid) - exports the
463      WSAPROTOCOL_INFO structure into shared memory and returns an identifier
464      to be used for the import, or false on failure. The exported ID is
465      only valid for the dedicated PID.
466    - socket_wsaprotocol_info_import(string $id) - returns a duplicated
467      socket as per the passed identifier, or false on failure.
468    - socket_wsaprotocol_info_release(string $id) - releases the shared memory
469      corresponding to the passed identifier.
470
471Standard:
472  . Added is_countable() function, to check whether a value may be passed to
473    count().
474    (RFC: https://wiki.php.net/rfc/is-countable)
475  . Added array_key_first() and array_key_last() which retrieve the first and
476    last key of an array, respectively.
477    (RFC: <https://wiki.php.net/rfc/array_key_first_last>)
478
479LDAP:
480  . Added functions ldap_add_ext, ldap_bind_ext, ldap_delete_ext, ldap_mod_add_ext,
481    ldap_mod_replace_ext, ldap_mod_del_ext, ldap_rename_ext
482    which gives access to the result object to be able to parse it
483    with ldap_parse_result and get more information than just success/failure.
484
485
486========================================
4877. New Classes and Interfaces
488========================================
489
490JSON:
491  . JsonException
492
493========================================
4948. Removed Extensions and SAPIs
495========================================
496
497========================================
4989. Other Changes to Extensions
499========================================
500
501 Curl:
502  . libcurl >= 7.15.5 is now required.
503
504 DBA:
505   . As of PHP 7.3.14, dba_open() accepts a fifth optional parameter for lmdb
506     databases which allows to specify the mapsize. The parameter defaults to
507     zero, in which case the compiled in default mapsize (usually 1048576) will
508     be used. The mapsize should be a multiple of the page size of the OS.
509
510 Filter:
511  . FILTER_VALIDATE_FLOAT now also supports a `thousand` option, which
512    defines the set of allowed thousand separator chars.  The default (`"',."`)
513    is fully backward compatible with former PHP versions.
514  . FILTER_SANITIZE_ADD_SLASHES has been added as an alias of the 'magic_quotes'
515    filter (FILTER_SANITIZE_MAGIC_QUOTES). The 'magic_quotes' filter is subject
516  	to removal in future versions of PHP.
517
518 FTP:
519  . Set default transfer mode to binary
520
521 Intl:
522  . Normalizer::NONE is deprecated, when PHP is linked with ICU >= 56
523  . Introduced Normalizer::FORM_KC_CF as Normalizer::normalize() argument
524    for NFKC_Casefold normalization, available when linked with ICU >= 56
525
526 MBString:
527  . The configuration option --with-libmbfl is no longer available.
528
529 ODBC:
530  . Support for ODBCRouter has been removed.
531  . Support for Birdstep has been removed.
532
533 OpenSSL:
534  . The min_proto_version and max_proto_version ssl stream options as well as
535    related constants for possible TLS protocol values have been added.
536    See <https://github.com/php/php-src/pull/3317>.
537
538 PCRE:
539  . The PCRE extension has been upgraded to PCRE2, which may cause minor
540    behavioral changes (for instance, character ranges in classes are now more
541    strictly interpreted), and augments the existing regular expression syntax.
542    See <https://wiki.php.net/rfc/pcre2-migration> for details.
543
544 PDO_DBLIB:
545  . Added the attribute PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS to enable automatic
546    skipping of empty rowsets.
547  . Exposed the TDS version via the PDO::DBLIB_ATTR_TDS_VERSION attribute.
548  . DATETIME2 columns are now treated like DATETIME columns.
549
550 PDO_SQLite:
551  . SQLite3 databases can now be opened in read-only mode by setting the
552    new PDO::SQLITE_ATTR_OPEN_FLAGS attribute to PDO::SQLITE_READONLY.
553
554 Standard:
555  . var_export() now exports stdClass objects as an array casted to an object
556    (`(object) array( ... )`), rather than using the nonexistent method
557    stdClass::__setState().
558
559 Tidy:
560  . Building against tidyp (<https://github.com/petdance/tidyp>) is now also
561    supported transparently. Since tidyp offers no API to get the release date,
562    tidy_get_release() and tidy::getRelease() return 'unknown' in this case.
563
564 XML:
565  . The return value of the `xml_set_external_entity_ref_handler()` callback is
566    now also heeded if the extension has been built against libxml. Formerly,
567    the return value has been ignored, and parsing did never stop.
568
569 Zip:
570  . Building against the bundled libzip is discouraged, but still possible by
571    adding `--without-libzip` to the configuration.
572
573 zlib:
574  . Added the zlib/level context option for the compress.zlib wrapper to
575    facilitate setting the desired compression level.
576
577========================================
57810. New Global Constants
579========================================
580
581Curl:
582  . CURLAUTH_BEARER
583  . CURLAUTH_GSSAPI
584  . CURLE_WEIRD_SERVER_REPLY
585  . CURLINFO_APPCONNECT_TIME_T
586  . CURLINFO_CONNECT_TIME_T
587  . CURLINFO_CONTENT_LENGTH_DOWNLOAD_T
588  . CURLINFO_CONTENT_LENGTH_UPLOAD_T
589  . CURLINFO_FILETIME_T
590  . CURLINFO_HTTP_VERSION
591  . CURLINFO_NAMELOOKUP_TIME_T
592  . CURLINFO_PRETRANSFER_TIME_T
593  . CURLINFO_PROTOCOL
594  . CURLINFO_PROXY_SSL_VERIFYRESULT
595  . CURLINFO_REDIRECT_TIME_T
596  . CURLINFO_SCHEME
597  . CURLINFO_SIZE_DOWNLOAD_T
598  . CURLINFO_SIZE_UPLOAD_T
599  . CURLINFO_SPEED_DOWNLOAD_T
600  . CURLINFO_SPEED_UPLOAD_T
601  . CURLINFO_STARTTRANSFER_TIME_T
602  . CURLINFO_TOTAL_TIME_T
603  . CURL_LOCK_DATA_CONNECT
604  . CURL_LOCK_DATA_PSL
605  . CURL_MAX_READ_SIZE
606  . CURLOPT_ABSTRACT_UNIX_SOCKET
607  . CURLOPT_DISALLOW_USERNAME_IN_URL
608  . CURLOPT_DNS_SHUFFLE_ADDRESSES
609  . CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS
610  . CURLOPT_HAPROXYPROTOCOL
611  . CURLOPT_KEEP_SENDING_ON_ERROR
612  . CURLOPT_PRE_PROXY
613  . CURLOPT_PROXY_CAINFO
614  . CURLOPT_PROXY_CAPATH
615  . CURLOPT_PROXY_CRLFILE
616  . CURLOPT_PROXY_KEYPASSWD
617  . CURLOPT_PROXY_PINNEDPUBLICKEY
618  . CURLOPT_PROXY_SSLCERT
619  . CURLOPT_PROXY_SSLCERTTYPE
620  . CURLOPT_PROXY_SSL_CIPHER_LIST
621  . CURLOPT_PROXY_SSLKEY
622  . CURLOPT_PROXY_SSLKEYTYPE
623  . CURLOPT_PROXY_SSL_OPTIONS
624  . CURLOPT_PROXY_SSL_VERIFYHOST
625  . CURLOPT_PROXY_SSL_VERIFYPEER
626  . CURLOPT_PROXY_SSLVERSION
627  . CURLOPT_PROXY_TLS13_CIPHERS
628  . CURLOPT_PROXY_TLSAUTH_PASSWORD
629  . CURLOPT_PROXY_TLSAUTH_TYPE
630  . CURLOPT_PROXY_TLSAUTH_USERNAME
631  . CURLOPT_REQUEST_TARGET
632  . CURLOPT_SOCKS5_AUTH
633  . CURLOPT_SSH_COMPRESSION
634  . CURLOPT_SUPPRESS_CONNECT_HEADERS
635  . CURLOPT_TIMEVALUE_LARGE
636  . CURLOPT_TLS13_CIPHERS
637  . CURLPROXY_HTTPS
638  . CURLSSH_AUTH_GSSAPI
639  . CURL_SSLVERSION_MAX_DEFAULT
640  . CURL_SSLVERSION_MAX_NONE
641  . CURL_SSLVERSION_MAX_TLSv1_0
642  . CURL_SSLVERSION_MAX_TLSv1_1
643  . CURL_SSLVERSION_MAX_TLSv1_2
644  . CURL_SSLVERSION_MAX_TLSv1_3
645  . CURL_SSLVERSION_TLSv1_3
646  . CURL_VERSION_ALTSVC
647  . CURL_VERSION_ASYNCHDNS
648  . CURL_VERSION_BROTLI
649  . CURL_VERSION_CONV
650  . CURL_VERSION_CURLDEBUG
651  . CURL_VERSION_DEBUG
652  . CURL_VERSION_GSSAPI
653  . CURL_VERSION_GSSNEGOTIATE
654  . CURL_VERSION_HTTPS_PROXY
655  . CURL_VERSION_IDN
656  . CURL_VERSION_LARGEFILE
657  . CURL_VERSION_MULTI_SSL
658  . CURL_VERSION_NTLM
659  . CURL_VERSION_NTLM_WB
660  . CURL_VERSION_PSL
661  . CURL_VERSION_SPNEGO
662  . CURL_VERSION_SSPI
663  . CURL_VERSION_TLSAUTH_SRP
664
665Filter:
666  . FILTER_SANITIZE_ADD_SLASHES
667
668JSON:
669  . JSON_THROW_ON_ERROR
670
671OpenSSL:
672  . STREAM_CRYPTO_PROTO_SSLv3
673  . STREAM_CRYPTO_PROTO_TLSv1_0
674  . STREAM_CRYPTO_PROTO_TLSv1_1
675  . STREAM_CRYPTO_PROTO_TLSv1_2
676
677MBString:
678  . MB_CASE_FOLD
679  . MB_CASE_LOWER_SIMPLE
680  . MB_CASE_UPPER_SIMPLE
681  . MB_CASE_TITLE_SIMPLE
682  . MB_CASE_FOLD_SIMPLE
683
684PGSQL:
685  . Requires Postgres 9.3
686    - PGSQL_DIAG_SCHEMA_NAME
687	- PGSQL_DIAG_TABLE_NAME
688	- PGSQL_DIAG_COLUMN_NAME
689	- PGSQL_DIAG_DATATYPE_NAME
690	- PGSQL_DIAG_CONSTRAINT_NAME
691  . Requires Postgres 9.6
692    - PGSQL_DIAG_SEVERITY_NONLOCALIZED
693
694Standard:
695  . PASSWORD_ARGON2ID
696
697LDAP:
698  . LDAP_CONTROL_MANAGEDSAIT
699  . LDAP_CONTROL_PROXY_AUTHZ
700  . LDAP_CONTROL_SUBENTRIES
701  . LDAP_CONTROL_VALUESRETURNFILTER
702  . LDAP_CONTROL_ASSERT
703  . LDAP_CONTROL_PRE_READ
704  . LDAP_CONTROL_POST_READ
705  . LDAP_CONTROL_SORTREQUEST
706  . LDAP_CONTROL_SORTRESPONSE
707  . LDAP_CONTROL_PAGEDRESULTS
708  . LDAP_CONTROL_AUTHZID_REQUEST
709  . LDAP_CONTROL_AUTHZID_RESPONSE
710  . LDAP_CONTROL_SYNC
711  . LDAP_CONTROL_SYNC_STATE
712  . LDAP_CONTROL_SYNC_DONE
713  . LDAP_CONTROL_DONTUSECOPY
714  . LDAP_CONTROL_PASSWORDPOLICYREQUEST
715  . LDAP_CONTROL_PASSWORDPOLICYRESPONSE
716  . LDAP_CONTROL_X_INCREMENTAL_VALUES
717  . LDAP_CONTROL_X_DOMAIN_SCOPE
718  . LDAP_CONTROL_X_PERMISSIVE_MODIFY
719  . LDAP_CONTROL_X_SEARCH_OPTIONS
720  . LDAP_CONTROL_X_TREE_DELETE
721  . LDAP_CONTROL_X_EXTENDED_DN
722  . LDAP_CONTROL_VLVREQUEST
723  . LDAP_CONTROL_VLVRESPONSE
724
725========================================
72611. Changes to INI File Handling
727========================================
728
729- birdstep.max_links
730  . This INI directive has been removed.
731
732- opcache.inherited_hack
733  . This INI directive has been removed. The value has already been ignored
734    since PHP 5.3.0.
735
736- session.cookie_samesite
737  . New INI option to allow to set the SameSite directive for cookies. Defaults
738    to "" (empty string), so no SameSite directive is set. Can be set to "Lax"
739    or "Strict", which sets the respective SameSite directive.
740
741- syslog.facility
742  - New INI to set syslog facility which specifies what type of program is
743    logging the message. It is used only when error_log is set to syslog.
744
745- syslog.filter
746  . New INI to set syslog filter type to filter the logged messages. There are
747    3 supported filter types - all, no-ctrl and ascii. It is used only when
748    error_log is set to syslog.
749
750- syslog.ident
751  . New INI to set syslog ident string which is prepended to every message. It
752    is used only when error_log is set syslog.
753
754- mbstring.regex_stack_limit
755  . New INI directive (since 7.3.5) limiting stack depth of mbstring/oniguruma
756  regular expressions.
757
758========================================
75912. Windows Support
760========================================
761
762- Core
763  . File descriptors are opened in shared read/write/delete mode by default.
764    This effectively maps the UNIX semantics and allows to delete files with
765    handles in use. It is not 100% same, some platform differences still
766    persist. After the deletion, the filename entry is blocked, until all
767    the opened handles to it are closed.
768
769========================================
77013. Other Changes
771========================================
772
773. The cyclic GC has been enhanced, which may result in considerable performance
774  improvements.
775