Open MarkusJLechner opened 1 month ago
GitHub told me, that the body is too long
Interesting. Thanks for the report.
Do you use any extra PHP extension?
Would it be possible to access the project to try to reproduce and debug?
extensions are rather default, no caddy extensions or others.
RUN install-php-extensions \
pcntl \
opcache \
pdo_mysql \
redis \
intl \
soap \
exif \
gd \
zip \
bcmath
RUN pecl install xdebug-3.3.0alpha3 \
&& docker-php-ext-enable xdebug
Due to the confidentiality of our project, I cannot grant access. However, I can help in providing most of the information needed. I understand that reducing to a minimal reproduction repository is preferred, but the project size makes this hard to accomplish.
A minimal reproducer would indeed be even better :)
Is pcntl compatible with threading/frankenphp? Forking a thread can create all kinds of problems and pcntl hooks into some of those primitives, even if you aren't using it and can break mutex's and semaphores.
Good catch for pnctl. Even if the fork
feature isn't used, there is a known bug that I fixed but that isn't tagged: https://github.com/php/php-src/pull/14499
Is your crash occurring when you upload files @MarkusJLechner?
We have file upload tests covered by the E2E, but I don't think this is the issue because the crash happens shortly after the 4 E2E workers register an account, way before they are able to upload files.
However, I'll try a file upload manually to confirm this and provide an update.
Strange, with the debug build, I can render the initial page. However, when navigating to the next page, I get the segmentation fault I posted about earlier. Without the debug build, I can upload images, navigate around, and run E2E tests, but the segmentation fault happens randomly. Without the debug build and gdb, it's hard to post the stack trace. It's a bit of a pinch situation.
Can you try removing pcntl? Looking at the segfault, that is the most likely culprit. IIRC, pcntl registers some non-threadsafe signal handlers and that is where the sigfault is occurring (you get similar issues if you use pcntl along with the parallel extension, FWIW). Threading and forking are two very different paradigms that don't play nice together.
I removed pcntl
from the container and tried again. Navigating manually didn't trigger the error (I didn't test extensively, but I registered an account normally, and it worked). However, as soon as I start the E2E with parallel requests, the fault occurs.
Are these e2e tests running with xdebug? If so, maybe try without? Could also be an xdebug bug, especially since I notice you running with an alpha build?
I disabled Xdebug, but the same error persists. With the debug build of FrankenPHP, it is possible to trigger the error with fewer concurrent connections, meaning I can trigger it normally when navigating the page. Without the debug build, it is extremely rare to trigger it.
I have no idea if this is related to the problem, but for some reason, reading an environment variable with getenv
results in the value false
instead of the defined string in the env file. There are various issues related to thread safety.
Because I think we can only solve the problem with a minimal reproducer, which I cannot provide, I think we can close this issue as I need to proceed with alternatives.
reading an environment variable with getenv results in the value false instead of the defined string in the env file.
This is likely a bug in your application as env files need to be added to the environment, there is nothing in fpm/apache/frankenphp to do that for you. Env files are purely an application concern.
updateServerContext
Looks like there may be a race condition here, somewhere, causing a segfault. Memory shouldn't be shared between workers, but there must be an accidental pointer being shared somewhere. Can you share one of the HTTP requests (not response) that you are making, including all headers? Are you using basic-auth?
We use PHP sessions instead of Laravel session management because of the legacy project origin, not basic auth. Additionally, headers and environment handling do not reflect the production environment. We use PHP dotenv locally (Dotenv\Dotenv::createUnsafeImmutable), which caught my attention because the previous Apache PHP container did not encounter this error during e2e tests.
Example request headers:
GET /new HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: de-AT,de;q=0.9,ja-AT;q=0.8,ja;q=0.7,de-DE;q=0.6,en-US;q=0.5,en;q=0.4,pl;q=0.3,cs;q=0.2,fr;q=0.1
Cache-Control: no-cache
Connection: keep-alive
Cookie: locale=de_AT; PHPSESSID=c078204adeb7289ea100da8c12345678
Host: localhost:10000
Pragma: no-cache
Referer: http://localhost:10000/intern/dashboard
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
sec-ch-ua: "Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Linux"
I tried to create a minimal repo with just Laravel installed, along with some custom Caddyfile and Dockerfile filled with some todos.
https://github.com/MarkusJLechner/caddy-sigfault
Running sail up --build
(after composer install) and then using the siege command (see README) will lead to a segmentation fault. Setting up an alternative to siege would be difficult. I don't know if siege would cause segmentation faults on all vanilla servers. E2E setup would be difficult.
Thanks for the reproducer @MarkusJLechner! I'll take a gander.
Just playing around with the dockerfile, it appears to be a bug with the version of xdebug you are using.
Subject: [PATCH] Use stable version of xdebug
---
Index: Dockerfile
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/Dockerfile b/Dockerfile
--- a/Dockerfile (revision 3d0f022eca8596951a538c43de9b111d82cfcf60)
+++ b/Dockerfile (date 1721158264125)
@@ -106,9 +106,11 @@
#RUN apt-get update && apt-get install -y gdb
# Install and configure xdebug. Do not copy to conf.d, as it should be enabled/disabled by the user using entrypoint and env XDEBUG_ENABLED
-RUN pecl install xdebug-3.3.0alpha3 \
- && docker-php-ext-enable xdebug
-COPY --chown=${USER_ID}:${GROUP_ID} ./docker/webserver/xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
+#RUN pecl install xdebug-3.3.0alpha3 \
+# && docker-php-ext-enable xdebug
+
+RUN install-php-extensions xdebug
+COPY --link --chown=${USER_ID}:${GROUP_ID} ./docker/webserver/xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN chown -R ${USER_ID}:${GROUP_ID} /usr/local/etc/php/conf.d/
# wget necessary for entrypoint mysql wait
This is all that was required to get it working. It might be worth filing a bug with xdebug if you haven't already.
Going to close this as it doesn't seem related to FrankenPHP, but most likely an issue with XDebug and thread-safe PHP.
I forgot to remove that from the Dockerfile. Sorry for the false positive. Removing xdebug results in the same issue (see comment). Commit removing xdebug (accidentally removed README content, can be ignored).
I think the crash might be related to opcache, at least I don't see it happening after removing the extension. It's also possible that the crash doesn't happen since without it there are less requests overall. (maybe related?)
I'm not using Laravel (CakePHP is my preferred dessert) but I run into the same issue when slapping k6
at it.
Here's what I've found after some testing:
opcache
enabled, it doesn't make it very far.opcache
extension as @AlliBalliBaba mentioned, does allow it to stay up and running (albeit with a significant performance penalty).opcache
enabled but with jit
disabled (opcache.jit=off
), seems to allow for "light loads".opcache
enabled, jit
disabled and the container limited to 1 cpu
(also reflected in the logs as num_threads=1
), keeps it completely stable (not a single request out of 15.5K failed).
opcache
enabled and jit
enabled with container limited to 1 cpu
, also keeps it completely stable.opcache
+ jit
with 2 cpus
(and num_threads=2
in the logs), results in a crash.I hope this information will be of any value.
I also tried removing opcache, and the error disappeared. However, the passthrough is much slower, meaning the server does not handle as many requests in a row.
Without opcache, I could run a siege without a segmentation fault.
I tried running our application without opcache, which also worked (besides being slower). However, when running with frankenphp, I always encounter the error that the environment is not loaded properly. This does fine with our Apache build under higher loads. This suggests it is an application issue, but just changing the server without changing the application code leads to this. It might be an issue with vlucas/phpdotenv when running frankenphp.
Interestingly I also am not seeing any crash after running php artisan config:cache
. So maybe it is indeed caused by multiple threads trying to read linux environment variables simultaneously via Laravel's env(...)
in the config files.
It might be an issue with vlucas/phpdotenv when running frankenphp.
That would likely mean it's an issue with reading environment variables in general as I do not use that package but also run into crashes.
CakePHP's env()
function is (mostly) just an alias for PHP's built-in getenv()
.
Did some more testing against some other project that pretty much just calls getenv()
and does some queries via PDO.
It runs mostly fine (occasional Error 500
which honestly might just be the database struggling) with multiple threads, under high-load with opcache and JIT.
According to the docs of phpdotenv:
Putenv and Getenv
Using getenv() and putenv() is strongly discouraged due to the fact that these functions are not thread safe, however it is still possible to instruct PHP dotenv to use these functions. Instead of calling Dotenv::createImmutable, one can call Dotenv::createUnsafeImmutable, which will add the PutenvAdapter behind the scenes. Your environment variables will now be available using the getenv method, as well as the super-globalsw
FrankenPHP massively uses threads, it's required to use thread-safe functions. Basically, use $_SERVER
instead of putenv()
.
We had two instances in the code where putenv
was used. Additionally, Dotenv::createUnsafeImmutable
and getenv
were used locally. I replaced them with $_SERVER
and now load the .env
file directly with Docker Compose. The segmentation fault issue seems to be resolved. I haven't tested extensively to be 100% sure the error is gone. However, I successfully ran Siege and 3 E2Es, which are looking promising.
Since putenv
and getenv
are native PHP features, I strongly recommend mentioning them in the FrankenPHP documentation. Also, as noted in this comment, Laravel also encounters issues if the configuration is not cached. Given Laravel's significance in the PHP ecosystem, this should also be included in the documentation.
In retrospect, can the updateServerContext
error be triggered by this application-level code?
Indeed we should mention this in the documentation and update Laravel to not use putenv()
by default (which will cause issues with any ZTS build of PHP, not only with FrankenPHP).
I'm currently on vacation, but I'll do it when I get back if no one has taken the initiative :)
Hi guys,
I believe I'm experimenting the same issue here running Laravel and Octane with a few condiments:
recv() failed (104: Connection reset by peer) while reading response header from upstream
connect() failed (111: Connection refused) while connecting to upstream
upstream prematurely closed connection while reading response header from upstream
--- SIGURG {si_signo=SIGURG, si_code=SI_TKILL, si_pid=2268436, si_uid=1001} ---
rt_sigreturn({mask=[]}) = 0
futex(0xc000083948, FUTEX_WAKE_PRIVATE, 1) = 1
futex(0x72cc92dea8c0, FUTEX_WAIT_PRIVATE, 0, NULL) = -1 EAGAIN (Resource temporarily unavailable)
futex(0x72cc92dea8c0, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
futex(0x72cc92dea8c0, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
write(30, "HTTP/1.1 204 No Content\r\nAccess-"..., 515) = 515
epoll_ctl(7, EPOLL_CTL_DEL, 30, 0xc0005f3914) = 0
close(30) = 0
futex(0x72cc92dea8c0, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
write(9, "\0", 1) = 1
futex(0x72cc92dea8c0, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
epoll_pwait(7, [], 128, 0, NULL, 0) = 0
nanosleep({tv_sec=0, tv_nsec=3000}, NULL) = 0
read(31, 0xc0007c2b51, 1) = -1 EAGAIN (Resource temporarily unavailable)
epoll_pwait(7, [], 128, 0, NULL, 0) = 0
read(30, "OPTIONS /api/bookings?page=1&per"..., 4096) = 751
openat(AT_FDCWD, "/home/forge/testapi.domain/public/api/bookings/frankenphp-worker.php", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/forge/testapi.domain/public/api/bookings", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/forge/testapi.domain/public/api/bookings/frankenphp-worker.php", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/forge/testapi.domain/public/frankenphp-worker.php", O_RDONLY|O_CLOEXEC) = 35
futex(0x72cc92ded600, FUTEX_WAKE_PRIVATE, 1) = 1
futex(0x72cc92ded518, FUTEX_WAKE_PRIVATE, 1) = 1
fcntl(35, F_GETFL) = 0x8000 (flags O_RDONLY|O_LARGEFILE)
fcntl(35, F_SETFL, O_RDONLY|O_NONBLOCK|O_LARGEFILE) = 0
epoll_ctl(7, EPOLL_CTL_ADD, 35, {events=EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, data={u32=2809659395, u64=8272148160692355075}}) = -1 EPERM (Operation not permitted)
fcntl(35, F_GETFL) = 0x8800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE)
fcntl(35, F_SETFL, O_RDONLY|O_LARGEFILE) = 0
fstat(35, {st_mode=S_IFREG|0664, st_size=78, ...}) = 0
close(35) = 0
openat(AT_FDCWD, "/home/forge/testapi.domain/public/frankenphp-worker.php", O_RDONLY|O_CLOEXEC) = 35
fcntl(35, F_GETFL) = 0x8000 (flags O_RDONLY|O_LARGEFILE)
fcntl(35, F_SETFL, O_RDONLY|O_NONBLOCK|O_LARGEFILE) = 0
epoll_ctl(7, EPOLL_CTL_ADD, 35, {events=EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, data={u32=2809659396, u64=8272148160692355076}}) = -1 EPERM (Operation not permitted)
fcntl(35, F_GETFL) = 0x8800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE)
fcntl(35, F_SETFL, O_RDONLY|O_LARGEFILE) = 0
fstat(35, {st_mode=S_IFREG|0664, st_size=78, ...}) = 0
close(35) = 0
newfstatat(AT_FDCWD, "/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(AT_FDCWD, "/home/forge", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(AT_FDCWD, "/home/forge/testapi.domain", {st_mode=S_IFDIR|0775, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(AT_FDCWD, "/home/forge/testapi.domain/public", {st_mode=S_IFDIR|0775, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
futex(0x72cc92dea8c0, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
futex(0xc0007d1948, FUTEX_WAKE_PRIVATE, 1) = 1
futex(0x72cc92dea8c0, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
futex(0x72cc92dea8c0, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
write(21, "HTTP/1.1 204 No Content\r\nAccess-"..., 515) = 515
futex(0xc000727948, FUTEX_WAKE_PRIVATE, 1) = 1
epoll_ctl(7, EPOLL_CTL_DEL, 21, 0xc0005f7914) = 0
close(21) = 0
futex(0x72cc92dea8c0, FUTEX_WAIT_PRIVATE, 0, NULL) = ?
+++ killed by SIGSEGV (core dumped) ++
wait4(2268436, 0x7ffe415c2654, WNOHANG|WSTOPPED, NULL) = 0
pselect6(11, [8 10], [], [], {tv_sec=0, tv_nsec=0}, NULL) = 2 (in [8 10], left {tv_sec=0, tv_nsec=0})
read(8, "", 8192) = 0
close(8) = 0
read(10, "", 8192) = 0
close(10) = 0
wait4(2268436, 0x7ffe415c2654, WNOHANG|WSTOPPED, NULL) = 0
wait4(2268436, 0x7ffe415c2654, WNOHANG|WSTOPPED, NULL) = 0
clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=0, tv_nsec=10000000}, NULL) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=2268436, si_uid=1001, si_status=SIGSEGV, si_utime=185, si_stime=30} ---
restart_syscall(<... resuming interrupted clock_nanosleep ...>) = 0
wait4(2268436, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGSEGV && WCOREDUMP(s)}], WNOHANG|WSTOPPED, NULL) = 2268436
wait4(2268436, 0x7ffe415c2604, 0, NULL) = -1 ECHILD (No child processes)
newfstatat(AT_FDCWD, "/home/forge/testapi.domain/vendor/composer/../symfony/console/Output/NullOutput.php", {st_mode=S_IFREG|0664, st_size=2083, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(AT_FDCWD, "/home/forge/testapi.domain/vendor/composer/../symfony/console/Output", {st_mode=S_IFDIR|0775, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(AT_FDCWD, "/home/forge/testapi.domain/vendor/composer/../symfony/console", {st_mode=S_IFDIR|0775, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(AT_FDCWD, "/home/forge/testapi.domain/vendor/composer/../symfony", {st_mode=S_IFDIR|0775, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(AT_FDCWD, "/home/forge/testapi.domain/vendor/composer", {st_mode=S_IFDIR|0775, st_size=12288, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(AT_FDCWD, "/home/forge/testapi.domain/vendor", {st_mode=S_IFDIR|0775, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(AT_FDCWD, "/home/forge/testapi.domain", {st_mode=S_IFDIR|0775, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(AT_FDCWD, "/home/forge", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(AT_FDCWD, "/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
openat(AT_FDCWD, "/home/forge/testapi.domain/vendor/symfony/console/Output/NullOutput.php", O_RDONLY) = 6
newfstatat(6, "", {st_mode=S_IFREG|0664, st_size=2083, ...}, AT_EMPTY_PATH) = 0
read(6, "<?php\n\n/*\n * This file is part o"..., 2083) = 2083
close(6)
.
.
.
.
newfstatat(AT_FDCWD, "/home/forge/testapi.domain/vendor/composer/../laravel/telescope/src/Storage/DatabaseEntriesRepository.php", {st_mode=S_IFREG|0664, st_size=11675, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(AT_FDCWD, "/home/forge/testapi.domain/vendor/composer/../laravel/telescope/src/Storage", {st_mode=S_IFDIR|0775, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
openat(AT_FDCWD, "/home/forge/testapi.domain/vendor/laravel/telescope/src/Storage/DatabaseEntriesRepository.php", O_RDONLY) = 6
newfstatat(6, "", {st_mode=S_IFREG|0664, st_size=11675, ...}, AT_EMPTY_PATH) = 0
read(6, "<?php\n\nnamespace Laravel\\Telesco"..., 11675) = 11675
close(6) = 0
newfstatat(AT_FDCWD, "/home/forge/testapi.domain/vendor/composer/../laravel/telescope/src/Contracts/ClearableRepository.php", {st_mode=S_IFREG|0664, st_size=186, ...}, AT_SYMLINK_NOFOLLOW) = 0
openat(AT_FDCWD, "/home/forge/testapi.domain/vendor/laravel/telescope/src/Contracts/ClearableRepository.php", O_RDONLY) = 6
newfstatat(6, "", {st_mode=S_IFREG|0664, st_size=186, ...}, AT_EMPTY_PATH) = 0
read(6, "<?php\n\nnamespace Laravel\\Telesco"..., 186) = 186
close(6) = 0
newfstatat(AT_FDCWD, "/home/forge/testapi.domain/vendor/composer/../laravel/telescope/src/Contracts/PrunableRepository.php", {st_mode=S_IFREG|0664, st_size=302, ...}, AT_SYMLINK_NOFOLLOW) = 0
openat(AT_FDCWD, "/home/forge/testapi.domain/vendor/laravel/telescope/src/Contracts/PrunableRepository.php", O_RDONLY) = 6
newfstatat(6, "", {st_mode=S_IFREG|0664, st_size=302, ...}, AT_EMPTY_PATH) = 0
read(6, "<?php\n\nnamespace Laravel\\Telesco"..., 302) = 302
close(6) = 0
newfstatat(AT_FDCWD, "/home/forge/testapi.domain/vendor/composer/../laravel/telescope/src/Contracts/TerminableRepository.php", {st_mode=S_IFREG|0664, st_size=232, ...}, AT_SYMLINK_NOFOLLOW) = 0
openat(AT_FDCWD, "/home/forge/testapi.domain/vendor/laravel/telescope/src/Contracts/TerminableRepository.php", O_RDONLY) = 6
newfstatat(6, "", {st_mode=S_IFREG|0664, st_size=232, ...}, AT_EMPTY_PATH) = 0
read(6, "<?php\n\nnamespace Laravel\\Telesco"..., 232) = 232
close(6) = 0
close(3) = 0
rt_sigaction(SIGINT, {sa_handler=0x63e094c64420, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_ONSTACK|SA_INTERRUPT|SA_SIGINFO, sa_restorer=0x78fcad642520}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [INT], NULL, 8) = 0
rt_sigaction(SIGTERM, {sa_handler=0x63e094c64420, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_ONSTACK|SA_INTERRUPT|SA_SIGINFO, sa_restorer=0x78fcad642520}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [TERM], NULL, 8) = 0
rt_sigaction(SIGHUP, {sa_handler=0x63e094c64420, sa_mask=~[ILL TRAP ABRT BUS FPE KILL SEGV CONT STOP TSTP TTIN TTOU SYS RTMIN RT_1], sa_flags=SA_RESTORER|SA_ONSTACK|SA_INTERRUPT|SA_SIGINFO, sa_restorer=0x78fcad642520}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [HUP], NULL, 8) = 0
munmap(0x78fca7d35000, 65536) = 0
munmap(0x78fca6368000, 65536) = 0
munmap(0x78fca6358000, 65536) = 0
close(5) = 0
close(4) = 0
munmap(0x78fca3800000, 2621440) = 0
munmap(0x78fca5400000, 2097152) = 0
Environment: Laravel: 10.48.16 Octane: 2.5.2 FrankenPHP v1.2.5 PHP 8.3.10 Caddy v2.8.4 h1:q3pe0wpBj1OcHFZ3n/1nl4V4bxBrYoSoab7rL9BMYNk=
Hope this helps!
Thanks for the trace! Could you try if using the Docker image fixed the issue? Octane uses the static binary, which is built using musl, and there are some known issues with musl (especially crashes when using OpenSSL and lower performance). Using a binary built with glibc (as the one in the Debian Docker images) is better in production: https://laravel.com/docs/11.x/octane#frankenphp-via-docker
Also, I see that it's just a trace gathered with strace
, not the full stack trace.
Could you gather a full stack grace using this procedure please? https://frankenphp.dev/docs/contributing/#debugging-segmentation-faults-with-static-builds
What happened?
We are using Dockerfile with
dunglas/frankenphp:1.2.1-php8.3.9-bookworm
without workers.It works fine; however, when I run 4 E2E workers against the container, it gets killed with a segmentation fault. My machine is
Linux Mint 21.3 x86_64
. The project is Laravel 10, locally with sail; we upgraded a legacy project, so it does not use many deep-level features.I'm aware of Issue #13648, which mentions "high loads," but we do not use Octane. I found some issues related to Alpine, which I also tried, but it failed more regularly.
Previously, when using the normal build, it failed randomly—sometimes instantly, sometimes after some successful E2E runs. When using the debug build (https://frankenphp.dev/docs/contributing/#debugging-segmentation-faults-with-static-builds), the server works when browsing manually, but as soon as I start the E2E, it breaks. It seems to have something to do with parallel connections.
Build Type
Docker (Debian Bookworm)
Worker Mode
Yes
Operating System
GNU/Linux
CPU Architecture
x86_64
PHP configuration
phpinfo()
```shell phpinfo() PHP Version => 8.3.9 System => Linux 9a2bf654aacd 6.5.0-10043-tuxedo #47 SMP PREEMPT_DYNAMIC Tue Jun 4 14:29:55 UTC 2024 x86_64 Build Date => Jul 6 2024 00:48:34 Build System => Linux - Docker Build Provider => https://github.com/docker-library/php Configure Command => './configure' '--build=x86_64-linux-gnu' '--with-config-file-path=/usr/local/etc/php' '--with-config-file-scan-dir=/usr/local/etc/php/conf.d' '--enable-option-checking=fatal' '--with-mhash' '--with-pic' '--enable-mbstring' '--enable-mysqlnd' '--with-password-argon2' '--with-sodium=shared' '--with-pdo-sqlite=/usr' '--with-sqlite3=/usr' '--with-curl' '--with-iconv' '--with-openssl' '--with-readline' '--with-zlib' '--enable-phpdbg' '--enable-phpdbg-readline' '--with-pear' '--with-libdir=lib/x86_64-linux-gnu' '--enable-embed' '--enable-zts' '--disable-zend-signals' 'build_alias=x86_64-linux-gnu' Server API => Command Line Interface Virtual Directory Support => enabled Configuration File (php.ini) Path => /usr/local/etc/php Loaded Configuration File => (none) Scan this dir for additional .ini files => /usr/local/etc/php/conf.d Additional .ini files parsed => /usr/local/etc/php/conf.d/docker-php-ext-bcmath.ini, /usr/local/etc/php/conf.d/docker-php-ext-exif.ini, /usr/local/etc/php/conf.d/docker-php-ext-gd.ini, /usr/local/etc/php/conf.d/docker-php-ext-intl.ini, /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini, /usr/local/etc/php/conf.d/docker-php-ext-pcntl.ini, /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini, /usr/local/etc/php/conf.d/docker-php-ext-redis.ini, /usr/local/etc/php/conf.d/docker-php-ext-soap.ini, /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini, /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini, /usr/local/etc/php/conf.d/docker-php-ext-zip.ini PHP API => 20230831 PHP Extension => 20230831 Zend Extension => 420230831 Zend Extension Build => API420230831,TS PHP Extension Build => API20230831,TS 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, php, file, glob, data, http, ftp, phar, zip Registered Stream Socket Transports => tcp, udp, unix, udg, ssl, tls, tlsv1.0, tlsv1.1, tlsv1.2, tlsv1.3 Registered Stream Filters => zlib.*, convert.iconv.*, string.rot13, string.toupper, string.tolower, convert.*, consumed, dechunk This program makes use of the Zend Scripting Language Engine: Zend Engine v4.3.9, Copyright (c) Zend Technologies with Zend OPcache v8.3.9, Copyright (c), by Zend Technologies with Xdebug v3.3.0alpha3, Copyright (c) 2002-2023, by Derick Rethans _______________________________________________________________________ Configuration bcmath BCMath support => enabled Directive => Local Value => Master Value bcmath.scale => 0 => 0 Core PHP Version => 8.3.9 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 => STDOUT => STDOUT display_startup_errors => On => On doc_root => no value => no value docref_ext => no value => no value docref_root => no value => no value enable_dl => On => On 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 => no value => no value expose_php => On => On extension_dir => /usr/local/lib/php/extensions/no-debug-zts-20230831 => /usr/local/lib/php/extensions/no-debug-zts-20230831 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 => Off => Off ignore_repeated_errors => Off => Off ignore_repeated_source => Off => Off ignore_user_abort => Off => Off implicit_flush => On => On include_path => .:/usr/local/lib/php => .:/usr/local/lib/php input_encoding => no value => no value internal_encoding => no value => no value log_errors => Off => Off 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 => 0 => 0 max_file_uploads => 20 => 20 max_input_nesting_level => 64 => 64 max_input_time => -1 => -1 max_input_vars => 1000 => 1000 max_multipart_body_parts => -1 => -1 memory_limit => 128M => 128M open_basedir => no value => no value output_buffering => 0 => 0 output_encoding => no value => no value output_handler => no value => no value post_max_size => 8M => 8M precision => 14 => 14 realpath_cache_size => 4096K => 4096K realpath_cache_ttl => 120 => 120 register_argc_argv => On => On report_memleaks => On => On report_zend_debug => Off => Off request_order => no value => no value 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 => On => On SMTP => localhost => localhost smtp_port => 25 => 25 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 => 2M => 2M 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 => EGPCS => EGPCS 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 => Off => Off zend.exception_string_param_max_len => 15 => 15 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 => 7.88.1 Age => 10 Features AsynchDNS => Yes CharConv => No Debug => No GSS-Negotiate => No IDN => Yes IPv6 => Yes krb4 => No Largefile => Yes libz => Yes NTLM => Yes NTLMWB => Yes SPNEGO => Yes SSL => Yes SSPI => No TLS-SRP => Yes HTTP2 => Yes GSSAPI => Yes KERBEROS5 => Yes UNIX_SOCKETS => Yes PSL => Yes HTTPS_PROXY => Yes MULTI_SSL => No BROTLI => Yes ALTSVC => Yes HTTP3 => No UNICODE => No ZSTD => Yes HSTS => Yes GSASL => No Protocols => dict, file, ftp, ftps, gopher, gophers, http, https, imap, imaps, ldap, ldaps, mqtt, pop3, pop3s, rtmp, rtmpe, rtmps, rtmpt, rtmpte, rtmpts, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet, tftp Host => x86_64-pc-linux-gnu SSL Version => OpenSSL/3.0.13 ZLib Version => 1.2.13 libSSH Version => libssh2/1.10.0 Directive => Local Value => Master Value curl.cainfo => no value => no value date date/time support => enabled timelib version => 2022.10 "Olson" Timezone Database Version => 2024.1 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 dom DOM/XML => enabled DOM/XML API Version => 20031129 libxml Version => 2.9.14 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 => 543 filter Input Validation and Filtering => enabled Directive => Local Value => Master Value filter.default => unsafe_raw => unsafe_raw filter.default_flags => no value => no value gd GD Support => enabled GD Version => bundled (2.1.0 compatible) FreeType Support => enabled FreeType Linkage => with freetype FreeType Version => 2.12.1 GIF Read Support => enabled GIF Create Support => enabled JPEG Support => enabled libJPEG Version => 6b PNG Support => enabled libPNG Version => 1.6.39 WBMP Support => enabled XPM Support => enabled libXpm Version => 30411 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 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 MHASH support => Enabled MHASH API Version => Emulated Support iconv iconv support => enabled iconv implementation => glibc iconv library version => 2.36 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 intl Internationalization support => enabled ICU version => 72.1 ICU Data version => 72.1 ICU TZData version => 2022e ICU Unicode version => 15.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 libxml libXML support => active libXML Compiled Version => 2.9.14 libXML Loaded Version => 20914 libXML streams => enabled 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.8 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 mysqlnd mysqlnd => enabled Version => mysqlnd 8.3.9 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 => pdo_mysql openssl OpenSSL support => enabled OpenSSL Library Version => OpenSSL 3.0.13 30 Jan 2024 OpenSSL Header Version => OpenSSL 3.0.13 30 Jan 2024 Openssl default config => /usr/lib/ssl/openssl.cnf Directive => Local Value => Master Value openssl.cafile => no value => no value openssl.capath => no value => no value pcntl pcntl support => enabled pcre PCRE (Perl Compatible Regular Expressions) Support => enabled PCRE Library Version => 10.42 2022-12-12 PCRE Unicode Version => 14.0.0 PCRE JIT Support => enabled PCRE JIT Target => x86 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 => sqlite, mysql pdo_mysql PDO Driver for MySQL => enabled Client API version => mysqlnd 8.3.9 Directive => Local Value => Master Value pdo_mysql.default_socket => no value => no value pdo_sqlite PDO Driver for SQLite 3.x => enabled SQLite Library => 3.40.1 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 => disabled (install ext/bz2) Native 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 random Version => 8.3.9 readline Readline Support => enabled Readline library => 8.2 Directive => Local Value => Master Value cli.pager => no value => no value cli.prompt => \b \> => \b \> redis Redis Support => enabled Redis Version => 6.0.2 Redis Sentinel Version => 1.0 Available serializers => php, json Available compression => lzf, 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.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 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 => 100 => 100 session.gc_maxlifetime => 1440 => 1440 session.gc_probability => 1 => 1 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 => 4 => 4 session.sid_length => 32 => 32 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 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 sodium sodium support => enabled libsodium headers version => 1.0.18 libsodium library version => 1.0.18 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.40.1 Directive => Local Value => Master Value sqlite3.defensive => On => On sqlite3.extension_dir => no value => no value 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 tokenizer Tokenizer Support => enabled xdebug [1m__ __ _ _ [1m\ \ / / | | | | [1m \ V / __| | ___| |__ _ _ __ _ [1m > < / _` |/ _ \ '_ \| | | |/ _` | [1m / . \ (_| | __/ |_) | |_| | (_| | [1m/_/ \_\__,_|\___|_.__/ \__,_|\__, | [1m __/ | [1m |___/ [0mVersion => 3.3.0alpha3 Support Xdebug on Patreon, GitHub, or as a business: https://xdebug.org/support Enabled Features (through 'XDEBUG_MODE' env variable) Feature => Enabled/Disabled Development Helpers => ✘ disabled Coverage => ✘ disabled GC Stats => ✘ disabled Profiler => ✘ disabled Step Debugger => ✘ disabled Tracing => ✘ disabled Optional Features Compressed File Support => no Clock Source => clock_gettime 'xdebug://gateway' pseudo-host support => yes 'xdebug://nameserver' pseudo-host support => yes Systemd Private Temp Directory => not enabled Directive => Local Value => Master Value xdebug.auto_trace => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.cli_color => 0 => 0 xdebug.client_discovery_header => HTTP_X_FORWARDED_FOR,REMOTE_ADDR => HTTP_X_FORWARDED_FOR,REMOTE_ADDR xdebug.client_host => host.docker.internal => host.docker.internal xdebug.client_port => 9000 => 9000 xdebug.cloud_id => no value => no value xdebug.collect_assignments => Off => Off xdebug.collect_includes => (setting removed in Xdebug 3) => (setting removed in Xdebug 3) xdebug.collect_params => On => On xdebug.collect_return => Off => Off xdebug.collect_vars => (setting removed in Xdebug 3) => (setting removed in Xdebug 3) xdebug.connect_timeout_ms => 200 => 200 xdebug.coverage_enable => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.default_enable => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.discover_client_host => Off => Off xdebug.dump.COOKIE => no value => no value xdebug.dump.ENV => no value => no value xdebug.dump.FILES => no value => no value xdebug.dump.GET => no value => no value xdebug.dump.POST => no value => no value xdebug.dump.REQUEST => no value => no value xdebug.dump.SERVER => no value => no value xdebug.dump.SESSION => no value => no value xdebug.dump_globals => On => On xdebug.dump_once => On => On xdebug.dump_undefined => Off => Off xdebug.file_link_format => no value => no value xdebug.filename_format => no value => no value xdebug.force_display_errors => Off => Off xdebug.force_error_reporting => 0 => 0 xdebug.gc_stats_enable => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.gc_stats_output_dir => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.gc_stats_output_name => gcstats.%p => gcstats.%p xdebug.halt_level => 0 => 0 xdebug.idekey => PHPSTORM => PHPSTORM xdebug.log => no value => no value xdebug.log_level => 7 => 7 xdebug.max_nesting_level => 512 => 512 xdebug.max_stack_frames => -1 => -1 xdebug.mode => develop,trace,debug,coverage => develop,trace,debug,coverage xdebug.output_dir => /tmp => /tmp xdebug.overload_var_dump => (setting removed in Xdebug 3) => (setting removed in Xdebug 3) xdebug.profiler_append => Off => Off xdebug.profiler_enable => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.profiler_enable_trigger => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.profiler_enable_trigger_value => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.profiler_output_dir => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.profiler_output_name => cachegrind.out.%p => cachegrind.out.%p xdebug.remote_autostart => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.remote_connect_back => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.remote_enable => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.remote_host => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.remote_log => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.remote_log_level => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.remote_mode => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.remote_port => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.remote_timeout => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.scream => Off => Off xdebug.show_error_trace => Off => Off xdebug.show_exception_trace => Off => Off xdebug.show_local_vars => Off => Off xdebug.show_mem_delta => (setting removed in Xdebug 3) => (setting removed in Xdebug 3) xdebug.start_upon_error => default => default xdebug.start_with_request => trigger => trigger xdebug.trace_enable_trigger => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.trace_enable_trigger_value => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.trace_format => 0 => 0 xdebug.trace_options => 0 => 0 xdebug.trace_output_dir => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3) xdebug.trace_output_name => trace.%c => trace.%c xdebug.trigger_value => no value => no value xdebug.use_compression => 0 => 0 xdebug.var_display_max_children => 128 => 128 xdebug.var_display_max_data => 512 => 512 xdebug.var_display_max_depth => 3 => 3 xml XML Support => active XML Namespace Support => active libxml2 Version => 2.9.14 xmlreader XMLReader => enabled xmlwriter XMLWriter => enabled Zend OPcache Opcode Caching => Disabled Optimization => Disabled SHM Cache => Enabled File Cache => Disabled JIT => On Startup Failed => Opcode Caching is disabled for CLI 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 => tracing => tracing opcache.jit_bisect_limit => 0 => 0 opcache.jit_blacklist_root_trace => 16 => 16 opcache.jit_blacklist_side_trace => 8 => 8 opcache.jit_buffer_size => 0 => 0 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.3 Libzip version => 1.7.3 BZIP2 compression => Yes XZ compression => No ZSTD compression => No 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.2.13 Linked Version => 1.2.13 Directive => Local Value => Master Value zlib.output_compression => Off => Off zlib.output_compression_level => -1 => -1 zlib.output_handler => no value => no value Additional Modules Module Name Environment Variable => Value XDEBUG_MODE => off HOSTNAME => 9a2bf654aacd PHP_VERSION => 8.3.9 PHP_INI_DIR => /usr/local/etc/php XDG_DATA_HOME => /data GODEBUG => cgocheck=0 XDG_CONFIG_HOME => /config PHP_LDFLAGS => -Wl,-O1 -pie LARAVEL_SAIL => 1 PWD => /var/www/web HOME => /home/sail LS_COLORS => rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.swp=00;90:*.tmp=00;90:*.dpkg-dist=00;90:*.dpkg-old=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90: PHP_SHA256 => bf4d7b8ea60a356064f88485278bd6f941a230ec16f0fc401574ce1445ad6c77 PHPIZE_DEPS => autoconf dpkg-dev file g++ gcc libc-dev make pkg-config re2c TERM => xterm PHP_URL => https://www.php.net/distributions/php-8.3.9.tar.xz SHLVL => 1 PHP_CFLAGS => -fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 PATH => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PHP_ASC_URL => https://www.php.net/distributions/php-8.3.9.tar.xz.asc PHP_CPPFLAGS => -fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 _ => /usr/local/bin/php PHP Variables Variable => Value $_SERVER['XDEBUG_MODE'] => off $_SERVER['HOSTNAME'] => 9a2bf654aacd $_SERVER['PHP_VERSION'] => 8.3.9 $_SERVER['PHP_INI_DIR'] => /usr/local/etc/php $_SERVER['XDG_DATA_HOME'] => /data $_SERVER['GODEBUG'] => cgocheck=0 $_SERVER['XDG_CONFIG_HOME'] => /config $_SERVER['PHP_LDFLAGS'] => -Wl,-O1 -pie $_SERVER['LARAVEL_SAIL'] => 1 $_SERVER['PWD'] => /var/www/web $_SERVER['HOME'] => /home/sail $_SERVER['LS_COLORS'] => rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.swp=00;90:*.tmp=00;90:*.dpkg-dist=00;90:*.dpkg-old=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90: $_SERVER['PHP_SHA256'] => bf4d7b8ea60a356064f88485278bd6f941a230ec16f0fc401574ce1445ad6c77 $_SERVER['PHPIZE_DEPS'] => autoconf dpkg-dev file g++ gcc libc-dev make pkg-config re2c $_SERVER['TERM'] => xterm $_SERVER['PHP_URL'] => https://www.php.net/distributions/php-8.3.9.tar.xz $_SERVER['SHLVL'] => 1 $_SERVER['PHP_CFLAGS'] => -fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 $_SERVER['PATH'] => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin $_SERVER['PHP_ASC_URL'] => https://www.php.net/distributions/php-8.3.9.tar.xz.asc $_SERVER['PHP_CPPFLAGS'] => -fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 $_SERVER['_'] => /usr/local/bin/php $_SERVER['PHP_SELF'] => $_SERVER['SCRIPT_NAME'] => $_SERVER['SCRIPT_FILENAME'] => $_SERVER['PATH_TRANSLATED'] => $_SERVER['DOCUMENT_ROOT'] => $_SERVER['REQUEST_TIME_FLOAT'] => 1720675118.4828 $_SERVER['REQUEST_TIME'] => 1720675118 $_SERVER['argv'] => Array ( ) $_SERVER['argc'] => 0 $_ENV['XDEBUG_MODE'] => off $_ENV['HOSTNAME'] => 9a2bf654aacd $_ENV['PHP_VERSION'] => 8.3.9 $_ENV['PHP_INI_DIR'] => /usr/local/etc/php $_ENV['XDG_DATA_HOME'] => /data $_ENV['GODEBUG'] => cgocheck=0 $_ENV['XDG_CONFIG_HOME'] => /config $_ENV['PHP_LDFLAGS'] => -Wl,-O1 -pie $_ENV['LARAVEL_SAIL'] => 1 $_ENV['PWD'] => /var/www/web $_ENV['HOME'] => /home/sail $_ENV['LS_COLORS'] => rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.swp=00;90:*.tmp=00;90:*.dpkg-dist=00;90:*.dpkg-old=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90: $_ENV['PHP_SHA256'] => bf4d7b8ea60a356064f88485278bd6f941a230ec16f0fc401574ce1445ad6c77 $_ENV['PHPIZE_DEPS'] => autoconf dpkg-dev file g++ gcc libc-dev make pkg-config re2c $_ENV['TERM'] => xterm $_ENV['PHP_URL'] => https://www.php.net/distributions/php-8.3.9.tar.xz $_ENV['SHLVL'] => 1 $_ENV['PHP_CFLAGS'] => -fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 $_ENV['PATH'] => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin $_ENV['PHP_ASC_URL'] => https://www.php.net/distributions/php-8.3.9.tar.xz.asc $_ENV['PHP_CPPFLAGS'] => -fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 $_ENV['_'] => /usr/local/bin/php 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 license@php.net. ```Relevant log output
See next comment