mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Compare commits
1 commit
master
...
php-8.4.12
Author | SHA1 | Date | |
---|---|---|---|
![]() |
ee1a27f014 |
5494 changed files with 267969 additions and 641028 deletions
|
@ -90,6 +90,7 @@ jobs:
|
|||
--prefix=/usr \
|
||||
--enable-phpdbg \
|
||||
--enable-fpm \
|
||||
--enable-opcache \
|
||||
--with-pdo-mysql=mysqlnd \
|
||||
--with-mysqli=mysqlnd \
|
||||
--with-pgsql \
|
||||
|
@ -167,6 +168,7 @@ jobs:
|
|||
no_output_timeout: 30m
|
||||
command: |
|
||||
sapi/cli/php run-tests.php \
|
||||
-d zend_extension=opcache.so \
|
||||
-d opcache.enable_cli=1 \
|
||||
-d opcache.jit_buffer_size=64M \
|
||||
-d opcache.jit=tracing \
|
||||
|
|
|
@ -32,7 +32,3 @@ max_line_length = 80
|
|||
|
||||
[*.patch]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.rst]
|
||||
indent_style = space
|
||||
max_line_length = 100
|
||||
|
|
5
.gitattributes
vendored
5
.gitattributes
vendored
|
@ -21,7 +21,7 @@
|
|||
|
||||
# Collapse generated files within git and pull request diff.
|
||||
**/*_arginfo.h linguist-generated -diff
|
||||
/main/debug_gdb_scripts.c linguist-generated -diff
|
||||
/main/gdb_inlined_script.c linguist-generated -diff
|
||||
/Zend/zend_vm_execute.h linguist-generated -diff
|
||||
/Zend/zend_vm_handlers.h linguist-generated -diff
|
||||
/Zend/zend_vm_opcodes.[ch] linguist-generated -diff
|
||||
|
@ -30,5 +30,4 @@
|
|||
/ext/date/tests/ossfuzz*.txt binary
|
||||
|
||||
# Vendored libraries
|
||||
/ext/lexbor/lexbor linguist-vendored
|
||||
/ext/uri/uriparser linguist-vendored
|
||||
/ext/dom/lexbor/lexbor linguist-vendored
|
||||
|
|
4
.github/CODEOWNERS
vendored
4
.github/CODEOWNERS
vendored
|
@ -16,7 +16,7 @@
|
|||
|
||||
/.github @TimWolla
|
||||
/build/gen_stub.php @kocsismate
|
||||
/ext/bcmath @nielsdos @SakiTakamachi
|
||||
/ext/bcmath @Girgias @nielsdos @SakiTakamachi
|
||||
/ext/curl @adoy
|
||||
/ext/date @derickr
|
||||
/ext/dba @Girgias
|
||||
|
@ -27,7 +27,6 @@
|
|||
/ext/gmp @Girgias
|
||||
/ext/intl @devnexen
|
||||
/ext/json @bukka
|
||||
/ext/lexbor @kocsismate @nielsdos
|
||||
/ext/libxml @nielsdos
|
||||
/ext/mbstring @alexdowad @youkidearitai
|
||||
/ext/mysqli @bukka @kamil-tekiela
|
||||
|
@ -52,7 +51,6 @@
|
|||
/ext/sockets @devnexen
|
||||
/ext/spl @Girgias
|
||||
/ext/standard @bukka
|
||||
/ext/uri @kocsismate
|
||||
/ext/xml @nielsdos
|
||||
/ext/xmlreader @nielsdos
|
||||
/ext/xmlwriter @nielsdos
|
||||
|
|
16
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
16
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
|
@ -22,23 +22,15 @@ body:
|
|||
```
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
- type: input
|
||||
attributes:
|
||||
label: PHP Version
|
||||
description: |
|
||||
Please run PHP with the `-v` flag (e.g. `php -v`, `php8.3 -v`, `php-fpm -v` or similar) and provide the full output of that command. If executing that command is not possible, please provide the full version number as given in PHPInfo.
|
||||
|
||||
Please make sure that the used PHP version [is a supported version](https://www.php.net/supported-versions.php).
|
||||
placeholder: |
|
||||
PHP 8.3.19 (cli) (built: Mar 13 2025 17:44:40) (NTS)
|
||||
Copyright (c) The PHP Group
|
||||
Zend Engine v4.3.19, Copyright (c) Zend Technologies
|
||||
with Zend OPcache v8.3.19, Copyright (c), by Zend Technologies
|
||||
render: plain
|
||||
description: "The used PHP version. Make sure it is [supported](https://www.php.net/supported-versions.php)."
|
||||
placeholder: "PHP 8.0.12"
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
attributes:
|
||||
label: Operating System
|
||||
description: "The used operating system, if relevant."
|
||||
placeholder: "Ubuntu 24.04"
|
||||
placeholder: "Ubuntu 20.04"
|
||||
|
|
4
.github/actions/apt-x32/action.yml
vendored
4
.github/actions/apt-x32/action.yml
vendored
|
@ -35,11 +35,13 @@ runs:
|
|||
libsodium-dev:i386 \
|
||||
libsqlite3-dev:i386 \
|
||||
libssl-dev:i386 \
|
||||
libtidy-dev:i386 \
|
||||
libwebp-dev:i386 \
|
||||
libxml2-dev:i386 \
|
||||
libxml2-dev:i386 \
|
||||
libxpm-dev:i386 \
|
||||
libxslt1-dev:i386 \
|
||||
firebird-dev:i386 \
|
||||
libzip-dev:i386 \
|
||||
locales \
|
||||
make \
|
||||
pkg-config:i386 \
|
||||
|
|
2
.github/actions/brew/action.yml
vendored
2
.github/actions/brew/action.yml
vendored
|
@ -13,7 +13,7 @@ runs:
|
|||
|
||||
# Some packages exist on x86 but not arm, or vice versa.
|
||||
# Install them with reinstall to avoid warnings.
|
||||
brew reinstall autoconf webp tidy-html5 libzip libsodium icu4c curl
|
||||
brew reinstall autoconf webp tidy-html5 libzip libsodium icu4c
|
||||
brew install \
|
||||
bison \
|
||||
re2c
|
||||
|
|
4
.github/actions/configure-x32/action.yml
vendored
4
.github/actions/configure-x32/action.yml
vendored
|
@ -10,7 +10,6 @@ runs:
|
|||
run: |
|
||||
set -x
|
||||
|
||||
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/lib/i386-linux-gnu/pkgconfig"
|
||||
./buildconf --force
|
||||
export CFLAGS="-m32 -msse2"
|
||||
export CXXFLAGS="-m32 -msse2"
|
||||
|
@ -27,7 +26,6 @@ runs:
|
|||
--with-pgsql \
|
||||
--with-pdo-pgsql \
|
||||
--with-pdo-sqlite \
|
||||
--with-pdo-firebird \
|
||||
--without-pear \
|
||||
--enable-gd \
|
||||
--with-jpeg \
|
||||
|
@ -35,10 +33,12 @@ runs:
|
|||
--with-freetype \
|
||||
--with-xpm \
|
||||
--enable-exif \
|
||||
--with-zip \
|
||||
--with-zlib \
|
||||
--enable-soap \
|
||||
--enable-xmlreader \
|
||||
--with-xsl \
|
||||
--with-tidy \
|
||||
--enable-sysvsem \
|
||||
--enable-sysvshm \
|
||||
--enable-shmop \
|
||||
|
|
3
.github/actions/freebsd/action.yml
vendored
3
.github/actions/freebsd/action.yml
vendored
|
@ -113,7 +113,8 @@ runs:
|
|||
--offline \
|
||||
--show-diff \
|
||||
--show-slow 1000 \
|
||||
--set-timeout 120
|
||||
--set-timeout 120 \
|
||||
-d zend_extension=opcache.so
|
||||
|
||||
if test "${{ inputs.runExtraTests }}" = "true"; then
|
||||
sapi/cli/php run-extra-tests.php
|
||||
|
|
2
.github/actions/test-linux/action.yml
vendored
2
.github/actions/test-linux/action.yml
vendored
|
@ -30,9 +30,7 @@ runs:
|
|||
export PDO_PGSQL_TEST_DSN="pgsql:host=localhost port=5432 dbname=test user=postgres password=postgres"
|
||||
fi
|
||||
export PDO_FIREBIRD_TEST_DATABASE=test.fdb
|
||||
if [[ -z "$PDO_FIREBIRD_TEST_DSN" ]]; then
|
||||
export PDO_FIREBIRD_TEST_DSN=firebird:dbname=localhost:test.fdb
|
||||
fi
|
||||
export PDO_FIREBIRD_TEST_PASS=test
|
||||
export PDO_FIREBIRD_TEST_USER=test
|
||||
export ODBC_TEST_USER="odbc_test"
|
||||
|
|
6
.github/labeler.yml
vendored
6
.github/labeler.yml
vendored
|
@ -320,11 +320,6 @@
|
|||
- any-glob-to-any-file:
|
||||
- ext/tokenizer/**/*
|
||||
|
||||
"Extension: uri":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- ext/uri/**/*
|
||||
|
||||
"Extension: xml":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
|
@ -469,6 +464,7 @@
|
|||
- 'ext/pdo/php_pdo.h'
|
||||
- 'ext/pdo/php_pdo_driver.h'
|
||||
- 'ext/pdo/php_pdo_error.h'
|
||||
- 'ext/phar/php_phar.h'
|
||||
- 'ext/random/php_random.h'
|
||||
- 'ext/random/php_random_csprng.h'
|
||||
- 'ext/random/php_random_uint128.h'
|
||||
|
|
1
.github/lsan-suppressions.txt
vendored
1
.github/lsan-suppressions.txt
vendored
|
@ -1,4 +1,3 @@
|
|||
leak:acommon::DictInfoList::elements
|
||||
leak:timer_create
|
||||
leak:netsnmp_init_mib_internals
|
||||
leak:isc_attach_database
|
||||
|
|
15
.github/scripts/windows/build_task.bat
vendored
15
.github/scripts/windows/build_task.bat
vendored
|
@ -25,17 +25,18 @@ if %errorlevel% neq 0 exit /b 3
|
|||
|
||||
if "%THREAD_SAFE%" equ "0" set ADD_CONF=%ADD_CONF% --disable-zts
|
||||
if "%INTRINSICS%" neq "" set ADD_CONF=%ADD_CONF% --enable-native-intrinsics=%INTRINSICS%
|
||||
if "%ASAN%" equ "1" set ADD_CONF=%ADD_CONF% --enable-sanitizer --enable-debug-pack
|
||||
|
||||
rem C4018: comparison: signed/unsigned mismatch
|
||||
rem C4146: unary minus operator applied to unsigned type
|
||||
rem C4244: type conversion, possible loss of data
|
||||
rem C4267: 'size_t' type conversion, possible loss of data
|
||||
set CFLAGS=/W3 /WX /wd4018 /wd4146 /wd4244 /wd4267
|
||||
rem Some undefined behavior is reported on 32-bit, this should be fixed
|
||||
if "%PLATFORM%" == "x86" (
|
||||
set CFLAGS=/W1
|
||||
) else (
|
||||
set CFLAGS=/W1 /WX
|
||||
)
|
||||
|
||||
cmd /c configure.bat ^
|
||||
--enable-snapshot-build ^
|
||||
--disable-debug-pack ^
|
||||
--enable-com-dotnet=shared ^
|
||||
--without-analyzer ^
|
||||
--enable-object-out-dir=%PHP_BUILD_OBJ_DIR% ^
|
||||
--with-php-build=%DEPS_DIR% ^
|
||||
|
@ -45,7 +46,5 @@ if %errorlevel% neq 0 exit /b 3
|
|||
|
||||
nmake /NOLOGO
|
||||
if %errorlevel% neq 0 exit /b 3
|
||||
nmake /NOLOGO comtest.dll
|
||||
if %errorlevel% neq 0 exit /b 3
|
||||
|
||||
exit /b 0
|
||||
|
|
21
.github/scripts/windows/test_task.bat
vendored
21
.github/scripts/windows/test_task.bat
vendored
|
@ -92,6 +92,8 @@ rem set SSLEAY_CONF=
|
|||
|
||||
rem prepare for OPcache
|
||||
if "%OPCACHE%" equ "1" set OPCACHE_OPTS=-d opcache.enable=1 -d opcache.enable_cli=1 -d opcache.protect_memory=1 -d opcache.jit_buffer_size=64M -d opcache.jit=tracing
|
||||
rem work-around for failing to dl(mysqli) with OPcache (https://github.com/php/php-src/issues/8508)
|
||||
if "%OPCACHE%" equ "1" set OPCACHE_OPTS=%OPCACHE_OPTS% -d extension=mysqli
|
||||
|
||||
rem prepare for enchant
|
||||
mkdir %~d0\usr\local\lib\enchant-2
|
||||
|
@ -121,14 +123,11 @@ hMailServer.exe /verysilent
|
|||
cd %APPVEYOR_BUILD_FOLDER%
|
||||
%PHP_BUILD_DIR%\php.exe -dextension_dir=%PHP_BUILD_DIR% -dextension=com_dotnet .github\setup_hmailserver.php
|
||||
|
||||
rem prepare for com_dotnet
|
||||
nmake register_comtest
|
||||
|
||||
mkdir %PHP_BUILD_DIR%\test_file_cache
|
||||
rem generate php.ini
|
||||
echo extension_dir=%PHP_BUILD_DIR% > %PHP_BUILD_DIR%\php.ini
|
||||
echo opcache.file_cache=%PHP_BUILD_DIR%\test_file_cache >> %PHP_BUILD_DIR%\php.ini
|
||||
echo opcache.record_warnings=1 >> %PHP_BUILD_DIR%\php.ini
|
||||
if "%OPCACHE%" equ "1" echo zend_extension=php_opcache.dll >> %PHP_BUILD_DIR%\php.ini
|
||||
rem work-around for some spawned PHP processes requiring OpenSSL and sockets
|
||||
echo extension=php_openssl.dll >> %PHP_BUILD_DIR%\php.ini
|
||||
echo extension=php_sockets.dll >> %PHP_BUILD_DIR%\php.ini
|
||||
|
@ -138,23 +137,21 @@ for %%i in (ldap) do (
|
|||
del %PHP_BUILD_DIR%\php_%%i.dll
|
||||
)
|
||||
|
||||
rem reduce excessive stack reserve for testing
|
||||
editbin /stack:8388608 %PHP_BUILD_DIR%\php.exe
|
||||
editbin /stack:8388608 %PHP_BUILD_DIR%\php-cgi.exe
|
||||
|
||||
set TEST_PHPDBG_EXECUTABLE=%PHP_BUILD_DIR%\phpdbg.exe
|
||||
|
||||
copy /-y %DEPS_DIR%\bin\*.dll %PHP_BUILD_DIR%\*
|
||||
|
||||
if "%ASAN%" equ "1" set ASAN_OPTS=--asan
|
||||
|
||||
mkdir c:\tests_tmp
|
||||
|
||||
nmake test TESTS="%OPCACHE_OPTS% -g FAIL,BORK,LEAK,XLEAK %ASAN_OPTS% --no-progress -q --offline --show-diff --show-slow 1000 --set-timeout 120 --temp-source c:\tests_tmp --temp-target c:\tests_tmp %PARALLEL%"
|
||||
nmake test TESTS="%OPCACHE_OPTS% -g FAIL,BORK,LEAK,XLEAK --no-progress -q --offline --show-diff --show-slow 1000 --set-timeout 120 --temp-source c:\tests_tmp --temp-target c:\tests_tmp --bless %PARALLEL%"
|
||||
|
||||
set EXIT_CODE=%errorlevel%
|
||||
|
||||
nmake unregister_comtest
|
||||
taskkill /f /im snmpd.exe
|
||||
|
||||
if %EXIT_CODE% GEQ 1 (
|
||||
git checkout ext\pgsql\tests\config.inc
|
||||
git diff > bless_tests.patch
|
||||
)
|
||||
|
||||
exit /b %EXIT_CODE%
|
||||
|
|
6
.github/workflows/docs.yml
vendored
6
.github/workflows/docs.yml
vendored
|
@ -17,11 +17,11 @@ jobs:
|
|||
if: github.repository == 'php/php-src'
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
- name: Install dependencies
|
||||
run: pip install -r docs/requirements.txt
|
||||
run: pip install sphinx-design sphinxawesome-theme rstfmt
|
||||
- name: Check formatting
|
||||
run: make -C docs check-formatting
|
||||
run: rstfmt --check -w 100 docs/source
|
||||
- name: Publish
|
||||
if: github.event_name == 'push'
|
||||
uses: sphinx-notes/pages@v3
|
||||
|
|
56
.github/workflows/nightly.yml
vendored
56
.github/workflows/nightly.yml
vendored
|
@ -54,7 +54,7 @@ jobs:
|
|||
runs-on: [self-hosted, gentoo, ppc64]
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ inputs.branch }}
|
||||
- name: System info
|
||||
|
@ -95,7 +95,7 @@ jobs:
|
|||
image: 'alpine:3.20.1'
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ inputs.branch }}
|
||||
- name: apk
|
||||
|
@ -134,6 +134,7 @@ jobs:
|
|||
jitType: tracing
|
||||
runTestsParameters: >-
|
||||
--asan -x
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
- name: Extra tests
|
||||
uses: ./.github/actions/extra-tests
|
||||
|
@ -206,7 +207,7 @@ jobs:
|
|||
runs-on: ubuntu-${{ matrix.asan && inputs.asan_ubuntu_version || inputs.ubuntu_version }}
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ inputs.branch }}
|
||||
- name: Create MSSQL container
|
||||
|
@ -249,12 +250,14 @@ jobs:
|
|||
jitType: tracing
|
||||
runTestsParameters: >-
|
||||
${{ matrix.run_tests_parameters }}
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
- name: Test OpCache
|
||||
uses: ./.github/actions/test-linux
|
||||
with:
|
||||
runTestsParameters: >-
|
||||
${{ matrix.run_tests_parameters }}
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
- name: Test Function JIT
|
||||
# ASAN frequently timeouts. Each test run takes ~90 minutes, we can
|
||||
|
@ -265,6 +268,7 @@ jobs:
|
|||
jitType: function
|
||||
runTestsParameters: >-
|
||||
${{ matrix.run_tests_parameters }}
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
- name: Extra tests
|
||||
uses: ./.github/actions/extra-tests
|
||||
|
@ -306,7 +310,7 @@ jobs:
|
|||
FIREBIRD_PASSWORD: test
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ inputs.branch }}
|
||||
- name: apt
|
||||
|
@ -340,12 +344,14 @@ jobs:
|
|||
jitType: tracing
|
||||
runTestsParameters: >-
|
||||
${{ matrix.run_tests_parameters }}
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
- name: Test OpCache
|
||||
uses: ./.github/actions/test-linux
|
||||
with:
|
||||
runTestsParameters: >-
|
||||
${{ matrix.run_tests_parameters }}
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
- name: Test Function JIT
|
||||
uses: ./.github/actions/test-linux
|
||||
|
@ -353,6 +359,7 @@ jobs:
|
|||
jitType: function
|
||||
runTestsParameters: >-
|
||||
${{ matrix.run_tests_parameters }}
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
- name: Extra tests
|
||||
uses: ./.github/actions/extra-tests
|
||||
|
@ -374,7 +381,7 @@ jobs:
|
|||
runs-on: macos-${{ matrix.os }}
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ inputs.branch }}
|
||||
- name: brew
|
||||
|
@ -399,11 +406,13 @@ jobs:
|
|||
with:
|
||||
jitType: tracing
|
||||
runTestsParameters: >-
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
- name: Test OpCache
|
||||
uses: ./.github/actions/test-macos
|
||||
with:
|
||||
runTestsParameters: >-
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
- name: Test Function JIT
|
||||
if: matrix.os != '14' || !matrix.zts
|
||||
|
@ -411,6 +420,7 @@ jobs:
|
|||
with:
|
||||
jitType: function
|
||||
runTestsParameters: >-
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
- name: Extra tests
|
||||
uses: ./.github/actions/extra-tests
|
||||
|
@ -449,7 +459,7 @@ jobs:
|
|||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ inputs.branch }}
|
||||
- name: Create MSSQL container
|
||||
|
@ -474,6 +484,7 @@ jobs:
|
|||
with:
|
||||
jitType: tracing
|
||||
runTestsParameters: >-
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
- uses: codecov/codecov-action@v4
|
||||
if: ${{ !cancelled() }}
|
||||
|
@ -502,7 +513,7 @@ jobs:
|
|||
USE_TRACKED_ALLOC: 1
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ inputs.branch }}
|
||||
- name: apt
|
||||
|
@ -527,6 +538,7 @@ jobs:
|
|||
- name: Enable Opcache
|
||||
run: |
|
||||
echo memory_limit=-1 >> /etc/php.d/opcache.ini
|
||||
echo zend_extension=opcache.so > /etc/php.d/opcache.ini
|
||||
echo opcache.enable_cli=1 >> /etc/php.d/opcache.ini
|
||||
echo opcache.enable=1 >> /etc/php.d/opcache.ini
|
||||
echo opcache.protect_memory=1 >> /etc/php.d/opcache.ini
|
||||
|
@ -705,7 +717,7 @@ jobs:
|
|||
runs-on: ubuntu-${{ inputs.ubuntu_version }}
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ inputs.branch }}
|
||||
- name: Create MSSQL container
|
||||
|
@ -727,18 +739,21 @@ jobs:
|
|||
uses: ./.github/actions/test-linux
|
||||
with:
|
||||
runTestsParameters: >-
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
--file-cache-prime
|
||||
- name: Test File Cache (prime shm, use shm)
|
||||
uses: ./.github/actions/test-linux
|
||||
with:
|
||||
runTestsParameters: >-
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
--file-cache-use
|
||||
- name: Test File Cache (prime shm, use file)
|
||||
uses: ./.github/actions/test-linux
|
||||
with:
|
||||
runTestsParameters: >-
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
--file-cache-use
|
||||
-d opcache.file_cache_only=1
|
||||
|
@ -746,6 +761,7 @@ jobs:
|
|||
uses: ./.github/actions/test-linux
|
||||
with:
|
||||
runTestsParameters: >-
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
--file-cache-prime
|
||||
-d opcache.file_cache_only=1
|
||||
|
@ -753,6 +769,7 @@ jobs:
|
|||
uses: ./.github/actions/test-linux
|
||||
with:
|
||||
runTestsParameters: >-
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
--file-cache-use
|
||||
-d opcache.file_cache_only=1
|
||||
|
@ -768,7 +785,7 @@ jobs:
|
|||
runs-on: ubuntu-${{ inputs.ubuntu_version }}
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ inputs.branch }}
|
||||
- name: apt
|
||||
|
@ -846,6 +863,7 @@ jobs:
|
|||
with:
|
||||
runTestsParameters: >-
|
||||
--msan
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
- name: Verify generated files are up to date
|
||||
uses: ./.github/actions/verify-generated-files
|
||||
|
@ -859,7 +877,7 @@ jobs:
|
|||
runs-on: ubuntu-${{ inputs.ubuntu_version }}
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ inputs.branch }}
|
||||
- name: apt
|
||||
|
@ -909,38 +927,38 @@ jobs:
|
|||
CXX: ccache g++
|
||||
steps:
|
||||
- name: git checkout PHP
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: php
|
||||
ref: ${{ inputs.branch }}
|
||||
- name: git checkout apcu
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: krakjoe/apcu
|
||||
path: apcu
|
||||
- name: git checkout imagick
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: Imagick/imagick
|
||||
path: imagick
|
||||
- name: git checkout memcached
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: php-memcached-dev/php-memcached
|
||||
path: memcached
|
||||
- name: git checkout redis
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: phpredis/phpredis
|
||||
path: redis
|
||||
- name: git checkout xdebug
|
||||
if: false
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: xdebug/xdebug
|
||||
path: xdebug
|
||||
- name: git checkout yaml
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: php/pecl-file_formats-yaml
|
||||
path: yaml
|
||||
|
@ -1050,7 +1068,7 @@ jobs:
|
|||
- name: git config
|
||||
run: git config --global core.autocrlf false && git config --global core.eol lf
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ inputs.branch }}
|
||||
- name: Setup
|
||||
|
@ -1071,7 +1089,7 @@ jobs:
|
|||
timeout-minutes: 50
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ inputs.branch }}
|
||||
- name: FreeBSD
|
||||
|
|
42
.github/workflows/push.yml
vendored
42
.github/workflows/push.yml
vendored
|
@ -78,11 +78,10 @@ jobs:
|
|||
zts: true
|
||||
asan: true
|
||||
name: "LINUX_X64_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}${{ matrix.asan && '_ASAN' || '' }}"
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 50
|
||||
runs-on: ubuntu-${{ !matrix.asan && '22' || '24' }}.04
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
- name: apt
|
||||
uses: ./.github/actions/apt-x64
|
||||
- name: System info
|
||||
|
@ -130,6 +129,7 @@ jobs:
|
|||
with:
|
||||
jitType: tracing
|
||||
runTestsParameters: >-
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
${{ matrix.asan && '--asan -x' || '' }}
|
||||
- name: Verify generated files are up to date
|
||||
|
@ -139,14 +139,12 @@ jobs:
|
|||
if: github.repository == 'php/php-src' || github.event_name == 'pull_request'
|
||||
name: LINUX_X32_DEBUG_ZTS
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 50
|
||||
container:
|
||||
image: ubuntu:24.04
|
||||
image: ubuntu:22.04
|
||||
env:
|
||||
MYSQL_TEST_HOST: mysql
|
||||
PDO_MYSQL_TEST_DSN: mysql:host=mysql;dbname=test
|
||||
PDO_MYSQL_TEST_HOST: mysql
|
||||
PDO_FIREBIRD_TEST_DSN: firebird:dbname=firebird:test.fdb
|
||||
services:
|
||||
mysql:
|
||||
image: mysql:8.3
|
||||
|
@ -155,18 +153,9 @@ jobs:
|
|||
env:
|
||||
MYSQL_DATABASE: test
|
||||
MYSQL_ROOT_PASSWORD: root
|
||||
firebird:
|
||||
image: jacobalberty/firebird
|
||||
ports:
|
||||
- 3050:3050
|
||||
env:
|
||||
ISC_PASSWORD: test
|
||||
FIREBIRD_DATABASE: test.fdb
|
||||
FIREBIRD_USER: test
|
||||
FIREBIRD_PASSWORD: test
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
- name: apt
|
||||
uses: ./.github/actions/apt-x32
|
||||
- name: ccache
|
||||
|
@ -189,6 +178,7 @@ jobs:
|
|||
with:
|
||||
jitType: tracing
|
||||
runTestsParameters: >-
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
MACOS_DEBUG_NTS:
|
||||
if: github.repository == 'php/php-src' || github.event_name == 'pull_request'
|
||||
|
@ -196,14 +186,13 @@ jobs:
|
|||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: 15
|
||||
- os: 14
|
||||
arch: ARM64
|
||||
name: MACOS_${{ matrix.arch }}_DEBUG_NTS
|
||||
runs-on: macos-${{ matrix.os }}
|
||||
timeout-minutes: 50
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
- name: brew
|
||||
uses: ./.github/actions/brew
|
||||
- name: ccache
|
||||
|
@ -227,6 +216,7 @@ jobs:
|
|||
with:
|
||||
jitType: tracing
|
||||
runTestsParameters: >-
|
||||
-d zend_extension=opcache.so
|
||||
-d opcache.enable_cli=1
|
||||
- name: Verify generated files are up to date
|
||||
uses: ./.github/actions/verify-generated-files
|
||||
|
@ -234,7 +224,6 @@ jobs:
|
|||
if: github.repository == 'php/php-src' || github.event_name == 'pull_request'
|
||||
name: WINDOWS_X64_ZTS
|
||||
runs-on: windows-2022
|
||||
timeout-minutes: 50
|
||||
env:
|
||||
PHP_BUILD_CACHE_BASE_DIR: C:\build-cache
|
||||
PHP_BUILD_OBJ_DIR: C:\obj
|
||||
|
@ -250,7 +239,7 @@ jobs:
|
|||
- name: git config
|
||||
run: git config --global core.autocrlf false && git config --global core.eol lf
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
- name: Setup
|
||||
uses: ./.github/actions/setup-windows
|
||||
- name: Build
|
||||
|
@ -260,11 +249,10 @@ jobs:
|
|||
BENCHMARKING:
|
||||
name: BENCHMARKING
|
||||
if: github.repository == 'php/php-src' || github.event_name == 'pull_request'
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 50
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
# ASLR can cause a lot of noise due to missed sse opportunities for memcpy
|
||||
|
@ -296,6 +284,7 @@ jobs:
|
|||
./configure \
|
||||
--disable-debug \
|
||||
--enable-mbstring \
|
||||
--enable-opcache \
|
||||
--enable-option-checking=fatal \
|
||||
--enable-sockets \
|
||||
--enable-werror \
|
||||
|
@ -315,6 +304,7 @@ jobs:
|
|||
sudo mkdir -p /etc/php.d
|
||||
sudo chmod 777 /etc/php.d
|
||||
echo mysqli.default_socket=/var/run/mysqld/mysqld.sock > /etc/php.d/mysqli.ini
|
||||
echo zend_extension=opcache.so >> /etc/php.d/opcache.ini
|
||||
echo opcache.enable=1 >> /etc/php.d/opcache.ini
|
||||
echo opcache.enable_cli=1 >> /etc/php.d/opcache.ini
|
||||
- name: Setup
|
||||
|
@ -326,7 +316,7 @@ jobs:
|
|||
mysql -uroot -proot -e "CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'wordpress'; FLUSH PRIVILEGES;"
|
||||
mysql -uroot -proot -e "GRANT ALL PRIVILEGES ON *.* TO 'wordpress'@'localhost' WITH GRANT OPTION;"
|
||||
- name: git checkout benchmarking-data
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: php/benchmarking-data
|
||||
ssh-key: ${{ secrets.BENCHMARKING_DATA_DEPLOY_KEY }}
|
||||
|
@ -369,6 +359,6 @@ jobs:
|
|||
timeout-minutes: 50
|
||||
steps:
|
||||
- name: git checkout
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v4
|
||||
- name: FreeBSD
|
||||
uses: ./.github/actions/freebsd
|
||||
|
|
300
.github/workflows/real-time-benchmark.yml
vendored
300
.github/workflows/real-time-benchmark.yml
vendored
|
@ -1,300 +0,0 @@
|
|||
name: Real-time Benchmark
|
||||
on:
|
||||
schedule:
|
||||
- cron: "30 0 * * *"
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
pull_request:
|
||||
description: 'PR number that is going to be benchmarked (e.g. "1234")'
|
||||
required: true
|
||||
type: number
|
||||
jit:
|
||||
description: 'Whether JIT is benchmarked'
|
||||
required: false
|
||||
default: "0"
|
||||
type: choice
|
||||
options:
|
||||
- "0"
|
||||
- "1"
|
||||
instruction_count:
|
||||
description: 'Whether Valgrind instruction count should be measured'
|
||||
required: true
|
||||
default: "0"
|
||||
type: choice
|
||||
options:
|
||||
- "0"
|
||||
- "1"
|
||||
opcache:
|
||||
description: 'Whether opcache is enabled for the benchmarked commit'
|
||||
required: true
|
||||
default: "1"
|
||||
type: choice
|
||||
options:
|
||||
- "0"
|
||||
- "1"
|
||||
- "2"
|
||||
baseline_opcache:
|
||||
description: 'Whether opcache is enabled for the baseline commit'
|
||||
required: true
|
||||
default: "1"
|
||||
type: choice
|
||||
options:
|
||||
- "0"
|
||||
- "1"
|
||||
- "2"
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}
|
||||
cancel-in-progress: false
|
||||
jobs:
|
||||
REAL_TIME_BENCHMARK:
|
||||
name: REAL_TIME_BENCHMARK
|
||||
if: github.repository == 'php/php-src' || github.event_name == 'workflow_dispatch'
|
||||
runs-on: ubuntu-22.04
|
||||
env:
|
||||
REPOSITORY: ${{ github.repository }}
|
||||
BRANCH: "master"
|
||||
COMMIT: ${{ github.sha }}
|
||||
BASELINE_COMMIT: "d5f6e56610c729710073350af318c4ea1b292cfe"
|
||||
ID: "master"
|
||||
OPCACHE: ${{ inputs.opcache || '1' }}
|
||||
BASELINE_OPCACHE: ${{ inputs.baseline_opcache || '2' }}
|
||||
JIT: ${{ inputs.jit || '1' }}
|
||||
INSTRUCTION_COUNT: ${{ inputs.instruction_count || '0' }}
|
||||
YEAR: ""
|
||||
steps:
|
||||
- name: Setup benchmark environment
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
YEAR="$(date '+%Y')"
|
||||
echo "YEAR=$YEAR" >> $GITHUB_ENV
|
||||
|
||||
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
||||
PR_INFO=$(gh pr view ${{ inputs.pull_request }} --json headRepositoryOwner,headRepository,headRefName,headRefOid,baseRefOid --repo ${{ github.repository }} | jq -r '.headRepositoryOwner.login, .headRepository.name, .headRefName, .headRefOid, .baseRefOid')
|
||||
|
||||
REPOSITORY="$(echo "$PR_INFO" | sed -n '1p')/$(echo "$PR_INFO" | sed -n '2p')"
|
||||
echo "REPOSITORY=$REPOSITORY" >> $GITHUB_ENV
|
||||
|
||||
BRANCH=$(echo "$PR_INFO" | sed -n '3p')
|
||||
echo "BRANCH=$BRANCH" >> $GITHUB_ENV
|
||||
|
||||
COMMIT=$(echo "$PR_INFO" | sed -n '4p')
|
||||
echo "COMMIT=$COMMIT" >> $GITHUB_ENV
|
||||
|
||||
BASELINE_COMMIT=$(echo "$PR_INFO" | sed -n '5p')
|
||||
echo "BASELINE_COMMIT=$BASELINE_COMMIT" >> $GITHUB_ENV
|
||||
|
||||
echo "ID=benchmarked" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
set -ex
|
||||
sudo apt-get update
|
||||
sudo apt-get install gpg
|
||||
|
||||
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
|
||||
gpg --no-default-keyring --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg --fingerprint
|
||||
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
sudo apt-get update -y
|
||||
sudo apt-get install -y terraform=1.5.7-*
|
||||
- name: Checkout benchmark suite
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
repository: 'kocsismate/php-version-benchmarks'
|
||||
ref: 'main'
|
||||
fetch-depth: 1
|
||||
path: 'php-version-benchmarks'
|
||||
- name: Checkout php-src (benchmarked version)
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
repository: '${{ env.REPOSITORY }}'
|
||||
ref: '${{ env.COMMIT }}'
|
||||
fetch-depth: 100
|
||||
path: 'php-version-benchmarks/tmp/php_${{ env.ID }}'
|
||||
- name: Checkout php-src (baseline version)
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
repository: '${{ env.REPOSITORY }}'
|
||||
ref: '${{ env.BASELINE_COMMIT }}'
|
||||
fetch-depth: 100
|
||||
path: 'php-version-benchmarks/tmp/php_baseline'
|
||||
- name: Setup benchmark results
|
||||
run: |
|
||||
git config --global user.name "Benchmark"
|
||||
git config --global user.email "benchmark@php.net"
|
||||
|
||||
rm -rf ./php-version-benchmarks/docs/results
|
||||
- name: Checkout benchmark data
|
||||
if: github.event_name != 'workflow_dispatch'
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
repository: php/real-time-benchmark-data
|
||||
ssh-key: ${{ secrets.PHP_VERSION_BENCHMARK_RESULTS_DEPLOY_KEY }}
|
||||
path: 'php-version-benchmarks/docs/results'
|
||||
- name: Setup infra config
|
||||
run: |
|
||||
set -e
|
||||
|
||||
cp ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini.dist ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
|
||||
ESCAPED_DOCKER_REGISTRY=$(printf '%s\n' "${{ secrets.PHP_VERSION_BENCHMARK_DOCKER_REGISTRY }}" | sed -e 's/[\/&]/\\&/g')
|
||||
sed -i "s/INFRA_DOCKER_REGISTRY=public.ecr.aws\/abcdefgh/INFRA_DOCKER_REGISTRY=$ESCAPED_DOCKER_REGISTRY/g" ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
|
||||
sed -i "s/INFRA_MEASURE_INSTRUCTION_COUNT=0/INFRA_MEASURE_INSTRUCTION_COUNT=${{ env.INSTRUCTION_COUNT }}/g" ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
|
||||
cp ./php-version-benchmarks/build/infrastructure/config/aws.tfvars.dist ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
|
||||
sed -i 's/access_key = ""/access_key = "${{ secrets.PHP_VERSION_BENCHMARK_AWS_ACCESS_KEY }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
|
||||
sed -i 's/secret_key = ""/secret_key = "${{ secrets.PHP_VERSION_BENCHMARK_AWS_SECRET_KEY }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
|
||||
sed -i 's/github_token = ""/github_token = "${{ secrets.GITHUB_TOKEN }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
|
||||
- name: Setup PHP config - baseline PHP version
|
||||
run: |
|
||||
set -e
|
||||
|
||||
BASELINE_SHORT_SHA="$(echo "${{ env.BASELINE_COMMIT }}" | cut -c1-4)"
|
||||
|
||||
cat << EOF > ./php-version-benchmarks/config/php/baseline.ini
|
||||
PHP_NAME="PHP - baseline@$BASELINE_SHORT_SHA"
|
||||
PHP_ID=php_baseline
|
||||
|
||||
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
|
||||
PHP_BRANCH=${{ env.BRANCH }}
|
||||
PHP_COMMIT=${{ env.BASELINE_COMMIT }}
|
||||
|
||||
PHP_OPCACHE=${{ env.BASELINE_OPCACHE }}
|
||||
PHP_JIT=0
|
||||
EOF
|
||||
- name: Setup PHP config - baseline PHP version with JIT
|
||||
if: github.event_name == 'workflow_dispatch' && inputs.jit == '1'
|
||||
run: |
|
||||
set -e
|
||||
|
||||
BASELINE_SHORT_SHA="$(echo "${{ env.BASELINE_COMMIT }}" | cut -c1-4)"
|
||||
|
||||
cat << EOF > ./php-version-benchmarks/config/php/baseline_jit.ini
|
||||
PHP_NAME="PHP - baseline@$BASELINE_SHORT_SHA (JIT)"
|
||||
PHP_ID=php_baseline_jit
|
||||
|
||||
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
|
||||
PHP_BRANCH=${{ env.BRANCH }}
|
||||
PHP_COMMIT=${{ env.BASELINE_COMMIT }}
|
||||
|
||||
PHP_OPCACHE=${{ env.BASELINE_OPCACHE }}
|
||||
PHP_JIT=${{ env.JIT }}
|
||||
EOF
|
||||
|
||||
git clone ./php-version-benchmarks/tmp/php_baseline/ ./php-version-benchmarks/tmp/php_baseline_jit
|
||||
- name: Setup PHP config - previous PHP version
|
||||
if: github.event_name != 'workflow_dispatch'
|
||||
run: |
|
||||
set -e
|
||||
|
||||
DATABASE="./php-version-benchmarks/docs/results/${{ env.YEAR }}/database.tsv"
|
||||
if [ -f "$DATABASE" ]; then
|
||||
LAST_RESULT_SHA="$(tail -n 2 "$DATABASE" | head -n 1 | cut -f 6)"
|
||||
else
|
||||
YESTERDAY="$(date -d "-2 day 23:59:59" '+%Y-%m-%d %H:%M:%S')"
|
||||
LAST_RESULT_SHA="$(cd ./php-version-benchmarks/tmp/php_${{ env.ID }}/ && git --no-pager log --until="$YESTERDAY" -n 1 --pretty='%H')"
|
||||
fi
|
||||
|
||||
cat << EOF > ./php-version-benchmarks/config/php/previous.ini
|
||||
PHP_NAME="PHP - previous ${{ env.BRANCH }}"
|
||||
PHP_ID=php_previous
|
||||
|
||||
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
|
||||
PHP_BRANCH=${{ env.BRANCH }}
|
||||
PHP_COMMIT=$LAST_RESULT_SHA
|
||||
|
||||
PHP_OPCACHE=1
|
||||
PHP_JIT=0
|
||||
EOF
|
||||
- name: Setup PHP config - benchmarked PHP version
|
||||
run: |
|
||||
set -e
|
||||
|
||||
cat << EOF > ./php-version-benchmarks/config/php/this.ini
|
||||
PHP_NAME="PHP - ${{ env.BRANCH }}"
|
||||
PHP_ID=php_${{ env.ID }}
|
||||
|
||||
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
|
||||
PHP_BRANCH=${{ env.BRANCH }}
|
||||
PHP_COMMIT=${{ env.COMMIT }}
|
||||
|
||||
PHP_OPCACHE=${{ env.OPCACHE }}
|
||||
PHP_JIT=0
|
||||
EOF
|
||||
- name: Setup PHP config - benchmarked PHP version with JIT
|
||||
if: env.JIT == '1'
|
||||
run: |
|
||||
set -e
|
||||
|
||||
cat << EOF > ./php-version-benchmarks/config/php/this_jit.ini
|
||||
PHP_NAME="PHP - ${{ env.BRANCH }} (JIT)"
|
||||
PHP_ID=php_${{ env.ID }}_jit
|
||||
|
||||
PHP_REPO=https://github.com/${{ env.REPOSITORY }}.git
|
||||
PHP_BRANCH=${{ env.BRANCH }}
|
||||
PHP_COMMIT=${{ env.COMMIT }}
|
||||
|
||||
PHP_OPCACHE=${{ env.OPCACHE }}
|
||||
PHP_JIT=${{ env.JIT }}
|
||||
EOF
|
||||
|
||||
git clone ./php-version-benchmarks/tmp/php_${{ env.ID }}/ ./php-version-benchmarks/tmp/php_${{ env.ID }}_jit
|
||||
- name: Setup test config
|
||||
run: |
|
||||
set -e
|
||||
|
||||
cp ./php-version-benchmarks/config/test/1_laravel.ini.dist ./php-version-benchmarks/config/test/1_laravel.ini
|
||||
cp ./php-version-benchmarks/config/test/2_symfony_main.ini.dist ./php-version-benchmarks/config/test/2_symfony_main.ini
|
||||
cp ./php-version-benchmarks/config/test/4_wordpress.ini.dist ./php-version-benchmarks/config/test/4_wordpress.ini
|
||||
cp ./php-version-benchmarks/config/test/5_bench.php.ini.dist ./php-version-benchmarks/config/test/5_bench.php.ini
|
||||
cp ./php-version-benchmarks/config/test/6_micro_bench.php.ini.dist ./php-version-benchmarks/config/test/6_micro_bench.php.ini
|
||||
- name: Run benchmark
|
||||
run: ./php-version-benchmarks/benchmark.sh run aws
|
||||
- name: Store results
|
||||
if: github.repository == 'php/php-src' && github.event_name != 'workflow_dispatch'
|
||||
run: |
|
||||
set -ex
|
||||
|
||||
cd ./php-version-benchmarks/docs/results
|
||||
git pull --autostash
|
||||
if [ -e ".git/MERGE_HEAD" ]; then
|
||||
echo "Merging, can't proceed"
|
||||
exit 1
|
||||
fi
|
||||
git add .
|
||||
if git diff --cached --quiet; then
|
||||
exit 1
|
||||
fi
|
||||
git commit -m "Add result for ${{ github.repository }}@${{ github.sha }}"
|
||||
git push
|
||||
- name: Upload artifact
|
||||
if: github.event_name == 'workflow_dispatch'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: results
|
||||
path: ./php-version-benchmarks/docs/results/${{ env.YEAR }}
|
||||
retention-days: 30
|
||||
- name: Comment results
|
||||
if: github.event_name == 'workflow_dispatch'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
cd ./php-version-benchmarks/tmp/php_${{ env.ID }}
|
||||
NEWEST_RESULT_DIRECTORY=$(ls -td ${{ github.workspace }}/php-version-benchmarks/docs/results/${{ env.YEAR }}/*/ | head -1)
|
||||
gh pr comment ${{ inputs.pull_request }} --body-file "${NEWEST_RESULT_DIRECTORY}result.md" --repo ${{ github.repository }}
|
||||
- name: Cleanup
|
||||
if: always()
|
||||
run: |
|
||||
set -ex
|
||||
|
||||
rm -rf ./php-version-benchmarks/tmp/
|
||||
rm -f ./php-version-benchmarks/build/infrastructure/config/*.tfvars
|
||||
rm -rf ./php-version-benchmarks/build/infrastructure/aws/.terraform/
|
||||
rm -f ./php-version-benchmarks/build/infrastructure/aws/.terraform.lock.hcl
|
||||
rm -f ./php-version-benchmarks/build/infrastructure/aws/aws.tfplan
|
||||
rm -f ./php-version-benchmarks/build/infrastructure/aws/terraform.tfstate
|
||||
rm -f ./php-version-benchmarks/build/infrastructure/aws/terraform.tfstate.backup
|
||||
rm -f ./php-version-benchmarks/config/infra/aws/*.ini
|
2
.github/workflows/root.yml
vendored
2
.github/workflows/root.yml
vendored
|
@ -13,7 +13,7 @@ jobs:
|
|||
outputs:
|
||||
branches: ${{ steps.set-matrix.outputs.branches }}
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
# Set fetch-depth to 0 to clone the full repository
|
||||
# including all branches. This is required to find
|
||||
|
|
10
.gitignore
vendored
10
.gitignore
vendored
|
@ -238,7 +238,6 @@ php
|
|||
**/tests/**/*.exp
|
||||
**/tests/**/*.log
|
||||
**/tests/**/*.sh
|
||||
**/tests/**/*.stdin
|
||||
|
||||
# Generated by some test cases
|
||||
**/tests/**/*.db
|
||||
|
@ -295,13 +294,6 @@ tmp-php.ini
|
|||
/junit.out.xml
|
||||
/.ccache/
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Editor configuration directories
|
||||
# ------------------------------------------------------------------------------
|
||||
/.idea/
|
||||
/.vscode/
|
||||
/.zed/
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Additional test build files
|
||||
# ------------------------------------------------------------------------------
|
||||
|
@ -314,6 +306,6 @@ tmp-php.ini
|
|||
!/ext/fileinfo/libmagic/config.h
|
||||
!/ext/fileinfo/libmagic.patch
|
||||
!/ext/fileinfo/magicdata.patch
|
||||
!/ext/lexbor/patches/*.patch
|
||||
!/ext/dom/lexbor/patches/*.patch
|
||||
!/ext/pcre/pcre2lib/config.h
|
||||
!/win32/build/Makefile
|
||||
|
|
|
@ -32,12 +32,6 @@ had several contributions accepted, commit privileges are often quickly granted.
|
|||
PHP welcomes pull requests to [add tests](#writing-tests), fix bugs and to
|
||||
implement RFCs. Please be sure to include tests as appropriate!
|
||||
|
||||
By submitting a pull request, you certify that you have the necessary rights
|
||||
to submit the work, that the work does not violate any third-party rights
|
||||
(including those of your employer, if applicable), and that you license your
|
||||
contribution under the PHP License or under another license if explicitly
|
||||
accepted by the PHP project maintainers.
|
||||
|
||||
If you are fixing a bug, then please submit your PR against the lowest actively
|
||||
supported branch of PHP that the bug affects (only green branches on
|
||||
[the supported version page](https://www.php.net/supported-versions.php) are
|
||||
|
@ -356,10 +350,9 @@ Currently, we have the following branches in use:
|
|||
|
||||
| Branch | |
|
||||
| --------- | --------- |
|
||||
| master | Active development branch for PHP 8.5, which is open for backwards incompatible changes and major internal API changes. |
|
||||
| PHP-8.4 | Is used to release the PHP 8.4.x series. This is a current stable version and is open for bugfixes only. |
|
||||
| master | Active development branch for PHP 8.4, which is open for backwards incompatible changes and major internal API changes. |
|
||||
| PHP-8.3 | Is used to release the PHP 8.3.x series. This is a current stable version and is open for bugfixes only. |
|
||||
| PHP-8.2 | Is used to release the PHP 8.2.x series. This is an old stable version and is open for security fixes only. |
|
||||
| PHP-8.2 | Is used to release the PHP 8.2.x series. This is a current stable version and is open for bugfixes only. |
|
||||
| PHP-8.1 | Is used to release the PHP 8.1.x series. This is an old stable version and is open for security fixes only. |
|
||||
| PHP-8.0 | This branch is closed. |
|
||||
| PHP-7.4 | This branch is closed. |
|
||||
|
|
17
EXTENSIONS
17
EXTENSIONS
|
@ -195,13 +195,6 @@ PRIMARY MAINTAINER: Thies C. Arntzen <thies@thieso.net> (1999 - 2002)
|
|||
MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
-------------------------------------------------------------------------------
|
||||
EXTENSION: lexbor
|
||||
PRIMARY MAINTAINER: Niels Dossche <nielsdos@php.net> (2025 - 2025)
|
||||
Mate Kocsis <kocsismate@php.net> (2025 - 2025)
|
||||
MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
SINCE: 8.5
|
||||
-------------------------------------------------------------------------------
|
||||
EXTENSION: libxml
|
||||
PRIMARY MAINTAINER: Rob Richards <rrichards@php.net> (2003 - 2009)
|
||||
Christian Stocker <chregu@php.net> (2004 - 2011)
|
||||
|
@ -238,7 +231,6 @@ SINCE: 5.0
|
|||
-------------------------------------------------------------------------------
|
||||
EXTENSION: bcmath
|
||||
PRIMARY MAINTAINER: Andi Gutmans <andi@php.net> (2000 - 2004)
|
||||
Saki Takamachi <saki@php.net> (2024 - 2025)
|
||||
MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
-------------------------------------------------------------------------------
|
||||
|
@ -420,7 +412,7 @@ STATUS: Working
|
|||
-------------------------------------------------------------------------------
|
||||
EXTENSION: random
|
||||
PRIMARY MAINTAINER Go Kudo <zeriyoshi@php.net> (2022 - 2024)
|
||||
Tim Düsterhus <timwolla@php.net> (2022 - 2025)
|
||||
Tim Düsterhus <timwolla@php.net> (2022 - 2024)
|
||||
MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
SINCE: 8.2.0
|
||||
|
@ -434,7 +426,6 @@ EXTENSION: reflection
|
|||
PRIMARY MAINTAINER: Marcus Börger <helly@php.net> (2003 - 2009)
|
||||
Johannes Schlüter <johannes@php.net> (2006 - 2014)
|
||||
Nikita Popov <nikic@php.net> (2019 - 2020)
|
||||
Daniel Scherzer <daniel.e.scherzer@gmail.com> (2025 - 2025)
|
||||
MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
-------------------------------------------------------------------------------
|
||||
|
@ -504,12 +495,6 @@ PRIMARY MAINTAINER: Andrei Zmievski <andrei@php.net> (2002 - 2002)
|
|||
MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
-------------------------------------------------------------------------------
|
||||
EXTENSION: uri
|
||||
PRIMARY MAINTAINER Máté Kocsis <kocsismate@php.net> (2025 - 2025)
|
||||
MAINTENANCE: Maintained
|
||||
STATUS: Working
|
||||
SINCE: 8.5.0
|
||||
-------------------------------------------------------------------------------
|
||||
EXTENSION: zip
|
||||
PRIMARY MAINTAINER: Pierre-Alain Joye <pajoye@php.net> (2006 - 2011)
|
||||
Remi Collet <remi@php.net> (2013-2020)
|
||||
|
|
|
@ -17,9 +17,8 @@
|
|||
17. ext/mbstring/ucgendat portions based on the ucgendat.c from the OpenLDAP
|
||||
18. avifinfo (ext/standard/libavifinfo) see ext/standard/libavifinfo/LICENSE
|
||||
19. xxHash (ext/hash/xxhash)
|
||||
20. Lexbor (ext/lexbor/lexbor) see ext/lexbor/LICENSE
|
||||
20. Lexbor (ext/dom/lexbor/lexbor) see ext/dom/lexbor/LICENSE
|
||||
21. Portions of libcperciva (ext/hash/hash_sha_{ni,sse2}.c) see the header in the source file
|
||||
22. uriparser (ext/uri/uriparser) see ext/uri/uriparser/COPYING
|
||||
|
||||
3. pcre2lib (ext/pcre)
|
||||
|
||||
|
|
42
README.md
42
README.md
|
@ -15,7 +15,7 @@ blog to the most popular websites in the world. PHP is distributed under the
|
|||
[PHP License v3.01](LICENSE).
|
||||
|
||||
[](https://github.com/php/php-src/actions/workflows/push.yml)
|
||||
[](https://issues.oss-fuzz.com/issues?q=project:php)
|
||||
[](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:php)
|
||||
|
||||
## Documentation
|
||||
|
||||
|
@ -42,50 +42,28 @@ a default build, you will additionally need libxml2 and libsqlite3.
|
|||
|
||||
On Ubuntu, you can install these using:
|
||||
|
||||
```shell
|
||||
sudo apt install -y pkg-config build-essential autoconf bison re2c libxml2-dev libsqlite3-dev
|
||||
```
|
||||
sudo apt install -y pkg-config build-essential autoconf bison re2c \
|
||||
libxml2-dev libsqlite3-dev
|
||||
|
||||
On Fedora, you can install these using:
|
||||
|
||||
```shell
|
||||
sudo dnf install re2c bison autoconf make libtool ccache libxml2-devel sqlite-devel
|
||||
```
|
||||
|
||||
On MacOS, you can install these using `brew`:
|
||||
|
||||
```shell
|
||||
brew install autoconf bison re2c iconv libxml2 sqlite
|
||||
```
|
||||
|
||||
or with `MacPorts`:
|
||||
|
||||
```shell
|
||||
sudo port install autoconf bison re2c libiconv libxml2 sqlite3
|
||||
```
|
||||
|
||||
Generate configure:
|
||||
|
||||
```shell
|
||||
./buildconf
|
||||
```
|
||||
|
||||
Configure your build. `--enable-debug` is recommended for development, see
|
||||
`./configure --help` for a full list of options.
|
||||
|
||||
```shell
|
||||
# For development
|
||||
./configure --enable-debug
|
||||
# For production
|
||||
./configure
|
||||
```
|
||||
|
||||
Build PHP. To speed up the build, specify the maximum number of jobs using the
|
||||
`-j` argument:
|
||||
Build PHP. To speed up the build, specify the maximum number of jobs using `-j`:
|
||||
|
||||
```shell
|
||||
make -j4
|
||||
```
|
||||
|
||||
The number of jobs should usually match the number of available cores, which
|
||||
can be determined using `nproc`.
|
||||
|
@ -96,21 +74,13 @@ PHP ships with an extensive test suite, the command `make test` is used after
|
|||
successful compilation of the sources to run this test suite.
|
||||
|
||||
It is possible to run tests using multiple cores by setting `-jN` in
|
||||
`TEST_PHP_ARGS` or `TESTS`:
|
||||
`TEST_PHP_ARGS`:
|
||||
|
||||
```shell
|
||||
make TEST_PHP_ARGS=-j4 test
|
||||
```
|
||||
|
||||
Shall run `make test` with a maximum of 4 concurrent jobs: Generally the maximum
|
||||
number of jobs should not exceed the number of cores available.
|
||||
|
||||
Use the `TEST_PHP_ARGS` or `TESTS` variable to test only specific directories:
|
||||
|
||||
```shell
|
||||
make TESTS=tests/lang/ test
|
||||
```
|
||||
|
||||
The [qa.php.net](https://qa.php.net) site provides more detailed info about
|
||||
testing and quality assurance.
|
||||
|
||||
|
@ -118,9 +88,7 @@ testing and quality assurance.
|
|||
|
||||
After a successful build (and test), PHP may be installed with:
|
||||
|
||||
```shell
|
||||
make install
|
||||
```
|
||||
|
||||
Depending on your permissions and prefix, `make install` may need super user
|
||||
permissions.
|
||||
|
|
|
@ -778,7 +778,7 @@ TSRM_API size_t tsrm_get_ls_cache_tcb_offset(void)
|
|||
return 0;
|
||||
#elif defined(__x86_64__) && defined(__GNUC__) && !defined(__FreeBSD__) && \
|
||||
!defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__MUSL__) && \
|
||||
!defined(__HAIKU__) && !defined(__CYGWIN__)
|
||||
!defined(__HAIKU__)
|
||||
size_t ret;
|
||||
|
||||
asm ("movq _tsrm_ls_cache@gottpoff(%%rip),%0"
|
||||
|
@ -786,7 +786,7 @@ TSRM_API size_t tsrm_get_ls_cache_tcb_offset(void)
|
|||
return ret;
|
||||
#elif defined(__i386__) && defined(__GNUC__) && !defined(__FreeBSD__) && \
|
||||
!defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__MUSL__) && \
|
||||
!defined(__HAIKU__) && !defined(__CYGWIN__)
|
||||
!defined(__HAIKU__)
|
||||
size_t ret;
|
||||
|
||||
asm ("leal _tsrm_ls_cache@ntpoff,%0"
|
||||
|
|
|
@ -636,7 +636,7 @@ TSRM_API int shmget(key_t key, size_t size, int flags)
|
|||
{/*{{{*/
|
||||
shm_pair *shm;
|
||||
char shm_segment[sizeof(SEGMENT_PREFIX INT_MIN_AS_STRING)];
|
||||
HANDLE shm_handle = NULL;
|
||||
HANDLE shm_handle = NULL, info_handle = NULL;
|
||||
BOOL created = FALSE;
|
||||
|
||||
if (key != IPC_PRIVATE) {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
PHP 8.5 INTERNALS UPGRADE NOTES
|
||||
PHP 8.4 INTERNALS UPGRADE NOTES
|
||||
|
||||
1. Internal API changes
|
||||
|
||||
|
@ -14,158 +14,413 @@ PHP 8.5 INTERNALS UPGRADE NOTES
|
|||
1. Internal API changes
|
||||
========================
|
||||
|
||||
- Core
|
||||
. PG(arg_separator).input and PG(arg_separator).output are now `zend_string*`
|
||||
instead of `char*`.
|
||||
. DL_LOAD now doesn't use RTLD_DEEPBIND deepbind anymore on platforms
|
||||
where dlmopen with LM_ID_NEWLM is available:
|
||||
this means shared library symbol isolation (if needed) must be enabled on
|
||||
the user side when requiring libphp.so, by using dlmopen with LM_ID_NEWLM
|
||||
instead of dlopen.
|
||||
RTLD_DEEPBIND is still enabled when the Apache SAPI is in use.
|
||||
. The ptr field of the php_stream_notifier struct is now a void* instead
|
||||
of a zval. If the zval was used to store IS_PTR values only, the
|
||||
extra layer of indirection can be removed. In other cases a zval can
|
||||
be heap-allocated and stored in the pointer as a minimal change to keep
|
||||
compatibility.
|
||||
* zend_register_module_ex() now takes an additional int module_type argument.
|
||||
This function will also assign the module number and type, there is no need
|
||||
to do this at the call site anymore. Writing the handle should happen after
|
||||
successful registration.
|
||||
|
||||
- Hash
|
||||
. Hash functions now use proper hash_spec_result enum for return values
|
||||
instead of using SUCCESS and FAILURE.
|
||||
* ZPP now accepts a F or Z_PARAM_FUNC_NO_TRAMPOLINE_FREE type check.
|
||||
This is identical to the 'f' or Z_PARAM_FUNC type check, except the FCC is
|
||||
always initialized because it doesn't free trampolines.
|
||||
Trampolines MUST be freed using zend_release_fcall_info_cache() or consumed.
|
||||
Z_PARAM_FUNC_EX2 was added as well with the same arguments as Z_PARAM_FUNC_EX
|
||||
plus an additional argument free_trampoline.
|
||||
|
||||
- Zend
|
||||
. Added zend_safe_assign_to_variable_noref() function to safely assign
|
||||
a value to a non-reference zval.
|
||||
. Added zval_ptr_safe_dtor() to safely destroy a zval when a destructor
|
||||
could interfere.
|
||||
. zend_get_callable_name() now returns the name of the underlying function
|
||||
for fake closures.
|
||||
. Added smart_string_append_printf() matching smart_str_append_printf() for
|
||||
char* instead of zend_string*-based smart strings.
|
||||
. Added php_build_provider() to retrieve the value of PHP_BUILD_PROVIDER at
|
||||
runtime.
|
||||
. Removed the cache_slot argument of zend_check_user_type_slow() because
|
||||
now it only relies on the CE cache.
|
||||
. Added ZEND_NONSTRING attribute macro for character arrays that do not
|
||||
represent strings. This allows to silence the GCC 15.x
|
||||
`-Wunterminated-string-initialization` warning.
|
||||
. Added the zend_update_exception_properties() function for instantiating
|
||||
Exception child classes. It updates the $message, $code, and $previous
|
||||
properties.
|
||||
. zend_exception_get_default() was removed, use zend_ce_exception directly.
|
||||
. zend_get_error_exception() was removed, use zend_ce_error_exception
|
||||
* The zend_object_iterator_funcs valid member has changed its signature from
|
||||
int(*)(zend_object_iterator *) to zend_result(*)(zend_object_iterator *) to
|
||||
be more in line with what callbacks are returning.
|
||||
|
||||
* The backwards compatibility headers ext/standard/{php_lcg.h,php_mt_rand.h,
|
||||
php_rand.h,php_random.h} have been removed. Include ext/random/php_random.h
|
||||
directly.
|
||||
. ZEND_IS_XDIGIT() macro was removed because it was unused and its name
|
||||
did not match its actual behavior.
|
||||
. The following zend_string-related legacy aliases were removed:
|
||||
* IS_INTERNED() - use ZSTR_IS_INTERNED()
|
||||
* STR_EMPTY_ALLOC() - use ZSTR_EMPTY_ALLOC()
|
||||
* _STR_HEADER_SIZE - use _ZSTR_HEADER_SIZE
|
||||
* STR_ALLOCA_ALLOC() - use ZSTR_ALLOCA_ALLOC()
|
||||
* STR_ALLOCA_INIT() - use ZSTR_ALLOCA_INIT()
|
||||
* STR_ALLOCA_FREE() - use ZSTR_ALLOCA_FREE()
|
||||
. zend_register_constant() now returns a pointer to the added constant
|
||||
on success and NULL on failure instead of SUCCESS/FAILURE.
|
||||
The specialized registration methods that previously had void returns
|
||||
also return pointers to the added constants:
|
||||
* zend_register_bool_constant()
|
||||
* zend_register_null_constant()
|
||||
* zend_register_long_constant()
|
||||
* zend_register_double_constant()
|
||||
* zend_register_string_constant()
|
||||
* zend_register_stringl_constant()
|
||||
. EG(fake_scope) now is a _const_ zend_class_entry*.
|
||||
. zend_begin_record_errors() or EG(record_errors)=true cause errors to be
|
||||
delayed. Before, errors would be recorded but not delayed.
|
||||
. zend_mm_refresh_key_child() must be called on any zend_mm_heap inherited
|
||||
from the parent process after a fork().
|
||||
. HASH_KEY_IS_* constants have been moved in the zend_hash_key_type enum.
|
||||
|
||||
- standard
|
||||
. ext/standard/php_smart_string.h and ext/standard/php_smart_string_public.h
|
||||
were removed. Use the corresponding headers in Zend/ instead.
|
||||
* The zend_*printf family of functions now supports the "%S" modifier to print
|
||||
out zend_string*. This won't cut off the string if it embeds a NUL byte.
|
||||
|
||||
* The inet_aton() and win32/inet.h have been removed. Use platform-agnostic
|
||||
inet_pton() from arpa/inet.h or ws2tcpip.h on Windows.
|
||||
|
||||
* zend_mm_set_custom_debug_handlers() has been removed from ZendMM, use
|
||||
zend_mm_set_custom_handlers() instead which now supports DEBUG builds
|
||||
|
||||
* zend_mm_set_custom_handlers() has changed its signature from
|
||||
void()(zend_mm_heap *heap,
|
||||
void* (*_malloc)(size_t),
|
||||
void (*_free)(void*),
|
||||
void* (*_realloc)(void*, size_t))
|
||||
to
|
||||
void()(zend_mm_heap *heap,
|
||||
void* (*_malloc)(size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC),
|
||||
void (*_free)(void* ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC),
|
||||
void* (*_realloc)(void*, size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC))
|
||||
|
||||
* zend_mm_get_custom_handlers() has changed its signature from
|
||||
void()(zend_mm_heap *heap,
|
||||
void* (**_malloc)(size_t),
|
||||
void (**_free)(void*),
|
||||
void* (**_realloc)(void*, size_t))
|
||||
to
|
||||
void()(zend_mm_heap *heap,
|
||||
void* (**_malloc)(size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC),
|
||||
void (**_free)(void* ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC),
|
||||
void* (**_realloc)(void*, size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC))
|
||||
|
||||
* Added gc and shutdown custom handlers, settable via
|
||||
zend_mm_set_custom_handlers_ex()
|
||||
|
||||
* __zend_malloc() has changed their signature from
|
||||
void(*)(size_t) to
|
||||
void(*)(size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
|
||||
|
||||
* __zend_calloc() has changed their signature from
|
||||
void(*)(size_t, size_t) to
|
||||
void(*)(size_t, size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
|
||||
|
||||
* __zend_realloc() has changed their signature from
|
||||
void(*)(void *, size_t) to
|
||||
void(*)(void *, size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
|
||||
|
||||
* zend_observer_remove_begin_handler() and zend_observer_remove_end_handler()
|
||||
got each a new parameter returning an observer which must be called, if the
|
||||
removal happened during observer execution.
|
||||
|
||||
* zend_get_internal_function_extension_handle[s]() must now be used over
|
||||
zend_get_op_array_extension_handle[s]() when registering run_time_cache slots
|
||||
for internal functions. If you need a cache slot for both internal and user
|
||||
functions, you may obtain a slot for each through the corresponding function.
|
||||
|
||||
* zend_is_true now returns bool rather than int. Note that on PHP 8 this has
|
||||
always returned 0 or 1, so conversion should be trivial.
|
||||
|
||||
* Added zend_hash_get_current_pos_ex() variant of zend_hash_get_current_pos().
|
||||
|
||||
* Renamed rebuild_object_properties() to rebuild_object_properties_internal().
|
||||
This function should not be used outside of zend_std_get_properties_ex() and
|
||||
zend_std_get_properties(). Use zend_std_get_properties_ex() or
|
||||
zend_std_get_properties() instead.
|
||||
|
||||
* zend_object.properties must not be accessed directly. Use
|
||||
zend_std_get_properties_ex() instead.
|
||||
|
||||
* Removed IS_STATIC_VAR_UNINITIALIZED constant. Check for IS_NULL in the
|
||||
static_variables array instead.
|
||||
|
||||
* Removed ZEND_DIM_ALTERNATIVE_SYNTAX constant. This syntax no longer has a
|
||||
specialized error message.
|
||||
|
||||
========================
|
||||
2. Build system changes
|
||||
========================
|
||||
|
||||
- Abstract
|
||||
. Preprocessor macro SIZEOF_PTRDIFF_T has been removed.
|
||||
. Preprocessor macro SIZEOF_INTMAX_T has been removed.
|
||||
a. Abstract
|
||||
- The configure option --with-imap has been removed.
|
||||
- The configure option --with-mhash emits deprecation warning.
|
||||
- The configure option --with-pdo-oci has been removed.
|
||||
- The configure option --with-pspell has been removed.
|
||||
- Symbol SIZEOF_SHORT removed (size of 2 on 32-bit and 64-bit platforms).
|
||||
- Symbol DBA_CDB_MAKE removed in ext/dba.
|
||||
- Symbol HAVE_LIBM has been removed.
|
||||
- Symbol HAVE_INET_ATON has been removed.
|
||||
- Symbol HAVE_SIGSETJMP has been removed.
|
||||
- The Zend/zend_istdiostream.h header has been removed.
|
||||
|
||||
- Windows build system changes
|
||||
. SAPI() and ADD_SOURCES() now support the optional `duplicate_sources`
|
||||
parameter. If truthy, no rules to build the object files are generated.
|
||||
This allows to build additional variants of SAPIs (e.g. a DLL and EXE)
|
||||
without duplicate build rules. It is up to the SAPI maintainers to ensure
|
||||
that appropriate build rules are created.
|
||||
b. Unix build system changes
|
||||
- The configure option --with-imap-ssl has been removed.
|
||||
- The configure option --with-oci8 has been removed.
|
||||
- The configure option --with-zlib-dir has been removed.
|
||||
- The configure option --with-kerberos has been removed.
|
||||
- The configure option --with-openssl-dir has been removed. SSL support in
|
||||
ext/ftp and ext/mysqlnd is enabled implicitly, when building with
|
||||
ext/openssl (--with-openssl), or explicitly by using new configure options
|
||||
--with-ftp-ssl and --with-mysqlnd-ssl.
|
||||
- New configure option --with-openssl-legacy-provider to enable OpenSSL
|
||||
legacy provider.
|
||||
- New configure option --with-openssl-argon2 to enable PASSWORD_ARGON2
|
||||
from OpenSSL 3.2
|
||||
- COOKIE_IO_FUNCTIONS_T symbol has been removed (use cookie_io_functions_t).
|
||||
- HAVE_SOCKADDR_UN_SUN_LEN symbol renamed to HAVE_STRUCT_SOCKADDR_UN_SUN_LEN.
|
||||
- HAVE_UTSNAME_DOMAINNAME symbol renamed to HAVE_STRUCT_UTSNAME_DOMAINNAME.
|
||||
- PHP_CHECK_IN_ADDR_T Autoconf macro and 'in_addr_t' fallback definition to
|
||||
'u_int' removed (use AC_CHECK_TYPES Autoconf macro instead).
|
||||
- HAVE_ODBC2 symbol has been removed in ext/odbc.
|
||||
- Removed linking with obsolete dnet_stub library in ext/pdo_dblib.
|
||||
- Removed checking and linking with obsolete libbind for some functions.
|
||||
- Symbol HAVE_JSON has been removed (ext/json is always available since PHP
|
||||
8.0).
|
||||
- Symbol DARWIN has been removed (use __APPLE__ to target Darwin systems).
|
||||
- Symbol MISSING_FCLOSE_DECL and Autoconf macro PHP_MISSING_FCLOSE_DECL were
|
||||
removed.
|
||||
- Symbol HAVE_BSD_ICONV has been removed.
|
||||
- Symbol ZEND_FIBER_ASM has been removed.
|
||||
- Symbols HAVE_DLOPEN and HAVE_DLSYM have been removed.
|
||||
- Symbol HAVE_MYSQL has been removed.
|
||||
- Symbol HAVE_PDO_SQLITELIB has been removed.
|
||||
- Symbol HAVE_WAITPID has been removed.
|
||||
- Symbol HAVE_LIBPQ has been removed.
|
||||
- Symbols HAVE_LIBRT and HAVE_TIMER_CREATE removed.
|
||||
- Symbols PHP_FPM_SYSTEMD, PHP_FPM_USER, and PHP_FPM_GROUP removed.
|
||||
- Symbol PTHREADS has been removed.
|
||||
- Symbol HAVE_STRPTIME_DECL_FAILS has been removed (use HAVE_DECL_STRPTIME).
|
||||
- Symbol HAVE_PHPDBG has been removed.
|
||||
- Symbols PHP_HAVE_AVX512_SUPPORTS and PHP_HAVE_AVX512_VBMI_SUPPORTS are now
|
||||
either defined to 1 or undefined.
|
||||
- Symbol HAVE_LIBCRYPT has been removed.
|
||||
- Autoconf macro PHP_DEFINE (atomic includes) removed (use AC_DEFINE and
|
||||
config.h).
|
||||
- Autoconf macro PHP_WITH_SHARED has been removed (use PHP_ARG_WITH).
|
||||
- Autoconf macro PHP_STRUCT_FLOCK has been removed (use AC_CHECK_TYPES).
|
||||
- Autoconf macro PHP_SOCKADDR_CHECKS has been removed (use AC_CHECK_TYPES and
|
||||
AC_CHECK_MEMBERS).
|
||||
- Autoconf macro PHP_CHECK_GCC_ARG has been removed since PHP 8.0 (use
|
||||
AX_CHECK_COMPILE_FLAG).
|
||||
- Autoconf macro PHP_PROG_RE2C got a new 2nd argument to define common
|
||||
default re2c command-line options substituted to the Makefile RE2C_FLAGS
|
||||
variable.
|
||||
- Autoconf macros PHP_CHECK_BUILTIN_* have been removed in favor of
|
||||
PHP_CHECK_BUILTIN and all PHP_HAVE_BUILTIN_* symbols changed to be either
|
||||
undefined or defined to 1 whether compiler supports the builtin.
|
||||
- Added php-config --lib-dir and --lib-embed options for PHP embed SAPI.
|
||||
- PDO extensions in php-src don't have the include flag -I$pdo_cv_inc_path
|
||||
directory anymore.
|
||||
- Autoconf macro PHP_SETUP_OPENSSL doesn't accept the 3rd argument anymore.
|
||||
- Autoconf macro PHP_EVAL_LIBLINE got a new 3rd argument to override the
|
||||
ext_shared checks.
|
||||
- Autoconf macro PHP_SETUP_LIBXML doesn't define the redundant HAVE_LIBXML
|
||||
symbol anymore and requires at least libxml2 2.9.4.
|
||||
- Autoconf macro PHP_SETUP_ICONV doesn't define the HAVE_ICONV symbol
|
||||
anymore.
|
||||
- Autoconf macro PHP_AP_EXTRACT_VERSION is obsolete (use the
|
||||
'apxs -q HTTPD_VERSION').
|
||||
- Autoconf macro PHP_OUTPUT is obsolete (use AC_CONFIG_FILES).
|
||||
- Autoconf macro PHP_TEST_BUILD is obsolete (use AC_* macros).
|
||||
- Autoconf macro PHP_BUILD_THREAD_SAFE is obsolete (set enable_zts manually).
|
||||
- Autoconf macro PHP_DEF_HAVE is obsolete (use AC_DEFINE).
|
||||
- Autoconf macro PHP_PROG_SETUP now accepts an argument to set the minimum
|
||||
required PHP version during the build.
|
||||
- Autoconf macro PHP_INSTALL_HEADERS arguments can now be also
|
||||
blank-or-newline-separated lists instead of only separated with whitespace
|
||||
or backslash-then-newline.
|
||||
- Autoconf macro PHP_ADD_BUILD_DIR now also accepts 1st argument as a
|
||||
blank-or-newline-separated separated list.
|
||||
- Autoconf macros PHP_NEW_EXTENSION, PHP_ADD_SOURCES, PHP_ADD_SOURCES_X,
|
||||
PHP_SELECT_SAPI now have the source files and flags arguments normalized so
|
||||
the list of items can be passed as a blank-or-newline-separated list.
|
||||
- Autoconf macro PHP_ADD_INCLUDE now takes also a blank-or-newline-separated
|
||||
list of include directories instead of a single directory. The "prepend"
|
||||
argument is validated at Autoconf compile time.
|
||||
- TSRM/tsrm.m4 file and its TSRM_CHECK_PTHREADS macro have been removed.
|
||||
- Added pkg-config support to find libpq for the pdo_pgsql and pgsql
|
||||
extensions. The libpq paths can be customized with the PGSQL_CFLAGS and
|
||||
PGSQL_LIBS environment variables. When a directory argument is provided to
|
||||
configure options (--with-pgsql=DIR or --with-pdo-pgsql=DIR), it will be
|
||||
used instead of the pkg-config search.
|
||||
- Added pkg-config support to find unixODBC and iODBC for the pdo_odbc
|
||||
extension.
|
||||
- Added pkg-config support to find GNU MP library. As a fallback default
|
||||
system paths are searched. When a directory argument is provided
|
||||
(--with-gmp=DIR), it will be used instead of the pkg-config.
|
||||
- Added optional pkg-config support to find NET-SNMP library. As a fallback
|
||||
net-snmp-config utility is used like before.
|
||||
- Removed BC enable_pear variable check due to --enable-pear configure option
|
||||
once used (use with_pear variable name).
|
||||
- Cache variables synced to php_cv_* naming scheme. If you use them for
|
||||
advanced cross-compilation, these were renamed:
|
||||
- ac_cv_copy_file_range -> php_cv_func_copy_file_range
|
||||
- ac_cv_flush_io -> php_cv_have_flush_io
|
||||
- ac_cv_func_getaddrinfo -> php_cv_func_getaddrinfo
|
||||
- ac_cv_have_broken_gcc_strlen_opt -> php_cv_have_broken_gcc_strlen_opt
|
||||
- ac_cv_have_pcre2_jit -> php_cv_have_pcre2_jit
|
||||
- ac_cv_pread -> php_cv_func_pread
|
||||
- ac_cv_pwrite -> php_cv_func_pwrite
|
||||
- ac_cv_syscall_shadow_stack_exists -> php_cv_have_shadow_stack_syscall
|
||||
- ac_cv_time_r_type -> php_cv_time_r_type
|
||||
- ac_cv_write_stdout -> php_cv_have_write_stdout
|
||||
and all other checks wrapped with their belonging cache variables (see *.m4
|
||||
source files for details).
|
||||
|
||||
- Unix build system changes
|
||||
. libdir is properly set when --libdir (ex: /usr/lib64) and --with-libdir (ex: lib64)
|
||||
configure options are used to ${libdir}/php (ex: /usr/lib64/php)
|
||||
. PHP_ODBC_CFLAGS, PHP_ODBC_LFLAGS, PHP_ODBC_LIBS, PHP_ODBC_TYPE preprocessor
|
||||
macros defined by ext/odbc are now defined in php_config.h instead of the
|
||||
build-defs.h header.
|
||||
. Autoconf macro AX_CHECK_COMPILE_FLAG updated to serial 11.
|
||||
. Autoconf macro PHP_AP_EXTRACT_VERSION has been removed.
|
||||
. Autoconf macro PHP_BUILD_THREAD_SAFE has been removed (set enable_zts
|
||||
manually).
|
||||
. Autoconf macro PHP_CHECK_SIZEOF is obsolete (use AC_CHECK_SIZEOF).
|
||||
. Autoconf macro PHP_DEF_HAVE has been removed (use AC_DEFINE).
|
||||
. Autoconf macro PHP_OUTPUT has been removed (use AC_CONFIG_FILES).
|
||||
. Autoconf macro PHP_TEST_BUILD has been removed (use AC_* macros).
|
||||
. Preprocessor macro HAVE_PTRDIFF_T has been removed.
|
||||
. Preprocessor macro HAVE_INTMAX_T has been removed.
|
||||
. Preprocessor macro HAVE_SSIZE_T has been removed.
|
||||
. Preprocessor macro SIZEOF_SSIZE_T has been removed.
|
||||
c. Windows build system changes
|
||||
- The configure options --with-oci8-11g, --with-oci8-12c, --with-oci8-19,
|
||||
--enable-apache2-2handler have been removed.
|
||||
- The configure option --enable-apache2-4handler is now an alias for the
|
||||
preferred --enable-apache2handler.
|
||||
- Added Bison flag '-Wall' when generating lexer files as done in *nix build
|
||||
system.
|
||||
- HAVE_WIN32_NATIVE_THREAD, USE_WIN32_NATIVE_THREAD, ENABLE_THREADS symbols
|
||||
in ext/mbstring/libmbfl removed.
|
||||
- FIBER_ASSEMBLER and FIBER_ASM_ARCH Makefile variables removed in favor of
|
||||
PHP_ASSEMBLER and FIBER_ASM_ABI.
|
||||
- HAVE_PHP_SOAP symbol renamed to HAVE_SOAP.
|
||||
- Unused symbols CONFIGURATION_FILE_PATH, DISCARD_PATH, HAVE_ERRMSG_H,
|
||||
HAVE_REGCOMP, HAVE_RINT, NEED_ISBLANK, PHP_URL_FOPEN, REGEX, HSREGEX,
|
||||
USE_CONFIG_FILE have been removed.
|
||||
- The HAVE_OPENSSL symbol has been removed.
|
||||
- The HAVE_OPENSSL_EXT symbol is now consistently defined to value 1 whether
|
||||
the openssl extension is available either as shared or built statically.
|
||||
- Added configure option --enable-phpdbg-debug to build phpdbg in debug mode.
|
||||
- The win32/build/libs_version.txt file has been removed.
|
||||
- MSVC builds now use the new preprocessor (/Zc:preprocessor).
|
||||
- The CHECK_HEADER_ADD_INCLUDE function now consistently defines preprocessor
|
||||
macros HAVE_<header>_H either to value 1 or leaves them undefined to match
|
||||
the Autotools headers checks.
|
||||
|
||||
========================
|
||||
3. Module changes
|
||||
========================
|
||||
|
||||
- ext/gd
|
||||
. The gdImageScale*() and gdImageRotate*() helpers are now internal in the
|
||||
bundled libgd, like they have been in external libgd as of gd-2.1.1.
|
||||
a. ext/dom
|
||||
- dom_read_t and dom_write_t now expect the function to return zend_result
|
||||
instead of int.
|
||||
- The macros DOM_NO_ARGS() and DOM_NOT_IMPLEMENTED() have been removed.
|
||||
- New public APIs are available to handle callbacks from XPath, see
|
||||
xpath_callbacks.h.
|
||||
- Added public APIs to manipulate namespace data, see namespace_compat.h.
|
||||
- php_dom_create_object() now no longer accepts a NULL obj argument.
|
||||
- Removed the `ret` argument from the DOM_RET_OBJ macro, use the return
|
||||
value instead.
|
||||
- Removed DOM_XMLNS_NAMESPACE from xml_common.h. Use DOM_XMLNS_NS_URI
|
||||
from namespace_compat.h instead.
|
||||
- Added php_dom_get_ns_mapper(), php_dom_next_in_tree_order(),
|
||||
php_dom_follow_spec_doc_ref(), and php_dom_follow_spec_doc_ref().
|
||||
|
||||
- ext/json
|
||||
. php_json_encode_serializable_object() now assumes `EG(active)`,
|
||||
if not a bailout is caused. Therefore a minor BC break exists if the
|
||||
`PHP_JSON_PARTIAL_OUTPUT_ON_ERROR` option is in use.
|
||||
However, this situation is highly unlikely.
|
||||
b. ext/random
|
||||
- The macro RAND_RANGE_BADSCALING() has been removed. The implementation
|
||||
should either be inlined and undefined behavior fixed or it should be
|
||||
replaced by a non-biased scaler.
|
||||
- The php_srand() and php_rand() functions have been removed. These were
|
||||
slim wrappers around the corresponding php_mt_srand() and php_mt_rand()
|
||||
function since PHP 7.1, but using zend_long instead of uint32_t as their
|
||||
input/output types. This made their behavior incompatible between 32-bit
|
||||
and 64-bit builds of PHP. Users of these functions are encouraged to
|
||||
migrate to one of the more modern engines provided since PHP 8.2. If that
|
||||
is not possible, due to backwards compatibility requirements, then the
|
||||
php_mt_srand() and php_mt_rand() functions should be called directly and
|
||||
the values appropriately casted.
|
||||
- The PHP_RAND_MAX and RAND_MAX constants corresponding to the removed
|
||||
php_rand() have also been removed.
|
||||
- The generate member of a php_random_algo is now expected to return
|
||||
the new php_random_result struct, replacing the last_generated_size
|
||||
member of the php_random_status struct and the generate_size member of
|
||||
the php_random_algo struct.
|
||||
- The php_random_status struct has been removed, since the previous change
|
||||
reduced it to a single void* member containing the actual state, resulting
|
||||
in needless indirection. Functions taking a php_random_algo struct pointer
|
||||
and a php_random_status struct pointer as separate parameters now take a
|
||||
single php_random_algo_with_state struct by value, making it easier to
|
||||
pass around the state with its associated algorithm and thus reducing
|
||||
the chance for mistakes.
|
||||
- The seed member of a php_random_algo has been removed. As a replacement
|
||||
engine-specific seeding functions are now exposed. This change allows
|
||||
users to better take engine-specific behavior into account. As an example
|
||||
Mt19937 ignored the upper half of the seed parameter of the generic
|
||||
seeding function.
|
||||
- The CSPRNG API (php_random_(bytes|int)_*) is now provided by the new
|
||||
and much smaller php_random_csprng.h header. The new header is included
|
||||
in php_random.h for compatibility with existing users.
|
||||
- A new php_random_generate_fallback_seed() function has been added as a
|
||||
replacement for the generically named GENERATE_SEED(). The internal
|
||||
implementation has been improved to generate better seeds, however any
|
||||
users should use the opportunity to verify that seeding is first
|
||||
attempted using the CSPRNG for better output size flexibility.
|
||||
- The standalone combined_lcg engine has been removed, as the lcg_value()
|
||||
userland function is deprecated and as the engine is unable to return
|
||||
unbiased integer values. The internal php_combined_lcg() function remains
|
||||
available for now.
|
||||
|
||||
- ext/libxml
|
||||
. The refcount APIs now return an `unsigned int` instead of an `int`.
|
||||
. Removed php_libxml_xmlCheckUTF8(). Use xmlCheckUTF8() from libxml instead.
|
||||
c. ext/xsl
|
||||
- The function php_xsl_create_object() was removed as it was not used
|
||||
nor exported.
|
||||
|
||||
- ext/pdo
|
||||
. Added `php_pdo_stmt_valid_db_obj_handle()` to check if the database object
|
||||
is still valid. This is useful when a GC cycle is collected and the
|
||||
database object can be destroyed prior to destroying the statement.
|
||||
d. ext/libxml
|
||||
- Added php_libxml_pretend_ctx_error_ex() to emit errors as if they had come
|
||||
from libxml.
|
||||
- Added php_libxml_error_handler_va() to pass libxml errors, and
|
||||
corresponding php_libxml_error_level enum.
|
||||
- Removed the "properties" HashTable field from php_libxml_node_object.
|
||||
- Added a way to attached private data to a php_libxml_ref_obj.
|
||||
- Added a way to fix a class type onto php_libxml_ref_obj.
|
||||
- Added a way to record quirks mode in php_libxml_ref_obj.
|
||||
- Added php_libxml_uses_internal_errors().
|
||||
- Added a way to override document handlers (e.g. serialization) with
|
||||
php_libxml_document_handlers.
|
||||
- Changed the refcount fields from int to unsigned int.
|
||||
|
||||
- ext/standard
|
||||
. Added php_url_decode_ex() and php_raw_url_decode_ex() that unlike their
|
||||
non-ex counterparts do not work in-place.
|
||||
. The php_std_date() function has been removed. Use php_format_date() with
|
||||
the "D, d M Y H:i:s \\G\\M\\T" format instead.
|
||||
. Added php_url_encode_to_smart_str() to encode a URL to a smart_str buffer.
|
||||
. The functionality of getimagesize(), image_type_to_mime_type(),
|
||||
and image_type_to_extension() is now extensible using the internal APIs
|
||||
php_image_register_handler() and php_image_unregister_handler() in
|
||||
php_image.h.
|
||||
e. ext/date
|
||||
- Added the php_format_date_ex() API to format instances of php_date_obj.
|
||||
- Added the php_date_initialize_from_ts_long() and
|
||||
php_date_initialize_from_ts_double() to initialize a php_date_obj with
|
||||
the given unix timestamp using GMT +00:00.
|
||||
|
||||
f. ext/pcre
|
||||
- php_pcre_match_impl() now no longer has a use_flags argument.
|
||||
When flags should be ignored, pass 0 to the flags argument.
|
||||
- php_pcre_match_impl() and pcre_get_compiled_regex_cache_ex() now use
|
||||
proper boolean argument types instead of integer types.
|
||||
- pcre_get_compiled_regex_cache_ex() now provides an option to collect extra
|
||||
options (from modifiers used in the expression, for example), and calls
|
||||
pcre2_set_compile_extra_options() with those options.
|
||||
- Removed per-request cache, the cache is now always per process or
|
||||
per thread depending on whether you use NTS or ZTS.
|
||||
This was removed due to fundamental ordering issues between destructors.
|
||||
|
||||
g. ext/standard
|
||||
- Added the php_base64_encode_ex() API with flag parameters, value can be
|
||||
PHP_BASE64_NO_PADDING to encode without the padding character '='.
|
||||
- The php_escape_shell_cmd() now takes a zend_string* instead of a char*
|
||||
Moreover, providing it with a binary safe string is the responsibility of
|
||||
the caller now.
|
||||
- The php_escape_shell_arg() now takes a zend_string* instead of a char*
|
||||
Moreover, providing it with a binary safe string is the responsibility of
|
||||
the caller now.
|
||||
- The php_info_html_esc() function has been removed, use
|
||||
php_escape_html_entities() with ENT_QUOTES directly instead.
|
||||
- The deprecated php_uint32 and php_int32 typedefs have been removed from
|
||||
ext/standard/basic_functions.h. Use the standard uint32_t and int32_t
|
||||
types instead.
|
||||
- The php_mkdir() and php_mkdir_ex() APIs have been removed, use
|
||||
php_stream_mkdir() instead.
|
||||
- The php_strtoupper(), php_string_toupper(), php_strtolower(), and
|
||||
php_string_tolower() functions has been removed, use zend_str_toupper(),
|
||||
zend_string_toupper(), zend_str_tolower(), and zend_string_tolower()
|
||||
respectively instead.
|
||||
- The php_replace_controlchars_ex() function is no longer exposed.
|
||||
|
||||
h. ext/session
|
||||
- Added the php_get_session_status() API to get the session status, which is
|
||||
equivalent to reading PS(session_status) but works with shared objects too.
|
||||
- Added the php_get_session_var_str() API to set a session variable without
|
||||
needing to create a zend_string.
|
||||
- The ext/session/php_session.h doesn't transitively include the
|
||||
ext/hash/php_hash.h header anymore.
|
||||
- It is no longer allowed to return out of the PS_ENCODE_LOOP macro.
|
||||
Instead, you should break out of the loop instead.
|
||||
|
||||
i. ext/xml
|
||||
- Made the expat compatibility wrapper XML_GetCurrentByteIndex return a long
|
||||
instead of an int. This corresponds to the XML_Index type when
|
||||
XML_LARGE_SIZE is not used in expat.
|
||||
|
||||
========================
|
||||
4. OpCode changes
|
||||
========================
|
||||
|
||||
* New ZEND_DECLARE_ATTRIBUTED_CONST is used when a global constant is declared
|
||||
with `const` and has attributes; this opcode is used *instead* of the
|
||||
ZEND_DECLARE_CONST, and in addition to the name of the constant and the
|
||||
value to use, has a ZEND_OP_DATA with a pointer to the compiled attributes.
|
||||
* DO_ICALL, DO_FCALL, and DO_FCALL_BY_NAME now call zend_interrupt_function
|
||||
while the internal frame is still on the stack. This means interrupt handlers
|
||||
will now see the internal call. If your interrupt handler does something like
|
||||
switching EG(current_execute_data), it should not do so if an internal func
|
||||
is on top.
|
||||
* New FRAMELESS_ICALL_[0,3] opcodes for faster internal function calls have been
|
||||
added. These opcodes don't create a stack frame, but pass arguments via opcode
|
||||
operands. They only work for functions that are known at compile-time, and
|
||||
that provide a frameless handler (search for usages of the
|
||||
ZEND_FRAMELESS_FUNCTION macro).
|
||||
|
||||
* CREATE_GENERATOR now initializes the generator with opline pointing to the
|
||||
CREATE_GENERATOR op (before, opline was set to the next op).
|
||||
|
||||
* YIELD and YIELD_FROM do not increment the opline anymore.
|
||||
|
||||
* The EXIT opcode has been removed as exit is now implemented as a function.
|
||||
|
||||
========================
|
||||
5. SAPI changes
|
||||
========================
|
||||
|
||||
- SAPIs must now call php_child_init() after a fork. If php-src code was
|
||||
executed in other threads than the one initiating the fork,
|
||||
refresh_memory_manager() must be called in every such thread.
|
||||
|
|
|
@ -274,9 +274,7 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
|
|||
* If it's not local, then the other blocks successors must also eventually either FREE or consume the temporary,
|
||||
* hence removing the temporary is not safe in the general case, especially when other consumers are not FREE.
|
||||
* A FREE may not be removed without also removing the source's result, because otherwise that would cause a memory leak. */
|
||||
if (opline->extended_value == ZEND_FREE_VOID_CAST) {
|
||||
/* Keep the ZEND_FREE opcode alive. */
|
||||
} else if (opline->op1_type == IS_TMP_VAR) {
|
||||
if (opline->op1_type == IS_TMP_VAR) {
|
||||
src = VAR_SOURCE(opline->op1);
|
||||
if (src) {
|
||||
switch (src->opcode) {
|
||||
|
@ -420,14 +418,6 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
|
|||
}
|
||||
break;
|
||||
|
||||
case ZEND_EXT_STMT:
|
||||
if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) {
|
||||
/* Variable will be deleted later by FREE, so we can't optimize it */
|
||||
Tsource[VAR_NUM(opline->op1.var)] = NULL;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case ZEND_CASE:
|
||||
case ZEND_CASE_STRICT:
|
||||
case ZEND_COPY_TMP:
|
||||
|
@ -478,66 +468,6 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array
|
|||
goto optimize_bool;
|
||||
}
|
||||
break;
|
||||
case ZEND_IS_IDENTICAL:
|
||||
if (opline->op1_type == IS_CONST &&
|
||||
opline->op2_type == IS_CONST) {
|
||||
goto optimize_constant_binary_op;
|
||||
}
|
||||
|
||||
if (opline->op1_type == IS_CONST &&
|
||||
(Z_TYPE(ZEND_OP1_LITERAL(opline)) <= IS_TRUE && Z_TYPE(ZEND_OP1_LITERAL(opline)) >= IS_NULL)) {
|
||||
/* IS_IDENTICAL(TRUE, T) => TYPE_CHECK(T, TRUE)
|
||||
* IS_IDENTICAL(FALSE, T) => TYPE_CHECK(T, FALSE)
|
||||
* IS_IDENTICAL(NULL, T) => TYPE_CHECK(T, NULL)
|
||||
*/
|
||||
opline->opcode = ZEND_TYPE_CHECK;
|
||||
opline->extended_value = (1 << Z_TYPE(ZEND_OP1_LITERAL(opline)));
|
||||
COPY_NODE(opline->op1, opline->op2);
|
||||
SET_UNUSED(opline->op2);
|
||||
++(*opt_count);
|
||||
goto optimize_type_check;
|
||||
} else if (opline->op2_type == IS_CONST &&
|
||||
(Z_TYPE(ZEND_OP2_LITERAL(opline)) <= IS_TRUE && Z_TYPE(ZEND_OP2_LITERAL(opline)) >= IS_NULL)) {
|
||||
/* IS_IDENTICAL(T, TRUE) => TYPE_CHECK(T, TRUE)
|
||||
* IS_IDENTICAL(T, FALSE) => TYPE_CHECK(T, FALSE)
|
||||
* IS_IDENTICAL(T, NULL) => TYPE_CHECK(T, NULL)
|
||||
*/
|
||||
opline->opcode = ZEND_TYPE_CHECK;
|
||||
opline->extended_value = (1 << Z_TYPE(ZEND_OP2_LITERAL(opline)));
|
||||
SET_UNUSED(opline->op2);
|
||||
++(*opt_count);
|
||||
goto optimize_type_check;
|
||||
}
|
||||
break;
|
||||
case ZEND_TYPE_CHECK:
|
||||
optimize_type_check:
|
||||
if (opline->extended_value == (1 << IS_TRUE) || opline->extended_value == (1 << IS_FALSE)) {
|
||||
if (opline->op1_type == IS_TMP_VAR &&
|
||||
!zend_bitset_in(used_ext, VAR_NUM(opline->op1.var))) {
|
||||
src = VAR_SOURCE(opline->op1);
|
||||
|
||||
if (src) {
|
||||
switch (src->opcode) {
|
||||
case ZEND_BOOL:
|
||||
case ZEND_BOOL_NOT:
|
||||
/* T = BOOL(X) + TYPE_CHECK(T, TRUE) -> BOOL(X), NOP
|
||||
* T = BOOL(X) + TYPE_CHECK(T, FALSE) -> BOOL_NOT(X), NOP
|
||||
* T = BOOL_NOT(X) + TYPE_CHECK(T, TRUE) -> BOOL_NOT(X), NOP
|
||||
* T = BOOL_NOT(X) + TYPE_CHECK(T, FALSE) -> BOOL(X), NOP
|
||||
*/
|
||||
src->opcode =
|
||||
((src->opcode == ZEND_BOOL) == (opline->extended_value == (1 << IS_TRUE))) ?
|
||||
ZEND_BOOL : ZEND_BOOL_NOT;
|
||||
COPY_NODE(src->result, opline->result);
|
||||
SET_VAR_SOURCE(src);
|
||||
MAKE_NOP(opline);
|
||||
++(*opt_count);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ZEND_BOOL:
|
||||
case ZEND_BOOL_NOT:
|
||||
|
@ -871,6 +801,7 @@ optimize_type_check:
|
|||
case ZEND_SR:
|
||||
case ZEND_IS_SMALLER:
|
||||
case ZEND_IS_SMALLER_OR_EQUAL:
|
||||
case ZEND_IS_IDENTICAL:
|
||||
case ZEND_IS_NOT_IDENTICAL:
|
||||
case ZEND_BOOL_XOR:
|
||||
case ZEND_BW_OR:
|
||||
|
|
|
@ -43,6 +43,50 @@ typedef struct _literal_info {
|
|||
info[n].num_related = (related); \
|
||||
} while (0)
|
||||
|
||||
static size_t type_num_classes(const zend_op_array *op_array, uint32_t arg_num)
|
||||
{
|
||||
zend_arg_info *arg_info;
|
||||
if (arg_num > 0) {
|
||||
if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
|
||||
return 0;
|
||||
}
|
||||
if (EXPECTED(arg_num <= op_array->num_args)) {
|
||||
arg_info = &op_array->arg_info[arg_num-1];
|
||||
} else if (UNEXPECTED(op_array->fn_flags & ZEND_ACC_VARIADIC)) {
|
||||
arg_info = &op_array->arg_info[op_array->num_args];
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
arg_info = op_array->arg_info - 1;
|
||||
}
|
||||
|
||||
if (ZEND_TYPE_IS_COMPLEX(arg_info->type)) {
|
||||
if (ZEND_TYPE_HAS_LIST(arg_info->type)) {
|
||||
/* Intersection types cannot have nested list types */
|
||||
if (ZEND_TYPE_IS_INTERSECTION(arg_info->type)) {
|
||||
return ZEND_TYPE_LIST(arg_info->type)->num_types;
|
||||
}
|
||||
ZEND_ASSERT(ZEND_TYPE_IS_UNION(arg_info->type));
|
||||
size_t count = 0;
|
||||
zend_type *list_type;
|
||||
|
||||
ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(arg_info->type), list_type) {
|
||||
if (ZEND_TYPE_IS_INTERSECTION(*list_type)) {
|
||||
count += ZEND_TYPE_LIST(*list_type)->num_types;
|
||||
} else {
|
||||
ZEND_ASSERT(!ZEND_TYPE_HAS_LIST(*list_type));
|
||||
count += 1;
|
||||
}
|
||||
} ZEND_TYPE_LIST_FOREACH_END();
|
||||
return count;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static uint32_t add_static_slot(HashTable *hash,
|
||||
zend_op_array *op_array,
|
||||
uint32_t op1,
|
||||
|
@ -121,7 +165,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
|
|||
HashTable hash;
|
||||
zend_string *key = NULL;
|
||||
void *checkpoint = zend_arena_checkpoint(ctx->arena);
|
||||
int *const_slot, *class_slot, *func_slot, *bind_var_slot, *property_slot, *method_slot, *jmp_slot;
|
||||
int *const_slot, *class_slot, *func_slot, *bind_var_slot, *property_slot, *method_slot;
|
||||
|
||||
if (op_array->last_literal) {
|
||||
info = (literal_info*)zend_arena_calloc(&ctx->arena, op_array->last_literal, sizeof(literal_info));
|
||||
|
@ -131,9 +175,6 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
|
|||
end = opline + op_array->last;
|
||||
while (opline < end) {
|
||||
switch (opline->opcode) {
|
||||
case ZEND_JMP_FRAMELESS:
|
||||
LITERAL_INFO(opline->op1.constant, 1);
|
||||
break;
|
||||
case ZEND_INIT_FCALL_BY_NAME:
|
||||
LITERAL_INFO(opline->op2.constant, 2);
|
||||
break;
|
||||
|
@ -439,14 +480,13 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
|
|||
zend_hash_clean(&hash);
|
||||
op_array->last_literal = j;
|
||||
|
||||
const_slot = zend_arena_alloc(&ctx->arena, j * 7 * sizeof(int));
|
||||
memset(const_slot, -1, j * 7 * sizeof(int));
|
||||
const_slot = zend_arena_alloc(&ctx->arena, j * 6 * sizeof(int));
|
||||
memset(const_slot, -1, j * 6 * sizeof(int));
|
||||
class_slot = const_slot + j;
|
||||
func_slot = class_slot + j;
|
||||
bind_var_slot = func_slot + j;
|
||||
property_slot = bind_var_slot + j;
|
||||
method_slot = property_slot + j;
|
||||
jmp_slot = method_slot + j;
|
||||
|
||||
/* Update opcodes to use new literals table */
|
||||
cache_size = zend_op_array_extension_handles * sizeof(void*);
|
||||
|
@ -460,6 +500,26 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
|
|||
opline->op2.constant = map[opline->op2.constant];
|
||||
}
|
||||
switch (opline->opcode) {
|
||||
case ZEND_RECV_INIT:
|
||||
case ZEND_RECV:
|
||||
case ZEND_RECV_VARIADIC:
|
||||
{
|
||||
size_t num_classes = type_num_classes(op_array, opline->op1.num);
|
||||
if (num_classes) {
|
||||
opline->extended_value = cache_size;
|
||||
cache_size += num_classes * sizeof(void *);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ZEND_VERIFY_RETURN_TYPE:
|
||||
{
|
||||
size_t num_classes = type_num_classes(op_array, 0);
|
||||
if (num_classes) {
|
||||
opline->op2.num = cache_size;
|
||||
cache_size += num_classes * sizeof(void *);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ZEND_ASSIGN_STATIC_PROP_OP:
|
||||
if (opline->op1_type == IS_CONST) {
|
||||
// op1 static property
|
||||
|
@ -713,18 +773,9 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
|
|||
break;
|
||||
case ZEND_DECLARE_ANON_CLASS:
|
||||
case ZEND_DECLARE_CLASS_DELAYED:
|
||||
opline->extended_value = cache_size;
|
||||
cache_size += sizeof(void *);
|
||||
break;
|
||||
case ZEND_JMP_FRAMELESS:
|
||||
// op1 func
|
||||
if (jmp_slot[opline->op1.constant] >= 0) {
|
||||
opline->extended_value = jmp_slot[opline->op1.constant];
|
||||
} else {
|
||||
opline->extended_value = cache_size;
|
||||
cache_size += sizeof(void *);
|
||||
jmp_slot[opline->op1.constant] = opline->extended_value;
|
||||
}
|
||||
break;
|
||||
case ZEND_SEND_VAL:
|
||||
case ZEND_SEND_VAL_EX:
|
||||
|
|
|
@ -80,6 +80,7 @@ static inline bool may_have_side_effects(
|
|||
case ZEND_IS_IDENTICAL:
|
||||
case ZEND_IS_NOT_IDENTICAL:
|
||||
case ZEND_QM_ASSIGN:
|
||||
case ZEND_FREE:
|
||||
case ZEND_FE_FREE:
|
||||
case ZEND_TYPE_CHECK:
|
||||
case ZEND_DEFINED:
|
||||
|
@ -126,8 +127,6 @@ static inline bool may_have_side_effects(
|
|||
case ZEND_ARRAY_KEY_EXISTS:
|
||||
/* No side effects */
|
||||
return 0;
|
||||
case ZEND_FREE:
|
||||
return opline->extended_value == ZEND_FREE_VOID_CAST;
|
||||
case ZEND_ADD_ARRAY_ELEMENT:
|
||||
/* TODO: We can't free two vars. Keep instruction alive. <?php [0, "$a" => "$b"]; */
|
||||
if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) && (opline->op2_type & (IS_VAR|IS_TMP_VAR))) {
|
||||
|
|
|
@ -254,7 +254,7 @@ static void zend_ssa_remove_nops(zend_op_array *op_array, zend_ssa *ssa, zend_op
|
|||
free_alloca(shiftlist, use_heap);
|
||||
}
|
||||
|
||||
static bool safe_instanceof(const zend_class_entry *ce1, const zend_class_entry *ce2) {
|
||||
static bool safe_instanceof(zend_class_entry *ce1, zend_class_entry *ce2) {
|
||||
if (ce1 == ce2) {
|
||||
return 1;
|
||||
}
|
||||
|
@ -267,9 +267,9 @@ static bool safe_instanceof(const zend_class_entry *ce1, const zend_class_entry
|
|||
|
||||
static inline bool can_elide_list_type(
|
||||
const zend_script *script, const zend_op_array *op_array,
|
||||
const zend_ssa_var_info *use_info, const zend_type type)
|
||||
const zend_ssa_var_info *use_info, zend_type type)
|
||||
{
|
||||
const zend_type *single_type;
|
||||
zend_type *single_type;
|
||||
/* For intersection: result==false is failure, default is success.
|
||||
* For union: result==true is success, default is failure. */
|
||||
bool is_intersection = ZEND_TYPE_IS_INTERSECTION(type);
|
||||
|
@ -280,7 +280,7 @@ static inline bool can_elide_list_type(
|
|||
}
|
||||
if (ZEND_TYPE_HAS_NAME(*single_type)) {
|
||||
zend_string *lcname = zend_string_tolower(ZEND_TYPE_NAME(*single_type));
|
||||
const zend_class_entry *ce = zend_optimizer_get_class_entry(script, op_array, lcname);
|
||||
zend_class_entry *ce = zend_optimizer_get_class_entry(script, op_array, lcname);
|
||||
zend_string_release(lcname);
|
||||
bool result = ce && safe_instanceof(use_info->ce, ce);
|
||||
if (result == !is_intersection) {
|
||||
|
|
|
@ -78,10 +78,8 @@ static void zend_delete_call_instructions(zend_op_array *op_array, zend_op *opli
|
|||
|
||||
static void zend_try_inline_call(zend_op_array *op_array, zend_op *fcall, zend_op *opline, zend_function *func)
|
||||
{
|
||||
const uint32_t no_discard = RETURN_VALUE_USED(opline) ? 0 : ZEND_ACC_NODISCARD;
|
||||
|
||||
if (func->type == ZEND_USER_FUNCTION
|
||||
&& !(func->op_array.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_DEPRECATED|no_discard))
|
||||
&& !(func->op_array.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_DEPRECATED))
|
||||
/* TODO: function copied from trait may be inconsistent ??? */
|
||||
&& !(func->op_array.fn_flags & (ZEND_ACC_TRAIT_CLONE))
|
||||
&& fcall->extended_value >= func->op_array.required_num_args
|
||||
|
@ -204,12 +202,18 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
|
|||
fcall->op1.num = zend_vm_calc_used_stack(fcall->extended_value, call_stack[call].func);
|
||||
literal_dtor(&ZEND_OP2_LITERAL(fcall));
|
||||
fcall->op2.constant = fcall->op2.constant + 1;
|
||||
if (opline->opcode != ZEND_CALLABLE_CONVERT) {
|
||||
opline->opcode = zend_get_call_op(fcall, call_stack[call].func);
|
||||
}
|
||||
} else if (fcall->opcode == ZEND_INIT_NS_FCALL_BY_NAME) {
|
||||
fcall->opcode = ZEND_INIT_FCALL;
|
||||
fcall->op1.num = zend_vm_calc_used_stack(fcall->extended_value, call_stack[call].func);
|
||||
literal_dtor(&op_array->literals[fcall->op2.constant]);
|
||||
literal_dtor(&op_array->literals[fcall->op2.constant + 2]);
|
||||
fcall->op2.constant = fcall->op2.constant + 1;
|
||||
if (opline->opcode != ZEND_CALLABLE_CONVERT) {
|
||||
opline->opcode = zend_get_call_op(fcall, call_stack[call].func);
|
||||
}
|
||||
} else if (fcall->opcode == ZEND_INIT_STATIC_METHOD_CALL
|
||||
|| fcall->opcode == ZEND_INIT_METHOD_CALL
|
||||
|| fcall->opcode == ZEND_INIT_PARENT_PROPERTY_HOOK_CALL
|
||||
|
@ -219,16 +223,6 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
|
|||
ZEND_UNREACHABLE();
|
||||
}
|
||||
|
||||
/* If the INIT opcode changed the DO opcode can also change to
|
||||
* a more optimized one.
|
||||
*
|
||||
* At this point we also know whether or not the result of
|
||||
* the DO opcode is used, allowing to optimize calls to
|
||||
* ZEND_ACC_NODISCARD functions. */
|
||||
if (opline->opcode != ZEND_CALLABLE_CONVERT) {
|
||||
opline->opcode = zend_get_call_op(fcall, call_stack[call].func, !RESULT_UNUSED(opline));
|
||||
}
|
||||
|
||||
if ((ZEND_OPTIMIZER_PASS_16 & ctx->optimization_level)
|
||||
&& call_stack[call].try_inline
|
||||
&& opline->opcode != ZEND_CALLABLE_CONVERT) {
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#include "zend_func_info.h"
|
||||
#include "zend_call_graph.h"
|
||||
#include "zend_dump.h"
|
||||
#include "zend_smart_str.h"
|
||||
#include "ext/standard/php_string.h"
|
||||
|
||||
void zend_dump_ht(HashTable *ht)
|
||||
{
|
||||
|
@ -66,27 +66,13 @@ void zend_dump_const(const zval *zv)
|
|||
case IS_DOUBLE:
|
||||
fprintf(stderr, " float(%g)", Z_DVAL_P(zv));
|
||||
break;
|
||||
case IS_STRING: {
|
||||
smart_str escaped_string = {0};
|
||||
smart_str_append_escaped(&escaped_string, Z_STRVAL_P(zv), Z_STRLEN_P(zv));
|
||||
smart_str_0(&escaped_string);
|
||||
case IS_STRING:;
|
||||
zend_string *escaped_string = php_addcslashes(Z_STR_P(zv), "\"\\", 2);
|
||||
|
||||
fprintf(stderr, " string(\"");
|
||||
fprintf(stderr, " string(\"%s\")", ZSTR_VAL(escaped_string));
|
||||
|
||||
/* Also escape '"' */
|
||||
for (size_t i = 0; i < ZSTR_LEN(escaped_string.s); i++) {
|
||||
if (ZSTR_VAL(escaped_string.s)[i] == '"') {
|
||||
fprintf(stderr, "\\\"");
|
||||
} else {
|
||||
putc(ZSTR_VAL(escaped_string.s)[i], stderr);
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "\")");
|
||||
|
||||
smart_str_free_ex(&escaped_string, false);
|
||||
zend_string_release(escaped_string);
|
||||
break;
|
||||
}
|
||||
case IS_ARRAY:
|
||||
fprintf(stderr, " array(...)");
|
||||
break;
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
/* This is a generated file, edit the .stub.php files instead. */
|
||||
|
||||
static const func_info_t func_infos[] = {
|
||||
F1("clone", MAY_BE_OBJECT),
|
||||
F1("zend_version", MAY_BE_STRING),
|
||||
FN("func_get_args", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_ANY),
|
||||
F1("get_class_vars", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF),
|
||||
|
@ -47,7 +46,6 @@ static const func_info_t func_infos[] = {
|
|||
F1("curl_multi_strerror", MAY_BE_STRING|MAY_BE_NULL),
|
||||
F1("curl_share_init", MAY_BE_OBJECT),
|
||||
F1("curl_share_strerror", MAY_BE_STRING|MAY_BE_NULL),
|
||||
F1("curl_share_init_persistent", MAY_BE_OBJECT),
|
||||
F1("curl_strerror", MAY_BE_STRING|MAY_BE_NULL),
|
||||
F1("curl_version", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_LONG|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_FALSE),
|
||||
F1("date", MAY_BE_STRING),
|
||||
|
@ -131,7 +129,9 @@ static const func_info_t func_infos[] = {
|
|||
F1("imagecreatefromgd", MAY_BE_OBJECT|MAY_BE_FALSE),
|
||||
F1("imagecreatefromgd2", MAY_BE_OBJECT|MAY_BE_FALSE),
|
||||
F1("imagecreatefromgd2part", MAY_BE_OBJECT|MAY_BE_FALSE),
|
||||
#if defined(HAVE_GD_BMP)
|
||||
F1("imagecreatefrombmp", MAY_BE_OBJECT|MAY_BE_FALSE),
|
||||
#endif
|
||||
F1("imagecolorsforindex", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_LONG),
|
||||
F1("imagegetclip", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_LONG),
|
||||
#if defined(HAVE_GD_FREETYPE)
|
||||
|
@ -421,12 +421,13 @@ static const func_info_t func_infos[] = {
|
|||
#endif
|
||||
F1("get_current_user", MAY_BE_STRING),
|
||||
FN("get_cfg_var", MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_FALSE),
|
||||
F1("error_get_last", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_LONG|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_NULL),
|
||||
F1("error_get_last", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_LONG|MAY_BE_ARRAY_OF_STRING|MAY_BE_NULL),
|
||||
F1("highlight_file", MAY_BE_STRING|MAY_BE_BOOL),
|
||||
F1("php_strip_whitespace", MAY_BE_STRING),
|
||||
F1("highlight_string", MAY_BE_STRING|MAY_BE_TRUE),
|
||||
F1("ini_get_all", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_NULL|MAY_BE_FALSE),
|
||||
F1("set_include_path", MAY_BE_STRING|MAY_BE_FALSE),
|
||||
F1("get_include_path", MAY_BE_STRING|MAY_BE_FALSE),
|
||||
F1("print_r", MAY_BE_STRING|MAY_BE_TRUE),
|
||||
#if defined(HAVE_GETSERVBYPORT)
|
||||
F1("getservbyport", MAY_BE_STRING|MAY_BE_FALSE),
|
||||
|
@ -510,7 +511,9 @@ static const func_info_t func_infos[] = {
|
|||
F1("getcwd", MAY_BE_STRING|MAY_BE_FALSE),
|
||||
F1("readdir", MAY_BE_STRING|MAY_BE_FALSE),
|
||||
F1("scandir", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_STRING|MAY_BE_FALSE),
|
||||
#if defined(HAVE_GLOB)
|
||||
F1("glob", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_STRING|MAY_BE_FALSE),
|
||||
#endif
|
||||
F1("exec", MAY_BE_STRING|MAY_BE_FALSE),
|
||||
F1("system", MAY_BE_STRING|MAY_BE_FALSE),
|
||||
F1("escapeshellcmd", MAY_BE_STRING),
|
||||
|
|
|
@ -2409,7 +2409,7 @@ static const zend_property_info *lookup_prop_info(const zend_class_entry *ce, ze
|
|||
/* If the class is linked, reuse the precise runtime logic. */
|
||||
if ((ce->ce_flags & ZEND_ACC_LINKED)
|
||||
&& (!scope || (scope->ce_flags & ZEND_ACC_LINKED))) {
|
||||
const zend_class_entry *prev_scope = EG(fake_scope);
|
||||
zend_class_entry *prev_scope = EG(fake_scope);
|
||||
EG(fake_scope) = scope;
|
||||
prop_info = zend_get_property_info(ce, name, 1);
|
||||
EG(fake_scope) = prev_scope;
|
||||
|
|
|
@ -82,7 +82,30 @@ zend_result zend_optimizer_eval_unary_op(zval *result, uint8_t opcode, zval *op1
|
|||
|
||||
zend_result zend_optimizer_eval_cast(zval *result, uint32_t type, zval *op1) /* {{{ */
|
||||
{
|
||||
if (zend_try_ct_eval_cast(result, type, op1)) {
|
||||
switch (type) {
|
||||
case IS_NULL:
|
||||
ZVAL_NULL(result);
|
||||
return SUCCESS;
|
||||
case _IS_BOOL:
|
||||
ZVAL_BOOL(result, zval_is_true(op1));
|
||||
return SUCCESS;
|
||||
case IS_LONG:
|
||||
ZVAL_LONG(result, zval_get_long(op1));
|
||||
return SUCCESS;
|
||||
case IS_DOUBLE:
|
||||
ZVAL_DOUBLE(result, zval_get_double(op1));
|
||||
return SUCCESS;
|
||||
case IS_STRING:
|
||||
/* Conversion from double to string takes into account run-time
|
||||
'precision' setting and cannot be evaluated at compile-time */
|
||||
if (Z_TYPE_P(op1) != IS_ARRAY && Z_TYPE_P(op1) != IS_DOUBLE) {
|
||||
ZVAL_STR(result, zval_get_string(op1));
|
||||
return SUCCESS;
|
||||
}
|
||||
break;
|
||||
case IS_ARRAY:
|
||||
ZVAL_COPY(result, op1);
|
||||
convert_to_array(result);
|
||||
return SUCCESS;
|
||||
}
|
||||
return FAILURE;
|
||||
|
|
|
@ -98,10 +98,6 @@ ZEND_API int zend_optimizer_register_pass(zend_optimizer_pass_t pass);
|
|||
ZEND_API void zend_optimizer_unregister_pass(int idx);
|
||||
zend_result zend_optimizer_startup(void);
|
||||
zend_result zend_optimizer_shutdown(void);
|
||||
|
||||
typedef void (*zend_op_array_func_t)(zend_op_array *, void *context);
|
||||
void zend_foreach_op_array(zend_script *script, zend_op_array_func_t func, void *context);
|
||||
|
||||
END_EXTERN_C()
|
||||
|
||||
#endif
|
||||
|
|
|
@ -128,4 +128,7 @@ int sccp_optimize_op_array(zend_optimizer_ctx *ctx, zend_op_array *op_array, zen
|
|||
int dce_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *optimizer_ctx, zend_ssa *ssa, bool reorder_dtor_effects);
|
||||
zend_result zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array, zend_ssa *ssa);
|
||||
|
||||
typedef void (*zend_op_array_func_t)(zend_op_array *, void *context);
|
||||
void zend_foreach_op_array(zend_script *script, zend_op_array_func_t func, void *context);
|
||||
|
||||
#endif
|
||||
|
|
27
Zend/Zend.m4
27
Zend/Zend.m4
|
@ -149,14 +149,8 @@ AC_CHECK_FUNCS(m4_normalize([
|
|||
pthread_get_stackaddr_np
|
||||
pthread_getattr_np
|
||||
pthread_stackseg_np
|
||||
strnlen
|
||||
]))
|
||||
|
||||
AC_CHECK_DECL([clock_gettime_nsec_np],
|
||||
[AC_DEFINE([HAVE_CLOCK_GETTIME_NSEC_NP], [1],
|
||||
[Define to 1 if you have the declaration of 'clock_gettime_nsec_np'.])],,
|
||||
[#include <time.h>])
|
||||
|
||||
dnl
|
||||
dnl Check for sigsetjmp. If sigsetjmp is defined as a macro, use AC_CHECK_DECL
|
||||
dnl as a fallback since AC_CHECK_FUNC cannot detect macros.
|
||||
|
@ -193,21 +187,28 @@ AS_VAR_IF([GCC], [yes],
|
|||
|
||||
dnl Check if compiler supports -Wno-clobbered (only GCC).
|
||||
AX_CHECK_COMPILE_FLAG([-Wno-clobbered],
|
||||
[CFLAGS="-Wno-clobbered $CFLAGS"])
|
||||
[CFLAGS="-Wno-clobbered $CFLAGS"],,
|
||||
[-Werror])
|
||||
dnl Check for support for implicit fallthrough level 1, also add after previous
|
||||
dnl CFLAGS as level 3 is enabled in -Wextra.
|
||||
AX_CHECK_COMPILE_FLAG([-Wimplicit-fallthrough=1],
|
||||
[CFLAGS="$CFLAGS -Wimplicit-fallthrough=1"])
|
||||
[CFLAGS="$CFLAGS -Wimplicit-fallthrough=1"],,
|
||||
[-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-Wduplicated-cond],
|
||||
[CFLAGS="-Wduplicated-cond $CFLAGS"])
|
||||
[CFLAGS="-Wduplicated-cond $CFLAGS"],,
|
||||
[-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-Wlogical-op],
|
||||
[CFLAGS="-Wlogical-op $CFLAGS"])
|
||||
[CFLAGS="-Wlogical-op $CFLAGS"],,
|
||||
[-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-Wformat-truncation],
|
||||
[CFLAGS="-Wformat-truncation $CFLAGS"])
|
||||
[CFLAGS="-Wformat-truncation $CFLAGS"],,
|
||||
[-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-Wstrict-prototypes],
|
||||
[CFLAGS="-Wstrict-prototypes $CFLAGS"])
|
||||
[CFLAGS="-Wstrict-prototypes $CFLAGS"],,
|
||||
[-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-fno-common],
|
||||
[CFLAGS="-fno-common $CFLAGS"])
|
||||
[CFLAGS="-fno-common $CFLAGS"],,
|
||||
[-Werror])
|
||||
|
||||
ZEND_CHECK_ALIGNMENT
|
||||
ZEND_CHECK_SIGNALS
|
||||
|
|
|
@ -104,7 +104,7 @@ int(10)
|
|||
func_get_arg(): Argument #1 ($position) must be less than the number of the arguments passed to the currently executed function
|
||||
int(1)
|
||||
func_get_arg(): Argument #1 ($position) must be less than the number of the arguments passed to the currently executed function
|
||||
Exception: Too few arguments to function test2(), 0 passed in %s on line %d and exactly 1 expected
|
||||
Exception: Too few arguments to function test2(), 0 passed in %s002.php on line %d and exactly 1 expected
|
||||
int(1)
|
||||
int(2)
|
||||
func_get_arg(): Argument #1 ($position) must be less than the number of the arguments passed to the currently executed function
|
|
@ -59,7 +59,7 @@ array(1) {
|
|||
[0]=>
|
||||
int(1)
|
||||
}
|
||||
Exception: Too few arguments to function test2(), 0 passed in %s on line %d and exactly 1 expected
|
||||
Exception: Too few arguments to function test2(), 0 passed in %s003.php on line %d and exactly 1 expected
|
||||
array(2) {
|
||||
[0]=>
|
||||
int(1)
|
||||
|
@ -68,7 +68,7 @@ array(2) {
|
|||
}
|
||||
array(0) {
|
||||
}
|
||||
Exception: Too few arguments to function test3(), 1 passed in %s on line %d and exactly 2 expected
|
||||
Exception: Too few arguments to function test3(), 1 passed in %s003.php on line %d and exactly 2 expected
|
||||
array(2) {
|
||||
[0]=>
|
||||
int(1)
|
3
Zend/tests/014.inc
Normal file
3
Zend/tests/014.inc
Normal file
|
@ -0,0 +1,3 @@
|
|||
<?php
|
||||
/* dummy file for 014.phpt */
|
||||
?>
|
|
@ -5,13 +5,13 @@ get_included_files() tests
|
|||
|
||||
var_dump(get_included_files());
|
||||
|
||||
include(__DIR__."/get_included_files_basic.inc");
|
||||
include(__DIR__."/014.inc");
|
||||
var_dump(get_included_files());
|
||||
|
||||
include_once(__DIR__."/get_included_files_basic.inc");
|
||||
include_once(__DIR__."/014.inc");
|
||||
var_dump(get_included_files());
|
||||
|
||||
include(__DIR__."/get_included_files_basic.inc");
|
||||
include(__DIR__."/014.inc");
|
||||
var_dump(get_included_files());
|
||||
|
||||
echo "Done\n";
|
|
@ -1,22 +0,0 @@
|
|||
--TEST--
|
||||
__debugInfo with reference return
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
class Test {
|
||||
private $tmp = ['x' => 1];
|
||||
|
||||
public function &__debugInfo(): array
|
||||
{
|
||||
return $this->tmp;
|
||||
}
|
||||
}
|
||||
|
||||
var_dump(new Test);
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
object(Test)#1 (1) {
|
||||
["x"]=>
|
||||
int(1)
|
||||
}
|
|
@ -1,19 +0,0 @@
|
|||
--TEST--
|
||||
Abstract methods not allowed in classes that are not abstract (GH-16067)
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
// Still allowed via trait
|
||||
trait TraitWithAbstract {
|
||||
abstract public function foo();
|
||||
}
|
||||
class TraitWorks {
|
||||
use TraitWithAbstract;
|
||||
}
|
||||
|
||||
class NotAbstract {
|
||||
abstract public function bar();
|
||||
}
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Class NotAbstract declares abstract method bar() and must therefore be declared abstract in %s on line %d
|
|
@ -1,5 +1,5 @@
|
|||
--TEST--
|
||||
using multiple access modifiers (properties)
|
||||
using multiple access modifiers (attributes)
|
||||
--FILE--
|
||||
<?php
|
||||
|
|
@ -8,4 +8,4 @@ enum Test {}
|
|||
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Cannot apply #[\AllowDynamicProperties] to enum Test in %s on line %d
|
||||
Fatal error: Cannot apply #[AllowDynamicProperties] to enum Test in %s on line %d
|
|
@ -8,4 +8,4 @@ interface Test {}
|
|||
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Cannot apply #[\AllowDynamicProperties] to interface Test in %s on line %d
|
||||
Fatal error: Cannot apply #[AllowDynamicProperties] to interface Test in %s on line %d
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue