FrankenPHP crashes with zend_mm_heap corrupted while running some wordpress sites
What happened?
While testing out a migration from nginx/php-fpm to FrankenPHP, the server crashes with "zend_mm_heap corrupted" after around 8 hours of uptime. This is using the debian package of FrankenPHP 1.8.0.
The server is hosting 6 fairly basic wordpress sites and a few static sites.
Build Type
Official static build
Worker Mode
No
Operating System
GNU/Linux
CPU Architecture
aarch64
PHP configuration
PHP logo
PHP Version 8.4.10
System Linux wordpress 6.1.0-37-cloud-arm64 #1 SMP Debian 6.1.140-1 (2025-05-22) aarch64
Build Date Jul 7 2025 01:03:44
Build System Linux buildkitsandbox 6.11.0-1015-azure #15~24.04.1-Ubuntu SMP Thu May 1 03:01:44 UTC 2025 aarch64 aarch64 aarch64 GNU/Linux
Configure Command './configure' '--prefix=' '--with-valgrind=no' '--disable-shared' '--enable-static' '--disable-all' '--disable-cgi' '--disable-phpdbg' '--with-pic' '--disable-cli' '--disable-fpm' '--enable-embed=static' '--disable-micro' '--with-config-file-path=/etc/frankenphp' '--with-config-file-scan-dir=/etc/frankenphp/php.d' '--enable-zts' '--disable-zend-signals' '--enable-zend-max-execution-timers' '--with-amqp' '--with-librabbitmq-dir=/go/src/app/dist/static-php-cli/buildroot' '--enable-apcu' '--enable-ast' '--enable-bcmath' '--enable-brotli' '--with-bz2=/go/src/app/dist/static-php-cli/buildroot' '--enable-calendar' '--enable-ctype' '--with-curl' '--enable-dba' '--enable-dom' '--enable-exif' '--enable-fileinfo' '--enable-filter' '--enable-ftp' '--with-zlib' '--enable-gd' '--with-freetype' '--with-jpeg' '--with-webp' '--with-avif' '--with-gmp=/go/src/app/dist/static-php-cli/buildroot' '--with-gettext=/go/src/app/dist/static-php-cli/buildroot' '--with-iconv=/go/src/app/dist/static-php-cli/buildroot' '--enable-session' '--enable-igbinary' '--with-imagick=/go/src/app/dist/static-php-cli/buildroot' 'ac_cv_func_omp_pause_resource_all=no' '--enable-intl' '--with-ldap=/go/src/app/dist/static-php-cli/buildroot' '--enable-lz4' '--with-lz4-includedir=/go/src/app/dist/static-php-cli/buildroot' '--enable-mbstring' '--enable-mbregex' '--enable-mysqlnd' '--with-mysqli' '--enable-opcache' '--enable-parallel' '--enable-pcntl' '--enable-pdo' '--with-pdo-mysql' '--with-pgsql' 'PGSQL_CFLAGS=-I/go/src/app/dist/static-php-cli/buildroot/include' 'PGSQL_LIBS=-L/go/src/app/dist/static-php-cli/buildroot/lib -lpq -lpgport -lpgcommon -lzstd -lldap -llber -lsodium -lgmp -lreadline -lncurses -lssl -lcrypto -lxml2 -lz -licui18n -licuio -licuuc -licudata -llzma -liconv -lcharset -liconv -lcharset -llzma -liconv -lcharset -licui18n -licuio -licuuc -licudata -lz -lxml2 -lz -licui18n -licuio -licuuc -licudata -llzma -liconv -lcharset -lssl -lcrypto -lz -ldl -lpthread -lncurses -lreadline -lncurses -lgmp -lsodium -lldap -llber -lsodium -lgmp -lssl -lcrypto -lz -lzstd' '--with-pdo-pgsql=/go/src/app/dist/static-php-cli/buildroot' '--with-sqlite3=/go/src/app/dist/static-php-cli/buildroot' '--with-pdo-sqlite' '--enable-phar' '--enable-posix' '--enable-protobuf' '--without-libedit' '--with-readline=/go/src/app/dist/static-php-cli/buildroot' '--enable-redis' '--enable-redis-session' '--enable-redis-igbinary' '--enable-redis-zstd' '--enable-redis-lz4' '--with-liblz4=/go/src/app/dist/static-php-cli/buildroot' '--enable-shmop' '--enable-simplexml' '--enable-soap' '--enable-sockets' '--with-sodium' '--with-ssh2=/go/src/app/dist/static-php-cli/buildroot' '--enable-sysvmsg' '--enable-sysvsem' '--enable-sysvshm' '--with-tidy=/go/src/app/dist/static-php-cli/buildroot' '--enable-tokenizer' '--with-zip=/go/src/app/dist/static-php-cli/buildroot' '--with-xlswriter' '--enable-reader' '--with-openssl=/go/src/app/dist/static-php-cli/buildroot' '--enable-xml' '--enable-xmlreader' '--enable-xmlwriter' '--with-libxml=/go/src/app/dist/static-php-cli/buildroot' '--with-xz' '--with-yaml=/go/src/app/dist/static-php-cli/buildroot' '--enable-zstd' '--with-libzstd=/go/src/app/dist/static-php-cli/buildroot' 'PKG_CONFIG=/go/src/app/dist/static-php-cli/buildroot/bin/pkg-config' 'PKG_CONFIG_PATH=/go/src/app/dist/static-php-cli/buildroot/lib/pkgconfig' 'EXTENSION_DIR=/usr/lib/frankenphp/modules'
Server API FrankenPHP
Virtual Directory Support enabled
Configuration File (php.ini) Path /etc/frankenphp
Loaded Configuration File /etc/frankenphp/php.ini
Scan this dir for additional .ini files /etc/frankenphp/php.d
Additional .ini files parsed (none)
PHP API 20240924
PHP Extension 20240924
Zend Extension 420240924
Zend Extension Build API420240924,TS
PHP Extension Build API20240924,TS
PHP Integer Size 64 bits
Debug Build no
Thread Safety enabled
Thread API POSIX Threads
Zend Signal Handling disabled
Zend Memory Manager enabled
Zend Multibyte Support provided by mbstring
Zend Max Execution Timers enabled
IPv6 Support enabled
DTrace Support disabled
Registered PHP Streams https, ftps, compress.zlib, compress.brotli, compress.bzip2, php, file, glob, data, http, ftp, phar, ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp, compress.lzma, zip, compress.zstd
Registered Stream Socket Transports tcp, udp, unix, udg, ssl, tls, tlsv1.0, tlsv1.1, tlsv1.2, tlsv1.3
Registered Stream Filters zlib.*, bzip2.*, convert.iconv.*, string.rot13, string.toupper, string.tolower, convert.*, consumed, dechunk
Zend logoThis program makes use of the Zend Scripting Language Engine:
Zend Engine v4.4.10, Copyright (c) Zend Technologies with Zend OPcache v8.4.10, Copyright (c), by Zend Technologies
Configuration
amqp
Version 2.1.2
Compiled Jul 7 2025 @ 01:01:46
AMQP protocol version 0-9-1
librabbitmq version 0.16.0-pre
Default max channels per connection 256
Default max frame size 131072
Default heartbeats interval 0
Directive Local Value Master Value
amqp.auto_ack 0 0
amqp.cacert no value no value
amqp.cert no value no value
amqp.channel_max 256 256
amqp.connect_timeout 0 0
amqp.deserialization_depth 128 128
amqp.frame_max 131072 131072
amqp.global_prefetch_count 0 0
amqp.global_prefetch_size 0 0
amqp.heartbeat 0 0
amqp.host localhost localhost
amqp.key no value no value
amqp.login guest guest
amqp.password guest guest
amqp.port 5672 5672
amqp.prefetch_count 3 3
amqp.prefetch_size 0 0
amqp.read_timeout 0 0
amqp.rpc_timeout 0 0
amqp.sasl_method AMQP_SASL_METHOD_PLAIN AMQP_SASL_METHOD_PLAIN
amqp.serialization_depth 128 128
amqp.timeout no value no value
amqp.verify 1 1
amqp.vhost / /
amqp.write_timeout 0 0
apcu
APCu Support Enabled
Version 5.1.24
APCu Debugging Disabled
MMAP Support Enabled
MMAP File Mask no value
Serialization Support php, brotli, igbinary, lz4, zstd
Build Date Jul 7 2025 01:01:49
Directive Local Value Master Value
apc.coredump_unmap Off Off
apc.enable_cli Off Off
apc.enabled On On
apc.entries_hint 4096 4096
apc.gc_ttl 3600 3600
apc.mmap_file_mask no value no value
apc.preload_path no value no value
apc.serializer php php
apc.shm_segments 1 1
apc.shm_size 32M 32M
apc.slam_defense Off Off
apc.smart 0 0
apc.ttl 0 0
apc.use_request_time Off Off
ast
ast support enabled
extension version 1.1.2
AST version Current version is 110. All versions (including experimental): {50, 60, 70, 80, 85, 90, 100, 110}
bcmath
BCMath support enabled
Directive Local Value Master Value
bcmath.scale 0 0
brotli
Brotli support enabled
Extension Version 0.18.0
Library Version 1.1.0
Dictionary support enabled
APCu serializer ABI 0
bz2
BZip2 Support Enabled
Stream Wrapper support compress.bzip2://
Stream Filter support bzip2.decompress, bzip2.compress
BZip2 Version 1.0.8, 13-Jul-2019
calendar
Calendar support enabled
Core
PHP Version 8.4.10
Directive Local Value Master Value
allow_url_fopen On On
allow_url_include Off Off
arg_separator.input & &
arg_separator.output & &
auto_append_file no value no value
auto_globals_jit On On
auto_prepend_file no value no value
browscap no value no value
default_charset UTF-8 UTF-8
default_mimetype text/html text/html
disable_classes no value no value
disable_functions no value no value
display_errors Off Off
display_startup_errors Off Off
doc_root no value no value
docref_ext no value no value
docref_root no value no value
enable_dl Off Off
enable_post_data_reading On On
error_append_string no value no value
error_log no value no value
error_log_mode 0644 0644
error_prepend_string no value no value
error_reporting 22527 22527
expose_php Off Off
extension_dir /usr/lib/frankenphp/modules /usr/lib/frankenphp/modules
fiber.stack_size no value no value
file_uploads On On
hard_timeout 2 2
highlight.comment #FF8000 #FF8000
highlight.default #0000BB #0000BB
highlight.html #000000 #000000
highlight.keyword #007700 #007700
highlight.string #DD0000 #DD0000
html_errors On On
ignore_repeated_errors Off Off
ignore_repeated_source Off Off
ignore_user_abort Off Off
implicit_flush Off Off
include_path .: .:
input_encoding no value no value
internal_encoding no value no value
log_errors On On
mail.add_x_header Off Off
mail.force_extra_parameters no value no value
mail.log no value no value
mail.mixed_lf_and_crlf Off Off
max_execution_time 60 60
max_file_uploads 20 20
max_input_nesting_level 64 64
max_input_time 60 60
max_input_vars 1000 1000
max_multipart_body_parts -1 -1
memory_limit 512M 512M
open_basedir no value no value
output_buffering 4096 4096
output_encoding no value no value
output_handler no value no value
post_max_size 50M 50M
precision 14 14
realpath_cache_size 4096K 4096K
realpath_cache_ttl 120 120
register_argc_argv Off Off
report_memleaks On On
report_zend_debug Off Off
request_order GP GP
sendmail_from no value no value
sendmail_path /usr/sbin/sendmail -t -i /usr/sbin/sendmail -t -i
serialize_precision -1 -1
short_open_tag Off Off
SMTP localhost localhost
smtp_port 25 25
static-php-cli.version 2.6.1 2.6.1
sys_temp_dir no value no value
syslog.facility LOG_USER LOG_USER
syslog.filter no-ctrl no-ctrl
syslog.ident php php
unserialize_callback_func no value no value
upload_max_filesize 50M 50M
upload_tmp_dir no value no value
user_dir no value no value
user_ini.cache_ttl 300 300
user_ini.filename .user.ini .user.ini
variables_order GPCS GPCS
xmlrpc_error_number 0 0
xmlrpc_errors Off Off
zend.assertions -1 -1
zend.detect_unicode On On
zend.enable_gc On On
zend.exception_ignore_args On On
zend.exception_string_param_max_len 0 0
zend.max_allowed_stack_size 0 0
zend.multibyte Off Off
zend.reserved_stack_size 0 0
zend.script_encoding no value no value
ctype
ctype functions enabled
curl
cURL support enabled
cURL Information 8.14.1
Age 11
Features
AsynchDNS Yes
CharConv No
Debug No
GSS-Negotiate No
IDN No
IPv6 Yes
krb4 No
Largefile Yes
libz Yes
NTLM Yes
NTLMWB No
SPNEGO No
SSL Yes
SSPI No
TLS-SRP Yes
HTTP2 Yes
GSSAPI No
KERBEROS5 No
UNIX_SOCKETS Yes
PSL No
HTTPS_PROXY Yes
MULTI_SSL No
BROTLI Yes
ALTSVC Yes
HTTP3 Yes
UNICODE No
ZSTD Yes
HSTS Yes
GSASL No
Protocols dict, file, ftp, ftps, gopher, gophers, http, https, imap, imaps, mqtt, pop3, pop3s, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet, tftp, ws, wss
Host Linux
SSL Version OpenSSL/3.5.1
ZLib Version 1.3.1
libSSH Version libssh2/1.11.1
Directive Local Value Master Value
curl.cainfo no value no value
date
date/time support enabled
timelib version 2022.12
"Olson" Timezone Database Version 2025.2
Timezone Database internal
Default timezone UTC
Directive Local Value Master Value
date.default_latitude 31.7667 31.7667
date.default_longitude 35.2333 35.2333
date.sunrise_zenith 90.833333 90.833333
date.sunset_zenith 90.833333 90.833333
date.timezone UTC UTC
dba
DBA support enabled
Supported handlers cdb cdb_make inifile flatfile
Directive Local Value Master Value
dba.default_handler flatfile flatfile
dom
DOM/XML enabled
DOM/XML API Version 20031129
libxml Version 2.12.5
HTML Support enabled
XPath Support enabled
XPointer Support enabled
Schema Support enabled
RelaxNG Support enabled
exif
EXIF Support enabled
Supported EXIF Version 0220
Supported filetypes JPEG, TIFF
Multibyte decoding support using mbstring enabled
Extended EXIF tag formats Canon, Casio, Fujifilm, Nikon, Olympus, Samsung, Panasonic, DJI, Sony, Pentax, Minolta, Sigma, Foveon, Kyocera, Ricoh, AGFA, Epson
Directive Local Value Master Value
exif.decode_jis_intel JIS JIS
exif.decode_jis_motorola JIS JIS
exif.decode_unicode_intel UCS-2LE UCS-2LE
exif.decode_unicode_motorola UCS-2BE UCS-2BE
exif.encode_jis no value no value
exif.encode_unicode ISO-8859-15 ISO-8859-15
fileinfo
fileinfo support enabled
libmagic 545
filter
Input Validation and Filtering enabled
Directive Local Value Master Value
filter.default unsafe_raw unsafe_raw
filter.default_flags no value no value
frankenphp
Version v1.8.0
ftp
FTP support enabled
FTPS support enabled
gd
GD Support enabled
GD Version bundled (2.1.0 compatible)
FreeType Support enabled
FreeType Linkage with freetype
FreeType Version 2.13.2
GIF Read Support enabled
GIF Create Support enabled
JPEG Support enabled
libJPEG Version 6b
PNG Support enabled
libPNG Version 1.6.51.git
WBMP Support enabled
XBM Support enabled
WebP Support enabled
BMP Support enabled
AVIF Support enabled
TGA Read Support enabled
Directive Local Value Master Value
gd.jpeg_ignore_warning On On
gettext
GetText Support enabled
gmp
gmp support enabled
GMP version 6.3.0
hash
hash support enabled
Hashing Engines md2 md4 md5 sha1 sha224 sha256 sha384 sha512/224 sha512/256 sha512 sha3-224 sha3-256 sha3-384 sha3-512 ripemd128 ripemd160 ripemd256 ripemd320 whirlpool tiger128,3 tiger160,3 tiger192,3 tiger128,4 tiger160,4 tiger192,4 snefru snefru256 gost gost-crypto adler32 crc32 crc32b crc32c fnv132 fnv1a32 fnv164 fnv1a64 joaat murmur3a murmur3c murmur3f xxh32 xxh64 xxh3 xxh128 haval128,3 haval160,3 haval192,3 haval224,3 haval256,3 haval128,4 haval160,4 haval192,4 haval224,4 haval256,4 haval128,5 haval160,5 haval192,5 haval224,5 haval256,5
iconv
iconv support enabled
iconv implementation glibc
iconv library version 1.18
Directive Local Value Master Value
iconv.input_encoding no value no value
iconv.internal_encoding no value no value
iconv.output_encoding no value no value
igbinary
igbinary support enabled
igbinary version 3.2.16
igbinary APCu serializer ABI 0
igbinary session support yes
Directive Local Value Master Value
igbinary.compact_strings On On
imagick
imagick module enabled
imagick module version 3.8.0
imagick classes Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator, ImagickKernel
Imagick compiled with ImageMagick version ImageMagick 7.1.1-47 Q16-HDRI aarch64 c8f4e8cb7:20250329 https://imagemagick.org
Imagick using ImageMagick library version ImageMagick 7.1.1-47 Q16-HDRI aarch64 c8f4e8cb7:20250329 https://imagemagick.org
ImageMagick copyright (C) 1999 ImageMagick Studio LLC
ImageMagick release date 2025-03-29
ImageMagick number of supported formats: 263
ImageMagick supported formats 3FR, 3G2, 3GP, A, AAI, AI, APNG, ART, ARW, ASHLAR, AVCI, AVI, AVIF, AVS, B, BAYER, BAYERA, BGR, BGRA, BGRO, BMP, BMP2, BMP3, BRF, C, CAL, CALS, CANVAS, CAPTION, CIN, CIP, CLIP, CMYK, CMYKA, CR2, CR3, CRW, CUBE, CUR, CUT, DATA, DCM, DCR, DCRAW, DCX, DDS, DFONT, DNG, DPX, DXT1, DXT5, EPDF, EPI, EPS, EPS2, EPS3, EPSF, EPSI, EPT, EPT2, EPT3, ERF, FARBFELD, FAX, FF, FFF, FILE, FITS, FL32, FLV, FRACTAL, FTP, FTS, FTXT, G, G3, G4, GIF, GIF87, GRADIENT, GRAY, GRAYA, GROUP4, HALD, HDR, HEIC, HEIF, HISTOGRAM, HRZ, HTM, HTML, HTTP, HTTPS, ICB, ICO, ICON, IIQ, INFO, INLINE, IPL, ISOBRL, ISOBRL6, JNG, JNX, JPE, JPEG, JPG, JPS, JSON, K, K25, KDC, LABEL, M, M2V, M4V, MAC, MAP, MASK, MAT, MATTE, MDC, MEF, MIFF, MKV, MNG, MONO, MOS, MOV, MP4, MPC, MPEG, MPG, MPO, MRW, MSL, MSVG, MTV, MVG, NEF, NRW, NULL, O, ORA, ORF, OTB, OTF, PAL, PALM, PAM, PANGO, PATTERN, PBM, PCD, PCDS, PCL, PCT, PCX, PDB, PDF, PDFA, PEF, PES, PFA, PFB, PFM, PGM, PGX, PHM, PICON, PICT, PIX, PJPEG, PLASMA, PNG, PNG00, PNG24, PNG32, PNG48, PNG64, PNG8, PNM, POCKETMOD, PPM, PS, PS2, PS3, PSB, PSD, PTIF, PWP, QOI, R, RADIAL-GRADIENT, RAF, RAS, RAW, RGB, RGB565, RGBA, RGBO, RGF, RLA, RLE, RMF, RW2, RWL, SCR, SCREENSHOT, SCT, SFW, SGI, SHTML, SIX, SIXEL, SPARSE-COLOR, SR2, SRF, SRW, STEGANO, STI, STRIMG, SUN, SVG, SVGZ, TEXT, TGA, THUMBNAIL, TIFF, TIFF64, TILE, TIM, TM2, TTC, TTF, TXT, UBRL, UBRL6, UIL, UYVY, VDA, VICAR, VID, VIFF, VIPS, VST, WBMP, WEBM, WEBP, WMV, WPG, X3F, XBM, XC, XCF, XPM, XPS, XV, Y, YAML, YCBCR, YCBCRA, YUV
Directive Local Value Master Value
imagick.allow_zero_dimension_images 0 0
imagick.locale_fix 0 0
imagick.progress_monitor 0 0
imagick.set_single_thread 1 1
imagick.shutdown_sleep_count 10 10
imagick.skip_version_check 0 0
intl
Internationalization support enabled
ICU version 77.1
ICU Data version 77.1
ICU TZData version 2025a
ICU Unicode version 16.0
Directive Local Value Master Value
intl.default_locale no value no value
intl.error_level 0 0
intl.use_exceptions Off Off
json
json support enabled
ldap
LDAP Support enabled
Total Links 0/unlimited
API Version 3001
Vendor Name OpenLDAP
Vendor Version 20610
Directive Local Value Master Value
ldap.max_links Unlimited Unlimited
libxml
libXML support active
libXML Compiled Version 2.12.5
libXML Loaded Version 21205
libXML streams enabled
lz4
LZ4 support enabled
Extension Version 0.4.4
LZ4 headers Version 1.10.0
LZ4 library Version 1.10.0
LZ4 APCu serializer ABI 0
mbstring
Multibyte Support enabled
Multibyte string engine libmbfl
HTTP input encoding translation disabled
libmbfl version 1.3.2
mbstring extension makes use of "streamable kanji code filter and converter", which is distributed under the GNU Lesser General Public License version 2.1.
Multibyte (japanese) regex support enabled
Multibyte regex (oniguruma) version 6.9.10
Directive Local Value Master Value
mbstring.detect_order no value no value
mbstring.encoding_translation Off Off
mbstring.http_input no value no value
mbstring.http_output no value no value
mbstring.http_output_conv_mimetypes ^(text/|application/xhtml\+xml) ^(text/|application/xhtml\+xml)
mbstring.internal_encoding no value no value
mbstring.language neutral neutral
mbstring.regex_retry_limit 1000000 1000000
mbstring.regex_stack_limit 100000 100000
mbstring.strict_detection Off Off
mbstring.substitute_character no value no value
mysqli
MysqlI Support enabled
Client API library version mysqlnd 8.4.10
Active Persistent Links 0
Inactive Persistent Links 0
Active Links 0
Directive Local Value Master Value
mysqli.allow_local_infile Off Off
mysqli.allow_persistent On On
mysqli.default_host no value no value
mysqli.default_port 3306 3306
mysqli.default_pw no value no value
mysqli.default_socket no value no value
mysqli.default_user no value no value
mysqli.local_infile_directory no value no value
mysqli.max_links Unlimited Unlimited
mysqli.max_persistent Unlimited Unlimited
mysqli.rollback_on_cached_plink Off Off
mysqlnd
mysqlnd enabled
Version mysqlnd 8.4.10
Compression supported
core SSL supported
extended SSL supported
Command buffer size 4096
Read buffer size 32768
Read timeout 86400
Collecting statistics Yes
Collecting memory statistics No
Tracing n/a
Loaded plugins mysqlnd,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password,auth_plugin_caching_sha2_password,auth_plugin_sha256_password
API Extensions mysqli,pdo_mysql
openssl
OpenSSL support enabled
OpenSSL Library Version OpenSSL 3.5.1 1 Jul 2025
OpenSSL Header Version OpenSSL 3.5.1 1 Jul 2025
Openssl default config /etc/ssl/openssl.cnf
Directive Local Value Master Value
openssl.cafile no value no value
openssl.capath no value no value
parallel
parallel support enabled
parallel version 1.2.7
pcntl
pcntl support enabled
pcre
PCRE (Perl Compatible Regular Expressions) Support enabled
PCRE Library Version 10.44 2024-06-07
PCRE Unicode Version 15.0.0
PCRE JIT Support enabled
PCRE JIT Target ARM-64 64bit (little endian + unaligned)
Directive Local Value Master Value
pcre.backtrack_limit 1000000 1000000
pcre.jit On On
pcre.recursion_limit 100000 100000
PDO
PDO support enabled
PDO drivers mysql, pgsql, sqlite
pdo_mysql
PDO Driver for MySQL enabled
Client API version mysqlnd 8.4.10
Directive Local Value Master Value
pdo_mysql.default_socket /tmp/mysql.sock /tmp/mysql.sock
pdo_pgsql
PDO Driver for PostgreSQL enabled
PostgreSQL(libpq) Version 16.9
pdo_sqlite
PDO Driver for SQLite 3.x enabled
SQLite Library 3.45.2
pgsql
PostgreSQL Support enabled
PostgreSQL (libpq) Version 16.9
Multibyte character support enabled
Active Persistent Links 0
Active Links 0
Directive Local Value Master Value
pgsql.allow_persistent On On
pgsql.auto_reset_persistent Off Off
pgsql.ignore_notice Off Off
pgsql.log_notice Off Off
pgsql.max_links Unlimited Unlimited
pgsql.max_persistent Unlimited Unlimited
Phar
Phar: PHP Archive support enabled
Phar API version 1.1.1
Phar-based phar archives enabled
Tar-based phar archives enabled
ZIP-based phar archives enabled
gzip compression enabled
bzip2 compression enabled
OpenSSL support enabled
Phar based on pear/PHP_Archive, original concept by Davey Shafik.
Phar fully realized by Gregory Beaver and Marcus Boerger.
Portions of tar implementation Copyright (c) 2003-2009 Tim Kientzle.
Directive Local Value Master Value
phar.cache_list no value no value
phar.readonly On On
phar.require_hash On On
posix
POSIX support enabled
protobuf
Version 4.29.5
Directive Local Value Master Value
protobuf.keep_descriptor_pool_after_request 0 0
random
Version 8.4.10
readline
Readline Support enabled
Readline library 8.3
Directive Local Value Master Value
cli.pager no value no value
cli.prompt \b \> \b \>
redis
Redis Support enabled
Redis Version 6.2.0
Redis Sentinel Version 1.0
Available serializers php, json, igbinary
Available compression zstd, lz4
Directive Local Value Master Value
redis.arrays.algorithm no value no value
redis.arrays.auth no value no value
redis.arrays.autorehash 0 0
redis.arrays.connecttimeout 0 0
redis.arrays.consistent 0 0
redis.arrays.distributor no value no value
redis.arrays.functions no value no value
redis.arrays.hosts no value no value
redis.arrays.index 0 0
redis.arrays.lazyconnect 0 0
redis.arrays.names no value no value
redis.arrays.pconnect 0 0
redis.arrays.previous no value no value
redis.arrays.readtimeout 0 0
redis.arrays.retryinterval 0 0
redis.clusters.auth no value no value
redis.clusters.cache_slots 0 0
redis.clusters.persistent 0 0
redis.clusters.read_timeout 0 0
redis.clusters.seeds no value no value
redis.clusters.timeout 0 0
redis.pconnect.connection_limit 0 0
redis.pconnect.echo_check_liveness 1 1
redis.pconnect.pool_detect_dirty 0 0
redis.pconnect.pool_pattern no value no value
redis.pconnect.pool_poll_timeout 0 0
redis.pconnect.pooling_enabled 1 1
redis.session.compression none none
redis.session.compression_level 3 3
redis.session.early_refresh 0 0
redis.session.lock_expire 0 0
redis.session.lock_retries 100 100
redis.session.lock_wait_time 20000 20000
redis.session.locking_enabled 0 0
Reflection
Reflection enabled
session
Session Support enabled
Registered save handlers files user redis rediscluster
Registered serializer handlers php_serialize php php_binary igbinary
Directive Local Value Master Value
session.auto_start Off Off
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_httponly Off Off
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_samesite no value no value
session.cookie_secure Off Off
session.gc_divisor 1000 1000
session.gc_maxlifetime 1440 1440
session.gc_probability 0 0
session.lazy_write On On
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path no value no value
session.serialize_handler php php
session.sid_bits_per_character 5 5
session.sid_length 26 26
session.upload_progress.cleanup On On
session.upload_progress.enabled On On
session.upload_progress.freq 1% 1%
session.upload_progress.min_freq 1 1
session.upload_progress.name PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix upload_progress_ upload_progress_
session.use_cookies On On
session.use_only_cookies On On
session.use_strict_mode Off Off
session.use_trans_sid Off Off
shmop
shmop support enabled
SimpleXML
SimpleXML support enabled
Schema support enabled
soap
Soap Client enabled
Soap Server enabled
Directive Local Value Master Value
soap.wsdl_cache 1 1
soap.wsdl_cache_dir /tmp /tmp
soap.wsdl_cache_enabled On On
soap.wsdl_cache_limit 5 5
soap.wsdl_cache_ttl 86400 86400
sockets
Sockets Support enabled
sodium
sodium support enabled
libsodium headers version 1.0.20
libsodium library version 1.0.20
SPL
SPL support enabled
Interfaces OuterIterator, RecursiveIterator, SeekableIterator, SplObserver, SplSubject
Classes AppendIterator, ArrayIterator, ArrayObject, BadFunctionCallException, BadMethodCallException, CachingIterator, CallbackFilterIterator, DirectoryIterator, DomainException, EmptyIterator, FilesystemIterator, FilterIterator, GlobIterator, InfiniteIterator, InvalidArgumentException, IteratorIterator, LengthException, LimitIterator, LogicException, MultipleIterator, NoRewindIterator, OutOfBoundsException, OutOfRangeException, OverflowException, ParentIterator, RangeException, RecursiveArrayIterator, RecursiveCachingIterator, RecursiveCallbackFilterIterator, RecursiveDirectoryIterator, RecursiveFilterIterator, RecursiveIteratorIterator, RecursiveRegexIterator, RecursiveTreeIterator, RegexIterator, RuntimeException, SplDoublyLinkedList, SplFileInfo, SplFileObject, SplFixedArray, SplHeap, SplMinHeap, SplMaxHeap, SplObjectStorage, SplPriorityQueue, SplQueue, SplStack, SplTempFileObject, UnderflowException, UnexpectedValueException
sqlite3
SQLite3 support enabled
SQLite Library 3.45.2
Directive Local Value Master Value
sqlite3.defensive On On
sqlite3.extension_dir no value no value
ssh2
SSH2 support enabled
extension version 1.4.1
libssh2 version 1.11.1
banner SSH-2.0-libssh2_1.11.1
standard
Dynamic Library Support enabled
Path to sendmail /usr/sbin/sendmail -t -i
Directive Local Value Master Value
assert.active On On
assert.bail Off Off
assert.callback no value no value
assert.exception On On
assert.warning On On
auto_detect_line_endings Off Off
default_socket_timeout 60 60
from no value no value
session.trans_sid_hosts no value no value
session.trans_sid_tags a=href,area=href,frame=src,form= a=href,area=href,frame=src,form=
unserialize_max_depth 4096 4096
url_rewriter.hosts no value no value
url_rewriter.tags form= form=
user_agent no value no value
sysvmsg
sysvmsg support enabled
sysvsem
sysvsem support enabled
sysvshm
sysvshm support enabled
tidy
Tidy support enabled
libTidy Version 5.8.0
libTidy Release 2021/07/10
Directive Local Value Master Value
tidy.clean_output Off Off
tidy.default_config no value no value
tokenizer
Tokenizer Support enabled
xlswriter
xlswriter support enabled
Version 1.5.8
bundled libxlsxwriter version 1.1.3
bundled libxlsxio version 0.2.27
xml
XML Support active
XML Namespace Support active
libxml2 Version 2.12.5
xmlreader
XMLReader enabled
xmlwriter
XMLWriter enabled
xz
xz support enabled
xz extension version 1.1.2
liblzma version 5.8.1
Directive Local Value Master Value
xz.compression_level 5 5
xz.max_memory 0 0
yaml
LibYAML Support enabled
Module Version 2.2.4
LibYAML Version 0.2.5
Directive Local Value Master Value
yaml.decode_binary 0 0
yaml.decode_php 0 0
yaml.decode_timestamp 0 0
yaml.output_canonical 0 0
yaml.output_indent 2 2
yaml.output_width 80 80
Zend OPcache
Opcode Caching Up and Running
Optimization Enabled
SHM Cache Enabled
File Cache Disabled
JIT Disabled
Startup OK
Shared memory model mmap
Cache hits 14793
Cache misses 2875
Used memory 127278152
Free memory 6938984
Wasted memory 592
Interned Strings Used memory 8388608
Interned Strings Free memory 0
Cached scripts 2873
Cached keys 3430
Max keys 16229
OOM restarts 0
Hash keys restarts 0
Manual restarts 0
Start time 2025-07-09T17:28:25+0000
Last restart time none
Last force restart time none
Directive Local Value Master Value
opcache.blacklist_filename no value no value
opcache.dups_fix Off Off
opcache.enable On On
opcache.enable_cli Off Off
opcache.enable_file_override Off Off
opcache.error_log no value no value
opcache.file_cache no value no value
opcache.file_cache_consistency_checks On On
opcache.file_cache_only Off Off
opcache.file_update_protection 2 2
opcache.force_restart_timeout 180 180
opcache.huge_code_pages Off Off
opcache.interned_strings_buffer 8 8
opcache.jit disable disable
opcache.jit_bisect_limit 0 0
opcache.jit_blacklist_root_trace 16 16
opcache.jit_blacklist_side_trace 8 8
opcache.jit_buffer_size 64M 64M
opcache.jit_debug 0 0
opcache.jit_hot_func 127 127
opcache.jit_hot_loop 64 64
opcache.jit_hot_return 8 8
opcache.jit_hot_side_exit 8 8
opcache.jit_max_exit_counters 8192 8192
opcache.jit_max_loop_unrolls 8 8
opcache.jit_max_polymorphic_calls 2 2
opcache.jit_max_recursive_calls 2 2
opcache.jit_max_recursive_returns 2 2
opcache.jit_max_root_traces 1024 1024
opcache.jit_max_side_traces 128 128
opcache.jit_max_trace_length 1024 1024
opcache.jit_prof_threshold 0.005 0.005
opcache.lockfile_path /tmp /tmp
opcache.log_verbosity_level 1 1
opcache.max_accelerated_files 10000 10000
opcache.max_file_size 0 0
opcache.max_wasted_percentage 5 5
opcache.memory_consumption 128 128
opcache.opt_debug_level 0 0
opcache.optimization_level 0x7FFEBFFF 0x7FFEBFFF
opcache.preferred_memory_model no value no value
opcache.preload no value no value
opcache.preload_user no value no value
opcache.protect_memory Off Off
opcache.record_warnings Off Off
opcache.restrict_api no value no value
opcache.revalidate_freq 2 2
opcache.revalidate_path Off Off
opcache.save_comments On On
opcache.use_cwd On On
opcache.validate_permission Off Off
opcache.validate_root Off Off
opcache.validate_timestamps On On
zip
Zip enabled
Zip version 1.22.6
Libzip version 1.11.4
BZIP2 compression Yes
XZ compression Yes
ZSTD compression Yes
AES-128 encryption Yes
AES-192 encryption Yes
AES-256 encryption Yes
zlib
ZLib Support enabled
Stream Wrapper compress.zlib://
Stream Filter zlib.inflate, zlib.deflate
Compiled Version 1.3.1
Linked Version 1.3.1
Directive Local Value Master Value
zlib.output_compression Off Off
zlib.output_compression_level -1 -1
zlib.output_handler no value no value
zstd
Zstd support enabled
Extension Version 0.14.0
Interface Version 1.5.7
APCu serializer ABI 0
Directive Local Value Master Value
zstd.output_compression Off Off
zstd.output_compression_dict no value no value
zstd.output_compression_level -1 -1
Additional Modules
Module Name
Environment
Variable Value
LANG C.UTF-8
PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NOTIFY_SOCKET /run/systemd/notify
HOME /var/www
LOGNAME www-data
USER www-data
INVOCATION_ID c5f5cedbf6a748e1b1148afd83e2cf6a
JOURNAL_STREAM 8:251088
SYSTEMD_EXEC_PID 36148
PHP Variables
Variable Value
$_COOKIE['wordpress_test_cookie'] WP Cookie check
$_COOKIE['wp_lang'] en_US
$_SERVER['USER'] www-data
$_SERVER['SYSTEMD_EXEC_PID'] 36148
$_SERVER['LANG'] C.UTF-8
$_SERVER['NOTIFY_SOCKET'] /run/systemd/notify
$_SERVER['INVOCATION_ID'] c5f5cedbf6a748e1b1148afd83e2cf6a
$_SERVER['JOURNAL_STREAM'] 8:251088
$_SERVER['GOTRACEBACK'] none
$_SERVER['PATH'] /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$_SERVER['HOME'] /var/www
$_SERVER['LOGNAME'] www-data
$_SERVER['REMOTE_ADDR']
$_SERVER['REMOTE_HOST']
$_SERVER['REMOTE_PORT'] 36669
$_SERVER['DOCUMENT_ROOT']
$_SERVER['PATH_INFO'] no value
$_SERVER['PHP_SELF'] /phpinfo.php
$_SERVER['DOCUMENT_URI'] /phpinfo.php
$_SERVER['SCRIPT_FILENAME']
$_SERVER['SCRIPT_NAME'] /phpinfo.php
$_SERVER['HTTPS'] on
$_SERVER['SSL_PROTOCOL'] TLSv1.3
$_SERVER['SSL_CIPHER'] TLS_AES_128_GCM_SHA256
$_SERVER['REQUEST_SCHEME'] https
$_SERVER['SERVER_NAME']
$_SERVER['SERVER_PORT'] 443
$_SERVER['CONTENT_LENGTH'] no value
$_SERVER['GATEWAY_INTERFACE'] CGI/1.1
$_SERVER['SERVER_PROTOCOL'] HTTP/3.0
$_SERVER['SERVER_SOFTWARE'] FrankenPHP
$_SERVER['HTTP_HOST']
$_SERVER['AUTH_TYPE'] no value
$_SERVER['REMOTE_IDENT'] no value
$_SERVER['REQUEST_URI'] /phpinfo.php
$_SERVER['CONTENT_TYPE'] no value
$_SERVER['QUERY_STRING'] no value
$_SERVER['REQUEST_METHOD'] GET
$_SERVER['HTTP_ACCEPT'] text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8
$_SERVER['HTTP_SEC_GPC'] 1
$_SERVER['HTTP_SEC_FETCH_DEST'] document
$_SERVER['HTTP_CACHE_CONTROL'] max-age=0
$_SERVER['HTTP_DNT'] 1
$_SERVER['HTTP_COOKIE'] wordpress_test_cookie=WP%20Cookie%20check; wp_lang=en_US
$_SERVER['HTTP_PRIORITY'] u=0, i
$_SERVER['HTTP_SEC_CH_UA_PLATFORM'] "Linux"
$_SERVER['HTTP_ACCEPT_LANGUAGE'] en-US,en;q=0.9
$_SERVER['HTTP_SEC_CH_UA'] "Not)A;Brand";v="8", "Chromium";v="138", "Brave";v="138"
$_SERVER['HTTP_SEC_CH_UA_MOBILE'] ?0
$_SERVER['HTTP_UPGRADE_INSECURE_REQUESTS'] 1
$_SERVER['HTTP_SEC_FETCH_SITE'] none
$_SERVER['HTTP_SEC_FETCH_MODE'] navigate
$_SERVER['HTTP_SEC_FETCH_USER'] ?1
$_SERVER['HTTP_ACCEPT_ENCODING'] gzip, deflate, br, zstd
$_SERVER['HTTP_USER_AGENT'] Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36
$_SERVER['REQUEST_TIME_FLOAT'] 1752082257.8643
$_SERVER['REQUEST_TIME'] 1752082257
PHP Credits
PHP Group
Thies C. Arntzen, Stig Bakken, Shane Caraveo, Andi Gutmans, Rasmus Lerdorf, Sam Ruby, Sascha Schumann, Zeev Suraski, Jim Winstead, Andrei Zmievski
Language Design & Concept
Andi Gutmans, Rasmus Lerdorf, Zeev Suraski, Marcus Boerger
PHP Authors
Contribution Authors
Zend Scripting Language Engine Andi Gutmans, Zeev Suraski, Stanislav Malyshev, Marcus Boerger, Dmitry Stogov, Xinchen Hui, Nikita Popov
Extension Module API Andi Gutmans, Zeev Suraski, Andrei Zmievski
UNIX Build and Modularization Stig Bakken, Sascha Schumann, Jani Taskinen, Peter Kokot
Windows Support Shane Caraveo, Zeev Suraski, Wez Furlong, Pierre-Alain Joye, Anatol Belski, Kalle Sommer Nielsen
Server API (SAPI) Abstraction Layer Andi Gutmans, Shane Caraveo, Zeev Suraski
Streams Abstraction Layer Wez Furlong, Sara Golemon
PHP Data Objects Layer Wez Furlong, Marcus Boerger, Sterling Hughes, George Schlossnagle, Ilia Alshanetsky
Output Handler Zeev Suraski, Thies C. Arntzen, Marcus Boerger, Michael Wallner
Consistent 64 bit support Anthony Ferrara, Anatol Belski
SAPI Modules
Contribution Authors
Apache 2 Handler Ian Holsman, Justin Erenkrantz (based on Apache 2 Filter code)
CGI / FastCGI Rasmus Lerdorf, Stig Bakken, Shane Caraveo, Dmitry Stogov
CLI Edin Kadribasic, Marcus Boerger, Johannes Schlueter, Moriyoshi Koizumi, Xinchen Hui
Embed Edin Kadribasic
FastCGI Process Manager Andrei Nigmatulin, dreamcat4, Antony Dovgal, Jerome Loyet
litespeed George Wang
phpdbg Felipe Pena, Joe Watkins, Bob Weinand
Module Authors
Module Authors
BC Math Andi Gutmans
Bzip2 Sterling Hughes
Calendar Shane Caraveo, Colin Viebrock, Hartmut Holzgraefe, Wez Furlong
COM and .Net Wez Furlong
ctype Hartmut Holzgraefe
cURL Sterling Hughes
Date/Time Support Derick Rethans
DB-LIB (MS SQL, Sybase) Wez Furlong, Frank M. Kromann, Adam Baratz
DBA Sascha Schumann, Marcus Boerger
DOM Christian Stocker, Rob Richards, Marcus Boerger, Niels Dossche
enchant Pierre-Alain Joye, Ilia Alshanetsky
EXIF Rasmus Lerdorf, Marcus Boerger
FFI Dmitry Stogov
fileinfo Ilia Alshanetsky, Pierre Alain Joye, Scott MacVicar, Derick Rethans, Anatol Belski
Firebird driver for PDO Ard Biesheuvel
FTP Stefan Esser, Andrew Skalski
GD imaging Rasmus Lerdorf, Stig Bakken, Jim Winstead, Jouni Ahto, Ilia Alshanetsky, Pierre-Alain Joye, Marcus Boerger, Mark Randall
GetText Alex Plotnick
GNU GMP support Stanislav Malyshev
Iconv Rui Hirokawa, Stig Bakken, Moriyoshi Koizumi
Input Filter Rasmus Lerdorf, Derick Rethans, Pierre-Alain Joye, Ilia Alshanetsky
Internationalization Ed Batutis, Vladimir Iordanov, Dmitry Lakhtyuk, Stanislav Malyshev, Vadim Savchuk, Kirti Velankar
JSON Jakub Zelenka, Omar Kilani, Scott MacVicar
LDAP Amitay Isaacs, Eric Warnke, Rasmus Lerdorf, Gerrit Thomson, Stig Venaas
LIBXML Christian Stocker, Rob Richards, Marcus Boerger, Wez Furlong, Shane Caraveo
Multibyte String Functions Tsukada Takuya, Rui Hirokawa
MySQL driver for PDO George Schlossnagle, Wez Furlong, Ilia Alshanetsky, Johannes Schlueter
MySQLi Zak Greant, Georg Richter, Andrey Hristov, Ulf Wendel
MySQLnd Andrey Hristov, Ulf Wendel, Georg Richter, Johannes SchlĂŒter
ODBC driver for PDO Wez Furlong
ODBC Stig Bakken, Andreas Karajannis, Frank M. Kromann, Daniel R. Kalowsky
Opcache Andi Gutmans, Zeev Suraski, Stanislav Malyshev, Dmitry Stogov, Xinchen Hui
OpenSSL Stig Venaas, Wez Furlong, Sascha Kettler, Scott MacVicar, Eliot Lear
pcntl Jason Greene, Arnaud Le Blanc
Perl Compatible Regexps Andrei Zmievski
PHP Archive Gregory Beaver, Marcus Boerger
PHP Data Objects Wez Furlong, Marcus Boerger, Sterling Hughes, George Schlossnagle, Ilia Alshanetsky
PHP hash Sara Golemon, Rasmus Lerdorf, Stefan Esser, Michael Wallner, Scott MacVicar
Posix Kristian Koehntopp
PostgreSQL driver for PDO Edin Kadribasic, Ilia Alshanetsky
PostgreSQL Jouni Ahto, Zeev Suraski, Yasuo Ohgaki, Chris Kings-Lynne
random Go Kudo, Tim DĂŒsterhus, Guilliam Xavier, Christoph M. Becker, Jakub Zelenka, Bob Weinand, MĂĄtĂ© Kocsis, and Original RNG implementators
Readline Thies C. Arntzen
Reflection Marcus Boerger, Timm Friebe, George Schlossnagle, Andrei Zmievski, Johannes Schlueter
Sessions Sascha Schumann, Andrei Zmievski
Shared Memory Operations Slava Poliakov, Ilia Alshanetsky
SimpleXML Sterling Hughes, Marcus Boerger, Rob Richards
SNMP Rasmus Lerdorf, Harrie Hazewinkel, Mike Jackson, Steven Lawrance, Johann Hanne, Boris Lytochkin
SOAP Brad Lafountain, Shane Caraveo, Dmitry Stogov
Sockets Chris Vandomelen, Sterling Hughes, Daniel Beulshausen, Jason Greene
Sodium Frank Denis
SPL Marcus Boerger, Etienne Kneuss
SQLite 3.x driver for PDO Wez Furlong
SQLite3 Scott MacVicar, Ilia Alshanetsky, Brad Dewar
System V Message based IPC Wez Furlong
System V Semaphores Tom May
System V Shared Memory Christian Cartus
tidy John Coggeshall, Ilia Alshanetsky
tokenizer Andrei Zmievski, Johannes Schlueter
XML Stig Bakken, Thies C. Arntzen, Sterling Hughes
XMLReader Rob Richards
XMLWriter Rob Richards, Pierre-Alain Joye
XSL Christian Stocker, Rob Richards
Zip Pierre-Alain Joye, Remi Collet
Zlib Rasmus Lerdorf, Stefan Roehrich, Zeev Suraski, Jade Nicoletti, Michael Wallner
PHP Documentation
Authors Mehdi Achour, Friedhelm Betz, Antony Dovgal, Nuno Lopes, Hannes Magnusson, Philip Olson, Georg Richter, Damien Seguy, Jakub Vrana, Adam Harvey
Editor Peter Cowburn
User Note Maintainers Daniel P. Brown, Thiago Henrique Pojda
Other Contributors Previously active authors, editors and other contributors are listed in the manual.
PHP Quality Assurance Team
Ilia Alshanetsky, Joerg Behrens, Antony Dovgal, Stefan Esser, Moriyoshi Koizumi, Magnus Maatta, Sebastian Nohn, Derick Rethans, Melvyn Sopacua, Pierre-Alain Joye, Dmitry Stogov, Felipe Pena, David Soria Parra, Stanislav Malyshev, Julien Pauli, Stephen Zarkos, Anatol Belski, Remi Collet, Ferenc Kovacs
Websites and Infrastructure team
PHP Websites Team Rasmus Lerdorf, Hannes Magnusson, Philip Olson, Lukas Kahwe Smith, Pierre-Alain Joye, Kalle Sommer Nielsen, Peter Cowburn, Adam Harvey, Ferenc Kovacs, Levi Morrison
Event Maintainers Damien Seguy, Daniel P. Brown
Network Infrastructure Daniel P. Brown
Windows Infrastructure Alex Schoenmaker
PHP License
This program is free software; you can redistribute it and/or modify it under the terms of the PHP License as published by the PHP Group and included in the distribution in the file: LICENSE
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
If you did not receive a copy of the PHP license, or have any questions about PHP licensing, please contact [email protected].
Relevant log output
Jul 08 21:32:06 wordpress frankenphp[30705]: zend_mm_heap corrupted
Jul 08 21:32:06 wordpress systemd[1]: frankenphp.service: Main process exited, code=killed, status=6/ABRT
Jul 08 21:32:06 wordpress systemd[1]: frankenphp.service: Failed with result 'signal'.
Jul 08 21:32:06 wordpress systemd[1]: frankenphp.service: Consumed 1h 16min 46.394s CPU time.
Can you also share the plugins that you are using or a small reproduction repo of how the wordpress site looks like?
To figure out if this is related to #1530, it would also help if there's some kind of monitoring on memory (if it increases over time).
It would be fairly time consuming to set up a reproduction repo with all six sites, so below is the list of plugins for each site. I also searched the code for calls to opcache_invalidate(). Wordpress has its own wp_opcache_invalidate which calls opcache_invalidate() behind the scenes. It looks like when updates are installed, it calls opcache_invalidate() on all the wordpress files which appears to be several hundred. Also the plugin W3 Total Cache uses opcache_invalidate(), but I think only when I manually clear the cache. In W3 Total Cache I have enabled APCu page caching and object caching, but I don't know if that has anything to do with it. My suspicion is that the core wordpress updates calling opcache_invalidate() on hundreds of files at a time might be the culprit.
Not sure if it helps, but I will also say I have a second server running the exact same environment (t4g.medium instance running Debian bookworm arm64 and using FrankenPHP 1.8.0 .deb install). This server is running my own custom code with no wordpress or any other framework, and it has not crashed. The code on this server does not make any calls to opcache_invalidate(). The server that is crashing is low traffic and probably averages less than 1 request per second combined across all the hosted sites.
admin@wordpress:/var/www/htdocs/hcsic$ find . -name '*.php' -print0 | xargs -0 grep 'opcache_invalidate'
./wp-content/plugins/w3-total-cache/SystemOpCache_Core.php: * function (e.g., `opcache_invalidate` or `apc_compile_file`). If the file
./wp-content/plugins/w3-total-cache/SystemOpCache_Core.php: if ( function_exists( 'opcache_invalidate' ) ) {
./wp-content/plugins/w3-total-cache/SystemOpCache_Core.php: return opcache_invalidate( $filename, true );
./wp-admin/includes/update-core.php: * `wp_opcache_invalidate()` only exists in WordPress 5.5 or later,
./wp-admin/includes/update-core.php: if ( function_exists( 'wp_opcache_invalidate' ) ) {
./wp-admin/includes/update-core.php: wp_opcache_invalidate( $versions_file );
./wp-admin/includes/update-core.php: * `wp_opcache_invalidate()` only exists in WordPress 5.5 or later,
./wp-admin/includes/update-core.php: if ( function_exists( 'wp_opcache_invalidate' ) ) {
./wp-admin/includes/update-core.php: wp_opcache_invalidate( $to . 'wp-includes/version.php' );
./wp-admin/includes/file.php: wp_opcache_invalidate( $real_file, true );
./wp-admin/includes/file.php: wp_opcache_invalidate( $real_file, true );
./wp-admin/includes/file.php: wp_opcache_invalidate( $to . $filename );
./wp-admin/includes/file.php: wp_opcache_invalidate_directory( $to );
./wp-admin/includes/file.php:function wp_opcache_invalidate( $filepath, $force = false ) {
./wp-admin/includes/file.php: * Check to see if WordPress is able to run `opcache_invalidate()` or not, and cache the value.
./wp-admin/includes/file.php: * `opcache.restrict_api` can specify the path for files allowed to call `opcache_invalidate()`.
./wp-admin/includes/file.php: && function_exists( 'opcache_invalidate' )
./wp-admin/includes/file.php: if ( apply_filters( 'wp_opcache_invalidate_file', true, $filepath ) ) {
./wp-admin/includes/file.php: return opcache_invalidate( $filepath, $force );
./wp-admin/includes/file.php: * @see wp_opcache_invalidate()
./wp-admin/includes/file.php:function wp_opcache_invalidate_directory( $dir ) {
./wp-admin/includes/file.php: '<code>wp_opcache_invalidate_directory()</code>'
./wp-admin/includes/file.php: wp_opcache_invalidate( $path . $name, true );
./wp-admin/includes/class-core-upgrader.php: wp_opcache_invalidate( ABSPATH . 'wp-admin/includes/update-core.php' );
Site #1 plugins:
- Akismet Anti-spam: Spam Protection Version 5.4 by Automattic - Anti-spam Team | Auto-updates enabled
- Contact Form 7 Version 6.1 by Takayuki Miyoshi | Auto-updates enabled
- MapPress Google Maps and Leaflet Maps Version 2.94.15 by Chris Richardson | Auto-updates enabled
- Monarch Plugin Version 1.4.14 by Elegant Themes | Auto-updates enabled
- Series Engine Version 2.8.8.3 by Eric Murrell (Volacious) | Auto-updates enabled
- Simple History Version 5.13.0 by PÀr Thernström | Auto-updates enabled
- UpdraftPlus - Backup/Restore Version 1.25.6 by TeamUpdraft, DavidAnderson | Auto-updates enabled
- User Agent Request Throttle Version 1.1 by Nadim Tuhin | Auto-updates disabled
- Video.js - HTML5 Video Player for WordPress Version 4.5.0 by Dustin Lammiman, Steve Heffernan | Auto-updates enabled
- W3 Total Cache Version 2.8.10 by BoldGrid | Auto-updates enabled
- Wordfence Security Version 8.0.5 by Wordfence | Auto-updates enabled
- WP Offload SES Lite Version 1.7.2 by Delicious Brains | Auto-updates enabled
- Yoast Duplicate Post Version 4.5 by Enrico Battocchi & Team Yoast | Auto-updates enabled
- Yoast SEO Version 25.4 by Team Yoast | Auto-updates enabled
Site #2 plugins:
- Akismet Anti-spam: Spam Protection Version 5.4 by Automattic - Anti-spam Team | Auto-updates enabled
- Classic Widgets Version 0.3 by WordPress Contributors | Auto-updates enabled
- Custom Sidebars Version 3.38 by WebFactory Ltd | Auto-updates enabled
- Jetpack Version 14.8 by Automattic | Auto-updates enabled
- Simple History Version 5.13.0 by PÀr Thernström | Auto-updates enabled
- UpdraftPlus - Backup/Restore Version 1.25.6 by TeamUpdraft, DavidAnderson | Auto-updates enabled
- User Agent Request Throttle Version 1.1 by Nadim Tuhin | Auto-updates disabled
- W3 Total Cache Version 2.8.10 by BoldGrid | Auto-updates enabled
- Wordfence Security Version 8.0.5 by Wordfence | Auto-updates enabled
- WP Offload SES Lite Version 1.7.2 by Delicious Brains | Auto-updates enabled
- Yoast SEO Version 25.4 by Team Yoast | Auto-updates enabled
Site #3 plugins:
- Akismet Anti-spam: Spam Protection Version 5.4 by Automattic - Anti-spam Team | Auto-updates enabled
- All-in-One WP Migration and Backup Version 7.96 by ServMask | Auto-updates enabled
- Page Builder by SiteOrigin Version 2.32.1 by SiteOrigin | Auto-updates enabled
- Private Google Calendars Version 20241103 by Michiel van Eerd | Auto-updates enabled
- Profile Builder Version 3.14.0 by Cozmoslabs | Auto-updates enabled
- Recent Posts Widget Extended Version 2.0.2 by Ga Satrya | Auto-updates enabled
- Redirection Version 5.5.2 by John Godley | Auto-updates enabled
- Simple History Version 5.13.0 by PÀr Thernström | Auto-updates enabled
- SiteOrigin CSS Version 1.6.4 by SiteOrigin | Auto-updates enabled
- SiteOrigin Widgets Bundle Version 1.69.1 by SiteOrigin | Auto-updates enabled
- Smart Slider 3 Version 3.5.1.28 by Nextend | Auto-updates enabled
- UpdraftPlus - Backup/Restore Version 1.25.6 by TeamUpdraft, DavidAnderson | Auto-updates enabled
- User Agent Request Throttle Version 1.1 by Nadim Tuhin | Auto-updates disabled
- W3 Total Cache Version 2.8.10 by BoldGrid | Auto-updates enabled
- Wordfence Security Version 8.0.5 by Wordfence | Auto-updates enabled
- WPCode Lite Version 2.2.9 by WPCode | Auto-updates enabled
- WP Offload SES Lite Version 1.7.2 by Delicious Brains | Auto-updates enabled
- Yoast SEO Version 25.4 by Team Yoast | Auto-updates enabled
Site #4 plugins:
- Advanced Editor Tools Version 5.9.2 by Automattic | Auto-updates enabled
- Akismet Anti-spam: Spam Protection Version 5.4 by Automattic - Anti-spam Team | Auto-updates enabled
- Classic Editor Version 1.6.7 by WordPress Contributors | Auto-updates enabled
- Page Builder by SiteOrigin Version 2.32.1 by SiteOrigin | Auto-updates enabled
- Simple History Version 5.13.0 by PÀr Thernström | Auto-updates enabled
- SiteOrigin CSS Version 1.6.4 by SiteOrigin | Auto-updates enabled
- SiteOrigin Widgets Bundle Version 1.69.1 by SiteOrigin | Auto-updates enabled
- Smart Slider 3 Version 3.5.1.28 by Nextend | Auto-updates enabled
- UpdraftPlus - Backup/Restore Version 1.25.6 by TeamUpdraft, DavidAnderson | Auto-updates enabled
- W3 Total Cache Version 2.8.10 by BoldGrid | Auto-updates enabled
- Wordfence Security Version 8.0.5 by Wordfence | Auto-updates enabled
- WPCode Lite Version 2.2.9 by WPCode | Auto-updates enabled
- WPForms Lite Version 1.9.6.2 by WPForms | Auto-updates enabled
- WP Offload SES Lite Version 1.7.2 by Delicious Brains | Auto-updates enabled
Site #5 plugins:
- Akismet Anti-spam: Spam Protection Version 5.4 by Automattic - Anti-spam Team | Auto-updates enabled
- Contact Form 7 Version 6.1 by Takayuki Miyoshi | Auto-updates enabled
- Contact Form CFDB7 Version 1.3.2 by Arshid | Auto-updates enabled
- Copy & Delete Posts Version 1.5.0 by Inisev | Auto-updates enabled
- Digital Signature For Contact Form 7 Version 1.0 | Auto-updates enabled
- Page Builder by SiteOrigin Version 2.32.1 by SiteOrigin | Auto-updates enabled
- Simple History Version 5.13.0 by PÀr Thernström | Auto-updates enabled
- SiteOrigin CSS Version 1.6.4 by SiteOrigin | Auto-updates enabled
- SiteOrigin Widgets Bundle Version 1.69.1 by SiteOrigin | Auto-updates enabled
- Smart Slider 3 Version 3.5.1.28 by Nextend | Auto-updates enabled
- UpdraftPlus - Backup/Restore Version 1.25.6 by TeamUpdraft, DavidAnderson | Auto-updates enabled
- W3 Total Cache Version 2.8.10 by BoldGrid | Auto-updates enabled
- Wordfence Security Version 8.0.5 by Wordfence | Auto-updates enabled
- WP Offload SES Lite Version 1.7.2 by Delicious Brains | Auto-updates enabled
Site #6 plugins:
- Akismet Anti-spam: Spam Protection Version 5.4 by Automattic - Anti-spam Team | Auto-updates enabled
- Simple History Version 5.13.0 by PÀr Thernström | Auto-updates enabled
I am currently doing memory monitoring and will compare memory usage after frankenphp startup vs after a few hours and report back.
I was able to crash FrankenPHP fairly quickly just by going to the wordpress admin dashboard updates page and clicking "Reinstall version 6.8.1" a few times. FrankenPHP crashed during the 4th or 5th reinstall.
Hmm yeah I imagine 'Reinstall version' does some kind of opcache flushing, I'll try to setup an actual wordpress installation and see if I can reproduce it.
@withinboredom I remember you mentioning using FrankenPHP with wordpress at some point, have you ever encountered something similar?
If this is a thread safety issue, as a workaround, maybe could we override opcache_invalidate() to add some locking mechanism?
have you ever encountered something similar?
No because I use docker images + composer for upgrades/installs/etc.
@dunglas this is not just a thread safety issue, it can also be an issue with FPM (see here).
So far it's just a guess, but this could be similar to #1530. The issue there was that accumulation of memory from opcache_invalidate would eventually force an opcache_reset. But under concurrency PHP can't always schedule that flush safely. Could also be something else though.
I guess it might be possible though to force all threads into a 'suspended' state on opcache_reset, similar to how we do it on worker restarts.
Came here as I tested running moodle using frankenphp and also faced zend_mm_heap corrupted.
Using frankenphp v1.9.0 binary release on M3/M4 Mac.
Can reliably reproduce by trying to run the moodle setup - script below can be used to do so repeatedly.
#!/bin/bash
echo zend.exception_ignore_args=true > php.ini
echo max_input_vars=6000 >> php.ini
docker run --rm -d --name moodlepg -ePOSTGRES_USER=moodle -ePOSTGRES_PASSWORD=moodle -p5432:5432 postgres:17.4
test -d moodle || git clone --depth=1 https://github.com/moodle/moodle.git
echo "Next, visit http://localhost and try setting up moodle using Postgres /w user/pass = moodle"
# Moodle setup crashes after confirming successful "server checks" page
# Sometimes, it will segfault without printing the `zend_mm_heap corrupted` message.
echo "When done: docker stop moodlepg"
cd moodle && env PHP_INI_SCAN_DIR=.. frankenphp php-server
After installation error has been triggerd once, it seems the error can be re-triggered by reloading http://localhost/public/admin/index.php?cache=0&agreelicense=1&confirmrelease=1&lang=en
Adding opcache.enable=false to php.ini completely solves/circumvents the issue.
Hope this helps to track the issue down - although not related to wordpress.
@schnoddelbotz yeah this is definitely connected to opcache_reset(), removing all references in the moodle code makes this not crash.
PHP actually exposes a function to hook into a reset, namely zend_accel_schedule_restart_hook. Might be possible to make a reset fully safe by forcing all threads into a restart when the hook is called.
I have the same issue with apps in Sylius, Drupal and others (using docker images)
I have the same issue on nextcloud when I update lot of apps.
I can reproduce it this way: There's a "bundle installation" button that can install 4/5 applications and then I got these messages :
2025-11-25T12:41:01.420428769+01:00 zend_mm_heap corrupted
2025-11-25T12:41:05.648781639+01:00 {"level":"info","ts":1764070865.648729,"msg":"maxprocs: Leaving GOMAXPROCS=16: CPU quota undefined"}
2025-11-25T12:41:05.648864867+01:00 {"level":"info","ts":1764070865.6488445,"msg":"GOMEMLIMIT is updated","package":"github.com/KimMachineGun/automemlimit/memlimit","GOMEMLIMIT":29412830822,"previous":9223372036854775807}
then caddy/frankenphp restart (but the bundle installation failed). And that only happen on kubernetes, not on docker only stack
If I install these apps manually (one after another) then it's not crashing.
expose_php=0
output_buffering=0
max_execution_time=3600
max_input_time=3600
upload_max_filesize=512M
memory_limit=2G
post_max_size=512M
apc.enable_cli=1
opcache.jit=1255
opcache.jit_buffer_size=8M
opcache.interned_strings_buffer=64
opcache.memory_consumption=1024
opcache.revalidate_freq=60
opcache.enable_cli=1
session.save_handler=redis
session.save_path="unix:///data/caddy/valkey-server.sock"
session.use_strict_mode=1
session.serialize_handler=igbinary
redis.session.compression=zstd
apc.serializer=igbinary
Using frankenphp 1.10 and php 8.4.15
Thanks for the reproducers, this is definitely a race condition with calling opcache_reset repeatedly and concurrently and might need a fix in php-src. I tried some stuff on our end, but was not successful to make it fully safe as of yet.
We are getting them, but for our Laravel services, not very often though, and it happens on a wide variety of url.path's, so don't think its something to do with specific application code.
Here is our base Dockerfile, could perhaps shed some light on the matter
# Dockerfile
ARG GOLANG_IMAGE_REF=unspecified
# renovate: datasource=github-releases depName=php/php-src registryUrl=https://github.com extractVersion=^php-(?<version>\d+\.\d+\.\d+)$
ARG PHP_VERSION=8.4.15
# renovate: datasource=github-releases depName=php/frankenphp registryUrl=https://github.com extractVersion=^v(?<version>\d+\.\d+\.\d+)$
ARG FRANKENPHP_VERSION=1.10.1
FROM composer:2.9.2 AS composer
FROM registry.cego.dk/cego/clockwork:6.4.3 AS clockwork
FROM caddy:2.10.2-builder AS xcaddy
FROM ${GOLANG_IMAGE_REF} AS golang
FROM dunglas/frankenphp:$FRANKENPHP_VERSION-builder-php$PHP_VERSION-bookworm AS frankenphp-builder
COPY --from=xcaddy /usr/bin/xcaddy /usr/local/bin/xcaddy
RUN rm -rf /usr/local/go
COPY --from=golang /usr/local/go /usr/local/go
# Add our request-logs module to caddy
COPY request-logs /tmp/request-logs
# https://frankenphp.dev/docs/docker/#how-to-install-more-caddy-modules
RUN set -eo pipefail && \
CGO_ENABLED=1 \
XCADDY_SETCAP=1 \
# Set versions in '-X'. https://github.com/dunglas/frankenphp/issues/1364 and https://github.com/dunglas/frankenphp/issues/1225
FRANKENPHP_VERSION="$(grep -E '^\sgithub.com/dunglas/frankenphp' caddy/go.mod |awk '{print $2}')" \
XCADDY_GO_BUILD_FLAGS="-ldflags='-w -s -X \"github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP ${FRANKENPHP_VERSION} PHP ${PHP_VERSION} Caddy\"' -tags=nobadger,nomysql,nopgx" \
CGO_CFLAGS=$(php-config --includes) \
CGO_LDFLAGS="$(php-config --ldflags) $(php-config --libs)" \
xcaddy build \
--output /usr/local/bin/frankenphp \
--with github.com/dunglas/frankenphp=./ \
--with github.com/dunglas/frankenphp/caddy=./caddy/ \
# Mercure and Vulcain are included in the official build.
--with github.com/dunglas/caddy-cbrotli \
--with github.com/dunglas/mercure/caddy \
--with github.com/dunglas/vulcain/caddy \
# Add extra Caddy modules here:
--with gitlab.cego.dk/cego/frankenphp/request-logs=/tmp/request-logs
FROM php:$PHP_VERSION-zts-bookworm AS php-setup
# renovate: datasource=github-releases depName=edenhill/librdkafka registryUrl=https://github.com extractVersion=^v(?<version>\d+\.\d+\.\d+)$
ARG LIBRDKAFKA_VERSION="2.12.1"
# renovate: datasource=github-releases depName=arnaud-lb/php-rdkafka registryUrl=https://github.com extractVersion=^(?<version>\d+\.\d+\.\d+)$
ARG RDKAFKA_PECL_VERSION="6.0.5"
# renovate: datasource=github-tags depName=xdebug/xdebug registryUrl=https://github.com extractVersion=^(?<version>\d+\.\d+\.\d+)$
ARG XDEBUG_PECL_VERSION="3.4.7"
# renovate: datasource=github-tags depName=krakjoe/apcu registryUrl=https://github.com extractVersion=^v(?<version>\d+\.\d+\.\d+)$
ARG APCU_PECL_VERSION="5.1.27"
# renovate: datasource=github-releases depName=open-telemetry/opentelemetry-php-instrumentation registryUrl=https://github.com extractVersion=^(?<version>\d+\.\d+\.\d+)$
ARG OTEL_VERSION="1.2.1"
# renovate: datasource=github-tags depName=php/pecl-file_formats-yaml registryUrl=https://github.com extractVersion=^(?<version>\d+\.\d+\.\d+)$
ARG YAML_PECL_VERSION="2.3.0"
# https://pecl.php.net/package/protobuf
ARG PROTOBUF_PECL_VERSION="4.33.1"
RUN <<EOF
set -e
# Install OS packages and build dependencies
builddeps="$PHPIZE_DEPS perl libpng-dev libpq-dev libyaml-dev zlib1g-dev libgmp-dev libzip-dev libxml2-dev zlib1g-dev libssl-dev libsasl2-dev libzstd-dev libcurl4-openssl-dev"
apt-get update
apt-get --no-install-recommends -qqy install dumb-init libyaml-0-2 wkhtmltopdf libzip4 mailcap libcap2-bin libpq5 git gnupg curl unzip sqlite3 node-chokidar $builddeps
# Install libkafka
curl -fsSLO https://github.com/edenhill/librdkafka/archive/v${LIBRDKAFKA_VERSION}.tar.gz
tar -xzf v${LIBRDKAFKA_VERSION}.tar.gz
(cd librdkafka-${LIBRDKAFKA_VERSION} && ./configure && make && make install)
rm -rf v${LIBRDKAFKA_VERSION}.tar.gz librdkafka-${LIBRDKAFKA_VERSION}
# Install php extensions
docker-php-ext-install pdo pdo_mysql pdo_pgsql gmp opcache gd bcmath soap intl zip pcntl gettext exif
pecl install xdebug-${XDEBUG_PECL_VERSION}
pecl install rdkafka-${RDKAFKA_PECL_VERSION}
pecl install apcu-${APCU_PECL_VERSION}
pecl install opentelemetry-${OTEL_VERSION}
pecl install yaml-${YAML_PECL_VERSION}
pecl install protobuf-${PROTOBUF_PECL_VERSION}
docker-php-ext-enable rdkafka xdebug apcu opentelemetry yaml protobuf
# Cleanup buildeps and apt-get
apt-get purge --auto-remove -y $builddeps
apt-get clean
rm -rf /var/lib/apt/lists/*
EOF
# Since official php debian images insist on having gcc and other dev tools in them, we remove them in php-setup stage and copy / to scratch
# https://github.com/docker-library/php/pull/438#issuecomment-353695749
FROM scratch AS main
ENV PHP_INI_DIR=/usr/local/etc/php
# Copy php + pecl extension debian build
COPY --link --from=php-setup / /
# Copy frankenphp caddy build
COPY --link --from=frankenphp-builder /usr/local/bin/frankenphp /usr/local/bin/frankenphp
# Copy watcher shared library
COPY --from=frankenphp-builder /usr/local/lib/libwatcher* /usr/local/lib/
# fix for the file watcher on arm
RUN apt-get install -y --no-install-recommends libstdc++6 && \
apt-get clean && \
ldconfig
# Copy php composer
COPY --link --from=composer /usr/bin/composer /usr/bin/composer
# Copy clockwork (cron-daemon)
COPY --link --from=clockwork /usr/local/bin/clockwork /usr/local/bin/clockwork
# Copy configs and scripts
COPY --link entrypoint.sh /usr/local/bin/entrypoint.sh
COPY --link default.Caddyfile /etc/caddy/Caddyfile
COPY --chown=www-data:www-data --chmod=644 php.ini $PHP_INI_DIR/conf.d/php.ini
# Setup envs needed by frankenphp caddy, composer, nodejs and laravel
ENV XDG_CONFIG_HOME=/config
ENV XDG_DATA_HOME=/data
ENV COMPOSER_HOME=/tmp/
ENV NODE_PATH=/usr/lib/node_modules
ENV LARAVEL_STORAGE_PATH=/tmp/storage
# Copy storage structure, and make it writable by www-data
COPY --chown=www-data:www-data storage/ /tmp/storage/
# Generate needed folders, and make sure www-data user owns them
WORKDIR /var/www/html
RUN chown -R www-data:www-data /var/www && \
mkdir -p /config/caddy /data/caddy /etc/caddy && \
chown -R www-data:www-data /data/caddy /config/caddy && \
chmod -R go+rw /tmp/storage
USER www-data
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
#!/usr/bin/env bash
set -eo pipefail
# entrypoint.sh
apply_bash_prompt() {
mkdir -p "$HOME" && \
printf "PS1='%s'\n" "\[\e[0;1;2;32m\]php-shell:\[\e[0;95m\]\w\[\e[0m\]$ \[\e[0m\]" >> "$HOME/.bashrc"
}
enable_opcache_file_cache () {
echo "{\"log.level\":\"DEBUG\",\"message\":\"Enabling opcache.file_cache\"}"
mkdir -p /tmp/php-opcache_file_cache
if ! grep -q '^opcache\.file_cache' "$PHP_INI_DIR/conf.d/php.ini"; then
echo "opcache.file_cache=/tmp/php-opcache_file_cache" >> "$PHP_INI_DIR/conf.d/php.ini"
fi
if ! grep -q '^opcache\.file_cache_only' "$PHP_INI_DIR/conf.d/php.ini"; then
echo "opcache.file_cache_only=1" >> "$PHP_INI_DIR/conf.d/php.ini"
fi
}
make_config_cache () {
local configExitCode=0 routeExitCode=0
if [ -f "artisan" ] && [ "$APP_DEBUG" = "false" ]; then
# allow this call to fail, as it is not critical
php artisan config:cache || configExitCode=$?
echo "{\"log.level\":\"DEBUG\",\"message\":\"php artisan config:cache completed with exit code ${configExitCode}\"}"
php artisan route:cache || routeExitCode=$?
echo "{\"log.level\":\"DEBUG\",\"message\":\"php artisan route:cache completed with exit code ${routeExitCode}\"}"
fi
}
if [[ "${XDEBUG_MODE:-}" = *debug* ]] && [[ "${PHP_OPCACHE_JIT:-}" != disable ]]; then
# We don't want to see: PHP Warning: JIT is incompatible with third party extensions that override zend_execute_ex(). JIT disabled. in Unknown on line 0
export PHP_OPCACHE_JIT=disable
echo "PHP_OPCACHE_JIT=${PHP_OPCACHE_JIT} because XDEBUG_MODE ('${XDEBUG_MODE}') contains 'debug'"
fi
make_config_cache
# If the env variable ENTRYPOINT_PREWARM_SCRIPT is set, run it
if [ -n "$ENTRYPOINT_PREWARM_SCRIPT" ]; then
echo "{\"log.level\":\"DEBUG\",\"message\":\"Running pre-warm script\"}"
eval "$ENTRYPOINT_PREWARM_SCRIPT"
echo "{\"log.level\":\"DEBUG\",\"message\":\"Pre-warm script completed\"}"
fi
echo "{\"log.level\":\"DEBUG\",\"message\":\"Startup CMD is $*\"}"
clockwork_regex="^clockwork"
queue_listen_regex="^php artisan queue:listen"
schedule_work_regex="^php artisan schedule:work"
if [[ "$1" = "octane" ]]; then
shift # Ignore the 1st argument 'octane'
set -- php artisan octane:frankenphp --log-level=info --admin-host=0.0.0.0 --admin-port=2000 --host=0.0.0.0 --port=80 --max-requests=5000 --caddyfile=/etc/caddy/Caddyfile "${@}"
elif [[ "$*" =~ $clockwork_regex || "$*" =~ $queue_listen_regex || "$*" =~ $schedule_work_regex ]]; then
enable_opcache_file_cache
set -- dumb-init -- "$@"
elif [[ -n "$1" ]]; then
apply_bash_prompt
set -- "$@"
fi
exec "$@"
@firecow this is almost always an issue with something in C corrupting memory due to doing something non-thread-safe (or something else, but that's the most common one). In the issue prior, this was due to calling opcache_reset(). It can also be due to an extension, a bug in php, or somewhere else. Do you have any way to reproduce it reliably?
For the opcache_reset() problem, couldn't we replace the original function by a new one wrapping it around a global lock that pauses all incoming requests?
This should prevent the issue IIUC the issue.
@dunglas it would have to halt all PHP processing in-general. There's no locks around opcache reads (there are on writes though), so the proper fix is to add rw-locks to php-src (which got a strange amount of resistance) or work around it by draining workers, stopping them, resetting opcache, and then restarting them.
Maybe could we wait for all current PHP requests to finish, flush the cache, then unblock buffered requests.
This is not really optimal, but at least it will prevent the crash.
And hang the server until it's done đ€Ș
I also had a quick look and wordpress seems to make use of several MT-unsafe functions like strtok, setlocale, getenv/putenv and others. opcache_reset seems to only be called on an explicit clear cache button press.
https://github.com/php/php-src/pull/14803 here's an open pull request somewhat related to it, but funny enough it seems like the slowing down part of the fix/workaround is not acceptable in php-src.
I also had a quick look and wordpress seems to make use of several MT-unsafe functions like strtok, setlocale, getenv/putenv and others. opcache_reset seems to only be called on an explicit clear cache button press.
We already overwrite putenv and getenv to make them safe. Are strtok and setlocale really unsafe? From quickly testing they seem fine under high concurrency.
Maybe could we wait for all current PHP requests to finish, flush the cache, then unblock buffered requests.
I tried something similar, the issue was that an opcache_reset can also be triggered for other reasons, like memory filling up due to many calls to opcache_invalidate(). But it might be a good intermediary solution.
And hang the server until it's done đ€Ș
IMO hanging the server shouldn't be an issue as you should not call opcache_reset() on a super-busy production server anyways.
I also had a quick look and wordpress seems to make use of several MT-unsafe functions like strtok, setlocale, getenv/putenv and others. opcache_reset seems to only be called on an explicit clear cache button press.
We already overwrite
putenvandgetenvto make them safe. Arestrtokandsetlocalereally unsafe? From quickly testing they seem fine under high concurrency.
Yes, they are MT-unsafe in libc under linux and macos (not under windows). Chances are rather low to crash as they're extremely quick, but it can happen.
I have an open PR in php to make setlocale thread safe and maintainers seem to consider it a bug fix, so we might not have to do anything about it with 8.2 still in the support window.
And hang the server until it's done đ€Ș
IMO hanging the server shouldn't be an issue as you should not call
opcache_reset()on a super-busy production server anyways.
Yeah, but in that optimal scenario it wouldn't crash either way. Of course it's better to hang a bit than crash & restart, though, especially for api or non browser activity that won't automatically reconnect.
Sorry, if this is totally stupid, but is there a way to "segment" the opcache for workers?
If an opcache_reset is triggered the workers are notified there's a new SHM address, they finish their current request, if any, and all subsequent requests use the "new" opcache. The remaining problem I see in this scenario (sorry again if this is unqualified nonsense) is cache stampede, but this would currently be a problem for any cold server too, right?
In the bigger projects I was running opcache never needed a lot of memory, so even with a lot of workers I can't see almost double the requirement (at worst with a lot of hot workers) being a problem.
Sorry, if this is totally stupid, but is there a way to "segment" the opcache for workers?
Not without a change how opcache and its shared memory are implemented in php-src.
Just to add my experience from the zend_mm_heap corrupted message today... I know nothing about Zend internals, but Claude.ai seems to know everything and it diagnosed that my issue was that I was using PHP built in Redis (which is well known to not be thread safe) while using frankenphp worker mode. I let claude recommend, and it suggested to use Predis PHP Library instead, (milliseconds slower as not "built in" but perfectly acceptable) and this RESOLVED all my zend_mm_heap corrupted issues and I have not had a single issue since.
but Claude.ai seems to know everything
Claude.ai doesn't "know" anything.
it diagnosed that my issue was that I was using PHP built in Redis (which is well known to not be thread safe) while using frankenphp worker mode
It is? Sounds like hallucination to me, especially considering that I've been using FrankenPHP and redis in production for half a year. The extension lists thread safety as supported, too.
I let claude recommend, and it suggested to use Predis PHP Library instead, (milliseconds slower as not "built in" but perfectly acceptable) and this RESOLVED all my zend_mm_heap corrupted issues and I have not had a single issue since.
I have no reasonable explanation for that.
Like I said, I was just sharing my "experience" today, and "I know nothing"
I believe what claude is finding is this reference, the same as the google search AI shows above search results: https://github.com/phpredis/phpredis/issues/2029
PhpRedis does support running under ZTS mode, but not sharing a single Redis object between multiple concurrently running threads.
But then who knows...
I have no reasonable explanation for that.
Nor do I, but as soon as symfony sessions (in this new project) were moved to Predis, and all interactions with redis refactored to be through predis, I have not had a single zend_mm_heap corrupted message in the logs... no idea.
The other things it proposed doing instead of Predis was to set a env var USE_ZEND_ALLOC=0 for whatever reasons, but I ignored that and went for Predis.
I've been using FrankenPHP and redis in production for half a year.
So have I, the whole mySites.guru service runs bleeding edge versions upgraded within an hour of PHP and frankenphp releases as dunglas knows, accross multiple servers and services. That project uses Predis and dockerized images for frankenphp. Never had a single zend_mm_heap corrupted in production ever.
ok @henderkes of course you were right, back to zend_mm_heap with worker mode ... no idea why it settled down for a while after the Predis refactor, but it never solved it like I thought... oh well. Switching off worker mode again until someone with skills can find a cure for numpties like me.