その他の変更

PHP コア

Core

macOS における高精度なタイマー(hrtime) は、mach_absolute_time() ではなく、推奨されている clock_gettime_nsec_np(CLOCK_UPTIME_RAW) API を使うようになりました。

CGI/CLI

-z や、 --zend-extension オプションは、 機能していないため削除されました。 -d zend_extension=[path] を代わりに使ってください。

PDO_ODBC

大きなカラムのフェッチ動作が変更されました。 256 バイトのブロックをフェッチする代わりに、 PDO_ODBC はより大きなブロックサイズをフェッチしようとするようになります。 現状このブロックサイズは、 ページサイズから文字列オーバーヘッドを差し引いたサイズです。 SQLGetData で SQL_NO_TOTAL を返すドライバも同様に、 適切に処理されるようになります。 この変更で、互換性とパフォーマンスが改善するはずです。

SAPI モジュールへの変更

CLI

cli_set_process_title に長過ぎるタイトルを設定しようとした場合、 黙ってタイトルを切り詰めるのではなく、 失敗するようになりました。

ビルトインのデフォルト値から変更されている INI 設定を出力するオプションとして、 --ini=diff オプションが追加されました。

FPM

httpd ProxyPass を経由した FPM は、 オプションでスクリプトの完全なパスをデコードします。 この新しい振る舞いは、 追加された fastcgi.script_path_encoded INI ディレクティブで抑止できます。

FPM のログの長さの上限は、 log_limit の値を尊重するようになりました。

変更された関数

Intl

grapheme_extract は、 無効な開始バイトをスキップする際に $next の値を適切に割り当てるようになりました。 これより前のバージョンでは、grapheme 境界の終端ではなく、 先頭を指すケースがありました。

transliterator_get_error_code, transliterator_get_error_message, TransLiterator::getErrorCode, TransLiterator::getErrorMessage の戻り値の union 型から false を削除しました。 false を返すことは実際には起こり得なかったからです。

以下の関数は、$locale 引数をサポートしました: grapheme_strpos, grapheme_stripos, grapheme_strrpos, grapheme_strripos, grapheme_substr, grapheme_strstr, grapheme_stristr

LDAP

ldap_get_option は、 ldap_set_option と同様に、 null の接続を受け付けるようになりました。 これは、グローバルオプションを取得できるようにするためです。

libxml

libxml_set_external_entity_loader は、 戻り値の型を正式に true としました。

OpenSSL

openssl_public_encryptopenssl_private_decrypt は、 OAEP パディング向けのハッシュダイジェストアルゴリズムを指定するために、 新しく $digest_algo パラメータを設定できるようになりました。

openssl_signopenssl_verify は、 よりセキュアな RSA PSS パディングを使えるようにするために、 新しく $padding パラメータを設定できるようになりました。

openssl_cms_encrypt$cipher_algo パラメーターに、暗号名を示す文字列を指定できるようになりました。 これによって、認証付きのエンベロープデータ向けに、 AES GCM 暗号アルゴリズムを含むより多くのアルゴリズムを使えるようになります。

PCNTL

pcntl_exec は、 戻り値の型を正式に false としました。

pcntl_waitid は、 子プロセスに関する様々なプラットフォーム固有のメトリクスを収集するため、 追加で resource_usage 引数を受け取るようになりました。

PDO_PGSQL

Pdo\Pgsql::copyFromArray は、 iterable の入力をサポートするようになりました。

Pdo\Pgsql::setAttributePdo\Pgsql::prepare は、 lazy フェッチモードに入ることを示すために、 PDO::ATTR_PREFETCH に 0 を設定できるようになりました。 このモードの場合、Statement は並列に実行できません。

PostgreSQL

pg_copy_from は、 Iterable の入力をサポートするようになりました。

pg_connect は、 connection_string 引数に null バイトが含まれているかをチェックするようになりました。

pg_close_stmt は、 statement_name 引数に null バイトが含まれているかをチェックするようになりました。

POSIX

posix_ttyname は、 ファイルディスクリプタが無効な場合に、 last_error に EBADF を設定するようになりました。

posix_isatty は、 ファイルディスクリプタが無効な場合に、 E_WARNING を発生させるようになりました。

posix_fpathconf は、 ファイルディスクリプタが無効かどうかをチェックし、 無効な場合に last_error に EBADF を設定しつつ、 E_WARNING を発生させるようになりました。

Reflection

ReflectionClass::__toString の列挙型の出力について、 クラスが列挙型であることをより明確に示すように変更されました。 また、列挙型の case は通常のクラス定数ではなく、 列挙型の case であることを示すようになりました。

ReflectionProperty::__toString の、 フックを持つプロパティの出力は、プロパティがどのフックを持つか、 それらのフックが final かどうか、 およびプロパティが仮想かどうかを示すように変更されました。 これは、クラスがフックされたプロパティを含む場合の ReflectionClass::__toStringの出力にも影響します。

Sockets

socket_create/socket_bind は、 AF_PACKET ファミリのソケットを作成できるようになりました。

socket_getsockname は、 AF_PACKET ソケットを指定すると、 インターフェイスのインデックスとその文字列表現を取得します。

Zlib

gzfile, gzopen, readgzfile 関数の $use_include_path 引数の型が、 int から bool に変更されました。

gzfile, gzopen, readgzfile 関数は、 デフォルトのストリームコンテキストを尊重するようになりました。

拡張モジュールへのその他の変更

cURL

