macOS における高精度なタイマー(hrtime())
は、mach_absolute_time()
ではなく、推奨されている
clock_gettime_nsec_np(CLOCK_UPTIME_RAW)
API を使うようになりました。
-z や、 --zend-extension オプションは、 機能していないため削除されました。 -d zend_extension=[path] を代わりに使ってください。
大きなカラムのフェッチ動作が変更されました。 256 バイトのブロックをフェッチする代わりに、 PDO_ODBC はより大きなブロックサイズをフェッチしようとするようになります。 現状このブロックサイズは、 ページサイズから文字列オーバーヘッドを差し引いたサイズです。 SQLGetData で SQL_NO_TOTAL を返すドライバも同様に、 適切に処理されるようになります。 この変更で、互換性とパフォーマンスが改善するはずです。
cli_set_process_title() に長過ぎるタイトルを設定しようとした場合、 黙ってタイトルを切り詰めるのではなく、 失敗するようになりました。
ビルトインのデフォルト値から変更されている INI 設定を出力するオプションとして、 --ini=diff オプションが追加されました。
httpd ProxyPass を経由した FPM は、 オプションでスクリプトの完全なパスをデコードします。 この新しい振る舞いは、 追加された fastcgi.script_path_encoded INI ディレクティブで抑止できます。
FPM のログの長さの上限は、 log_limit の値を尊重するようになりました。
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_get_option() は、
ldap_set_option() と同様に、
null の接続を受け付けるようになりました。
これは、グローバルオプションを取得できるようにするためです。
libxml_set_external_entity_loader() は、 戻り値の型を正式に true としました。
openssl_public_encrypt() と
openssl_private_decrypt() は、
OAEP パディング向けのハッシュダイジェストアルゴリズムを指定するために、
新しく $digest_algo
パラメータを設定できるようになりました。
openssl_sign() と
openssl_verify() は、
よりセキュアな RSA PSS パディングを使えるようにするために、
新しく $padding
パラメータを設定できるようになりました。
openssl_cms_encrypt() の $cipher_algo
パラメーターに、暗号名を示す文字列を指定できるようになりました。
これによって、認証付きのエンベロープデータ向けに、
AES GCM 暗号アルゴリズムを含むより多くのアルゴリズムを使えるようになります。
pcntl_exec() は、 戻り値の型を正式に false としました。
pcntl_waitid() は、 子プロセスに関する様々なプラットフォーム固有のメトリクスを収集するため、 追加で resource_usage 引数を受け取るようになりました。
Pdo\Pgsql::copyFromArray() は、 iterable の入力をサポートするようになりました。
Pdo\Pgsql::setAttribute() と
Pdo\Pgsql::prepare() は、
lazy フェッチモードに入ることを示すために、
PDO::ATTR_PREFETCH に 0 を設定できるようになりました。
このモードの場合、Statement は並列に実行できません。
pg_copy_from() は、 Iterable の入力をサポートするようになりました。
pg_connect() は、 connection_string 引数に null バイトが含まれているかをチェックするようになりました。
pg_close_stmt() は、 statement_name 引数に null バイトが含まれているかをチェックするようになりました。
posix_ttyname() は、 ファイルディスクリプタが無効な場合に、 last_error に EBADF を設定するようになりました。
posix_isatty() は、
ファイルディスクリプタが無効な場合に、
E_WARNING を発生させるようになりました。
posix_fpathconf() は、
ファイルディスクリプタが無効かどうかをチェックし、
無効な場合に last_error に EBADF を設定しつつ、
E_WARNING を発生させるようになりました。
ReflectionClass::__toString() の列挙型の出力について、 クラスが列挙型であることをより明確に示すように変更されました。 また、列挙型の case は通常のクラス定数ではなく、 列挙型の case であることを示すようになりました。
ReflectionProperty::__toString() の、 フックを持つプロパティの出力は、プロパティがどのフックを持つか、 それらのフックが final かどうか、 およびプロパティが仮想かどうかを示すように変更されました。 これは、クラスがフックされたプロパティを含む場合の ReflectionClass::__toString()の出力にも影響します。
socket_create()/socket_bind() は、
AF_PACKET
ファミリのソケットを作成できるようになりました。
socket_getsockname() は、
AF_PACKET ソケットを指定すると、
インターフェイスのインデックスとその文字列表現を取得します。
gzfile(), gzopen(),
readgzfile() 関数の
$use_include_path 引数の型が、
int から boolean に変更されました。
gzfile(), gzopen(), readgzfile() 関数は、 デフォルトのストリームコンテキストを尊重するようになりました。
curl_setopt() に指定する
CURLOPT_FOLLOWLOCATION オプションの値が、
boolean ではなく数値として扱われるようになりました。
これは CURLFOLLOW_OBEYCODE と
CURLFOLLOW_FIRSTONLY を処理するためです。
file の magic データベースが、5.45 から 5.46 に更新されました。
finfo_close() の戻り値の型が、 bool ではなく、true に変更されました。
Intl の内部エラー処理機構がモダンになり、 どの呼び出しがどのエラーを引き起こしたかを、 より正確に示せるようになりました。 さらに、一部の ext/date の例外は、 IntlException でラップされるようになっています。
lexbor 拡張モジュールが追加されました。 これは常に有効になっています。 他の拡張モジュールで再利用できるようにするため、 ext/dom から分離された laxbor ライブラリが含まれています。 この新しい拡張機能は、ユーザーランドに直接公開されません。
Opcache 拡張モジュール は、 常に PHP バイナリに組み込まれ、ロードされるようになりました。 opcache.enable と opcache.enable_cli の設定はまだ有効です。
pcre2lib が、10.44 から 10.46 に更新されました。
サポートされる最低リリースバージョンが、 3.7.7 から 3.7.17 に変更されました。
readline_add_history(), readline_clear_history(), readline_callback_handler_install() の戻り値の型が、 bool から true に変更されました。
ReflectionConstant クラスは、 final ではなくなりました。
致命的なエラーにバックトレースを含めるかどうかを制御するために、 fatal_error_backtraces INI ディレクティブが追加されました。
起動時にのみ有効な、max_memory_limit INI ディレクティブが追加されました。 これは、起動時または実行時に設定可能な memory_limit の最大値を制御するためのものです。 この値を超えると、-1 を設定しない限り警告が発生します。 代わりに、memory_limit の値が、現在の max_memory_limit の値に設定されます。
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.libctx INI ディレクティブを追加しました。 スレッドごとにカスタムの libctx を使うか、 グローバルな、単一の libctx (デフォルト)を使えます。
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 のパフォーマンスも大幅に改善されました。
collator で文字列変換を行う際、余計な文字列コピーをしなくなりました。
SSE2 を使用していたコードは、 ARM NEON による SIMD 命令も使うように調整されました。
Glibc 以外のビルドで JIT コンパイルされたコード中で、 TLS 変数のフェッチ処理のパフォーマンスが向上しました。
以下のメソッドのパフォーマンスが向上しました:
SplFixedArray の、 多次元のアクセス処理と、メソッドのパフォーマンスが向上しました。
コールバックを指定した場合の、配列関数 (array_find(), array_filter(), array_map(), usort(), ...) のパフォーマンスが向上しました。
urlencode() と rawurlencode() のパフォーマンスが向上しました。
一時的な文字列の生成と再パースを回避することで、 unpack() の、 名前を付けない反復処理のパフォーマンスが向上しました。
pack() のパフォーマンスが向上しました。
array_chunk() のパフォーマンスが少し向上しました。