curl_setopt に指定する CURLOPT_FOLLOWLOCATION オプションの値が、 boolean ではなく数値として扱われるようになりました。 これは CURLFOLLOW_OBEYCODECURLFOLLOW_FIRSTONLY を処理するためです。

Fileinfo

file の magic データベースが、5.45 から 5.46 に更新されました。

finfo_close の戻り値の型が、 bool ではなく、true に変更されました。

Intl

Intl の内部エラー処理機構がモダンになり、 どの呼び出しがどのエラーを引き起こしたかを、 より正確に示せるようになりました。 さらに、一部の ext/date の例外は、 IntlException でラップされるようになっています。

Lexbor

lexbor 拡張モジュールが追加されました。 これは常に有効になっています。 他の拡張モジュールで再利用できるようにするため、 ext/dom から分離された laxbor ライブラリが含まれています。 この新しい拡張機能は、ユーザーランドに直接公開されません。

Opcache

Opcache 拡張モジュール は、 常に PHP バイナリに組み込まれ、ロードされるようになりました。 opcache.enableopcache.enable_cli の設定はまだ有効です。

PCRE

pcre2lib が、10.44 から 10.46 に更新されました。

PDO_Sqlite

サポートされる最低リリースバージョンが、 3.7.7 から 3.7.17 に変更されました。

Readline

readline_add_history, readline_clear_history, readline_callback_handler_install の戻り値の型が、 bool から true に変更されました。

Reflection

ReflectionConstant クラスは、 final ではなくなりました。

INI ファイルの扱いの変更

PHP コア

致命的なエラーにバックトレースを含めるかどうかを制御するために、 fatal_error_backtraces INI ディレクティブが追加されました。

起動時にのみ有効な、max_memory_limit INI ディレクティブが追加されました。 これは、起動時または実行時に設定可能な memory_limit の最大値を制御するためのものです。 この値を超えると、-1 を設定しない限り警告が発生します。 代わりに、memory_limit の値が、現在の max_memory_limit の値に設定されます。

Opcache

opcache.file_cache で指定されたディレクトリがが読み取り専用だった場合をサポートするために、 opcache.file_cache_read_only が追加されました。 これは、読み取り専用ファイルシステム(例:読み取り専用 Docker コンテナ)向けです。 opcache.validate_timestamps=0, opcache.enable_file_override=1, opcache.file_cache_consistency_checks=0 の組み合わせで使うことを推奨します。

注意: 異なるビルドのPHP、 異なるファイルパス、 異なる設定(ロードされる拡張機能を含む)で生成されたキャッシュは、 無視される可能性があります。

opcache.jit_hot_loop のデフォルト値は、ループ反復回数の倍数にならないように、 61 (素数) に設定されました。 このパラメータには、素数の値を設定することを推奨します。

OPcache SHM が既にセットアップされている状態で、 opcache.memory_consumption の値を変更した場合に、正しく失敗を報告するようになりました。 これより前のバージョンでは、黙って何もせず、 PHPInfo で誤解を招く値を表示していました。

OpenSSL

OpenSSL のライブラリコンテキストタイプを選択できるようにするため、 openssl.libctx INI ディレクティブを追加しました。 スレッドごとにカスタムの libctx を使うか、 グローバルな、単一の libctx (デフォルト)を使えます。

パフォーマンスに関わる変更

PHP コア

match(true) パターン向けに、 boolean 値との同一性の比較に関する OPcode が削除されました。

=== []!== [] による比較について、 OPcode の特殊化処理が追加されました。

例外オブジェクトを生成する速度が向上しました。

SSE2 を使用していたコードは、 ARM NEON による SIMD 命令も使うように調整されました。

x86_64 または aarch64 アーキテクチャで Clang>=19 を使用してコンパイルする場合、 デフォルトで有効となる TAILCALL VM を導入しました。 TAILCALL VM は、 GCC コンパイル時に使用される HYBRID VM と同等の速度を実現します。 これにより、Clang>=19 でビルドされた PHP バイナリは、 GCC でビルドされたバイナリと同等の速度を発揮します。 他のコンパイラで使用される CALL VM のパフォーマンスも大幅に改善されました。

Intl

collator で文字列変換を行う際、余計な文字列コピーをしなくなりました。

MBString

SSE2 を使用していたコードは、 ARM NEON による SIMD 命令も使うように調整されました。

Opcache

Glibc 以外のビルドで JIT コンパイルされたコード中で、 TLS 変数のフェッチ処理のパフォーマンスが向上しました。

Reflection

以下のメソッドのパフォーマンスが向上しました:

  • ReflectionProperty::getValue
  • ReflectionProperty::getRawValue
  • ReflectionProperty::isInitialized
  • ReflectionProperty::isInitialized
  • ReflectionProperty::setValue
  • ReflectionProperty::setRawValue

SPL

SplFixedArray の、 多次元のアクセス処理と、メソッドのパフォーマンスが向上しました。

Standard

コールバックを指定した場合の、配列関数 (array_find, array_filter, array_map, usort, ...) のパフォーマンスが向上しました。

urlencoderawurlencode のパフォーマンスが向上しました。

一時的な文字列の生成と再パースを回避することで、 unpack の、 名前を付けない反復処理のパフォーマンスが向上しました。

pack のパフォーマンスが向上しました。

array_chunk のパフォーマンスが少し向上しました。

XML

XMLReader の、 プロパティアクセスのパフォーマンスが向上しました。

XMLWriter のパフォーマンスが向上し、 メモリ使用量が削減されました。