From ea01871291743b0bfb2ecfe9bd70e8b718ec26f9 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 14 Apr 2025 00:00:41 +0700 Subject: [PATCH 01/75] add ./create-rpm.sh file to build a "frankenphp" rpm package --- create-rpm.sh | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 create-rpm.sh diff --git a/create-rpm.sh b/create-rpm.sh new file mode 100644 index 0000000000..8dabf4b3c5 --- /dev/null +++ b/create-rpm.sh @@ -0,0 +1,91 @@ +#!/bin/bash + +set -o errexit +set -x + +# Ensure required tools are installed +if ! command -v rpmbuild &>/dev/null; then + echo "Error: rpm-build is required to create RPM packages." + echo "Install it with: sudo dnf install rpm-build" + exit 1 +fi + +if ! command -v ruby &>/dev/null; then + echo "Error: Ruby is required by FPM." + echo "Install it with: sudo dnf install ruby" + exit 1 +fi + +if ! command -v fpm &>/dev/null; then + echo "Error: FPM (rubygem-fpm) is required to create RPM packages." + echo "Install it with: sudo gem install fpm" + exit 1 +fi + +arch="$(uname -m)" +os="$(uname -s | tr '[:upper:]' '[:lower:]')" +bin="dist/frankenphp-${os}-${arch}" + +if [ ! -f "$bin" ]; then + echo "Error: $bin not found. Run './build-static.sh' first" + exit 1 +fi + +if [ -z "${FRANKENPHP_VERSION}" ]; then + FRANKENPHP_VERSION="$(git rev-parse --verify HEAD)" + export FRANKENPHP_VERSION +fi + +cat < dist/frankenphp.service +[Unit] +Description=FrankenPHP server +After=network.target + +[Service] +Type=notify +User=caddy +Group=caddy +ExecStartPre=/usr/bin/frankenphp validate --config /etc/frankenphp/Caddyfile +ExecStart=/usr/bin/frankenphp run --environ --config /etc/frankenphp/Caddyfile +ExecReload=/usr/bin/frankenphp reload --config /etc/frankenphp/Caddyfile +TimeoutStopSec=5s +LimitNOFILE=1048576 +LimitNPROC=512 +PrivateTmp=true +ProtectHome=true +ProtectSystem=full +AmbientCapabilities=CAP_NET_BIND_SERVICE + +[Install] +WantedBy=multi-user.target +EOF + +cat < dist/Caddyfile +# The Caddyfile is an easy way to configure your Caddy web server. +# +# https://caddyserver.com/docs/caddyfile +# https://frankenphp.dev/docs/config +{ + # enable the frankenphp module, otherwise "php_server" and "php" directives do not work + frankenphp { + # optionally set max_threads, num_threads and create workers here + } +} + +http:// { + root * /usr/share/caddy + php_server + file_server +} + +# As an alternative to editing the above site block, you can add your own site +# block files in the Caddyfile.d directory, and they will be included as long +# as they use the .caddyfile extension. + +import Caddyfile.d/*.caddyfile +EOF + +fpm -s dir -t rpm -n frankenphp -v "${FRANKENPHP_VERSION}" \ + "$bin=/usr/bin/frankenphp" \ + "./dist/frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ + "./dist/Caddyfile=/etc/frankenphp/Caddyfile" \ No newline at end of file From a2d3ccdff96f98b78a6ffae82c86e01ed3973964 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 14 Apr 2025 00:28:58 +0700 Subject: [PATCH 02/75] also build a deb package --- create-rpm.sh | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/create-rpm.sh b/create-rpm.sh index 8dabf4b3c5..674b784715 100644 --- a/create-rpm.sh +++ b/create-rpm.sh @@ -24,16 +24,16 @@ fi arch="$(uname -m)" os="$(uname -s | tr '[:upper:]' '[:lower:]')" -bin="dist/frankenphp-${os}-${arch}" +bin="frankenphp-${os}-${arch}" -if [ ! -f "$bin" ]; then +if [ ! -f "dist/$bin" ]; then echo "Error: $bin not found. Run './build-static.sh' first" exit 1 fi -if [ -z "${FRANKENPHP_VERSION}" ]; then - FRANKENPHP_VERSION="$(git rev-parse --verify HEAD)" - export FRANKENPHP_VERSION +if [[ ! "${FRANKENPHP_VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Error: FRANKENPHP_VERSION must be set to X.Y.Z (e.g. 1.5.1), got '${FRANKENPHP_VERSION}'" + exit 1 fi cat < dist/frankenphp.service @@ -85,7 +85,17 @@ http:// { import Caddyfile.d/*.caddyfile EOF +iteration="1" +cd dist + fpm -s dir -t rpm -n frankenphp -v "${FRANKENPHP_VERSION}" \ + --config-files /etc/frankenphp/Caddyfile \ "$bin=/usr/bin/frankenphp" \ - "./dist/frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ - "./dist/Caddyfile=/etc/frankenphp/Caddyfile" \ No newline at end of file + "./frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ + "./Caddyfile=/etc/frankenphp/Caddyfile" + +rpm_file="frankenphp-${FRANKENPHP_VERSION}-${iteration}.${arch}.rpm" + +fpm -s rpm -t deb "$rpm_file" + +cd .. \ No newline at end of file From 03da93f1975b94b3be4b2c629545ec53af6eeb7e Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 14 Apr 2025 00:36:55 +0700 Subject: [PATCH 03/75] renamed to build-packages --- create-rpm.sh => build-packages.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename create-rpm.sh => build-packages.sh (99%) diff --git a/create-rpm.sh b/build-packages.sh similarity index 99% rename from create-rpm.sh rename to build-packages.sh index 674b784715..b1576564dd 100644 --- a/create-rpm.sh +++ b/build-packages.sh @@ -98,4 +98,4 @@ rpm_file="frankenphp-${FRANKENPHP_VERSION}-${iteration}.${arch}.rpm" fpm -s rpm -t deb "$rpm_file" -cd .. \ No newline at end of file +cd .. From bee13b7d6f3f9a704593baef1253cf56c0cfb6b5 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 14 Apr 2025 00:39:19 +0700 Subject: [PATCH 04/75] linter... --- build-packages.sh | 48 +++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/build-packages.sh b/build-packages.sh index b1576564dd..3b664eb50b 100644 --- a/build-packages.sh +++ b/build-packages.sh @@ -5,21 +5,21 @@ set -x # Ensure required tools are installed if ! command -v rpmbuild &>/dev/null; then - echo "Error: rpm-build is required to create RPM packages." - echo "Install it with: sudo dnf install rpm-build" - exit 1 + echo "Error: rpm-build is required to create RPM packages." + echo "Install it with: sudo dnf install rpm-build" + exit 1 fi if ! command -v ruby &>/dev/null; then - echo "Error: Ruby is required by FPM." - echo "Install it with: sudo dnf install ruby" - exit 1 + echo "Error: Ruby is required by FPM." + echo "Install it with: sudo dnf install ruby" + exit 1 fi if ! command -v fpm &>/dev/null; then - echo "Error: FPM (rubygem-fpm) is required to create RPM packages." - echo "Install it with: sudo gem install fpm" - exit 1 + echo "Error: FPM (rubygem-fpm) is required to create RPM packages." + echo "Install it with: sudo gem install fpm" + exit 1 fi arch="$(uname -m)" @@ -27,13 +27,13 @@ os="$(uname -s | tr '[:upper:]' '[:lower:]')" bin="frankenphp-${os}-${arch}" if [ ! -f "dist/$bin" ]; then - echo "Error: $bin not found. Run './build-static.sh' first" - exit 1 + echo "Error: $bin not found. Run './build-static.sh' first" + exit 1 fi if [[ ! "${FRANKENPHP_VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - echo "Error: FRANKENPHP_VERSION must be set to X.Y.Z (e.g. 1.5.1), got '${FRANKENPHP_VERSION}'" - exit 1 + echo "Error: FRANKENPHP_VERSION must be set to X.Y.Z (e.g. 1.5.1), got '${FRANKENPHP_VERSION}'" + exit 1 fi cat < dist/frankenphp.service @@ -66,16 +66,16 @@ cat < dist/Caddyfile # https://caddyserver.com/docs/caddyfile # https://frankenphp.dev/docs/config { - # enable the frankenphp module, otherwise "php_server" and "php" directives do not work - frankenphp { - # optionally set max_threads, num_threads and create workers here - } + # enable the frankenphp module, otherwise "php_server" and "php" directives do not work + frankenphp { + # optionally set max_threads, num_threads and create workers here + } } http:// { - root * /usr/share/caddy - php_server - file_server + root * /usr/share/caddy + php_server + file_server } # As an alternative to editing the above site block, you can add your own site @@ -89,10 +89,10 @@ iteration="1" cd dist fpm -s dir -t rpm -n frankenphp -v "${FRANKENPHP_VERSION}" \ - --config-files /etc/frankenphp/Caddyfile \ - "$bin=/usr/bin/frankenphp" \ - "./frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ - "./Caddyfile=/etc/frankenphp/Caddyfile" + --config-files /etc/frankenphp/Caddyfile \ + "$bin=/usr/bin/frankenphp" \ + "./frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ + "./Caddyfile=/etc/frankenphp/Caddyfile" rpm_file="frankenphp-${FRANKENPHP_VERSION}-${iteration}.${arch}.rpm" From 915ef7ea0ac64db9ed8dfe08d237d3ecf31d2daa Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 14 Apr 2025 01:19:08 +0700 Subject: [PATCH 05/75] add depends --- build-packages.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build-packages.sh b/build-packages.sh index 3b664eb50b..c7cf546dd2 100644 --- a/build-packages.sh +++ b/build-packages.sh @@ -87,9 +87,13 @@ EOF iteration="1" cd dist +glibc_version=$(ldd -v "$bin" | awk '/GLIBC_/ {gsub(/[()]/, "", $2); print $2}' | grep -v GLIBC_PRIVATE | sort -V | tail -n1) +cxxabi_version=$(strings "$bin" | grep -oP 'CXXABI_\d+\.\d+(\.\d+)?' | sort -V | tail -n1) fpm -s dir -t rpm -n frankenphp -v "${FRANKENPHP_VERSION}" \ --config-files /etc/frankenphp/Caddyfile \ + --depends "libc.so.6(${glibc_version})(64bit)" \ + --depends "libstdc++.so.6(${cxxabi_version})(64bit)" \ "$bin=/usr/bin/frankenphp" \ "./frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ "./Caddyfile=/etc/frankenphp/Caddyfile" From cfdd24412210f0c35b98a39b4c39cdfe509da872 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 14 Apr 2025 01:22:49 +0700 Subject: [PATCH 06/75] linter again? --- build-packages.sh | 88 +++++++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/build-packages.sh b/build-packages.sh index c7cf546dd2..49140488dc 100644 --- a/build-packages.sh +++ b/build-packages.sh @@ -36,53 +36,53 @@ if [[ ! "${FRANKENPHP_VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then exit 1 fi -cat < dist/frankenphp.service -[Unit] -Description=FrankenPHP server -After=network.target - -[Service] -Type=notify -User=caddy -Group=caddy -ExecStartPre=/usr/bin/frankenphp validate --config /etc/frankenphp/Caddyfile -ExecStart=/usr/bin/frankenphp run --environ --config /etc/frankenphp/Caddyfile -ExecReload=/usr/bin/frankenphp reload --config /etc/frankenphp/Caddyfile -TimeoutStopSec=5s -LimitNOFILE=1048576 -LimitNPROC=512 -PrivateTmp=true -ProtectHome=true -ProtectSystem=full -AmbientCapabilities=CAP_NET_BIND_SERVICE - -[Install] -WantedBy=multi-user.target +cat <dist/frankenphp.service + [Unit] + Description=FrankenPHP server + After=network.target + + [Service] + Type=notify + User=caddy + Group=caddy + ExecStartPre=/usr/bin/frankenphp validate --config /etc/frankenphp/Caddyfile + ExecStart=/usr/bin/frankenphp run --environ --config /etc/frankenphp/Caddyfile + ExecReload=/usr/bin/frankenphp reload --config /etc/frankenphp/Caddyfile + TimeoutStopSec=5s + LimitNOFILE=1048576 + LimitNPROC=512 + PrivateTmp=true + ProtectHome=true + ProtectSystem=full + AmbientCapabilities=CAP_NET_BIND_SERVICE + + [Install] + WantedBy=multi-user.target EOF cat < dist/Caddyfile -# The Caddyfile is an easy way to configure your Caddy web server. -# -# https://caddyserver.com/docs/caddyfile -# https://frankenphp.dev/docs/config -{ - # enable the frankenphp module, otherwise "php_server" and "php" directives do not work - frankenphp { - # optionally set max_threads, num_threads and create workers here - } -} - -http:// { - root * /usr/share/caddy - php_server - file_server -} - -# As an alternative to editing the above site block, you can add your own site -# block files in the Caddyfile.d directory, and they will be included as long -# as they use the .caddyfile extension. - -import Caddyfile.d/*.caddyfile + # The Caddyfile is an easy way to configure your Caddy web server. + # + # https://caddyserver.com/docs/caddyfile + # https://frankenphp.dev/docs/config + { + # enable the frankenphp module, otherwise "php_server" and "php" directives do not work + frankenphp { + # optionally set max_threads, num_threads and create workers here + } + } + + http:// { + root * /usr/share/caddy + php_server + file_server + } + + # As an alternative to editing the above site block, you can add your own site + # block files in the Caddyfile.d directory, and they will be included as long + # as they use the .caddyfile extension. + + import Caddyfile.d/*.caddyfile EOF iteration="1" From 687cee156eb53c7c6fc04fd9b62fcebaad8be6ff Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 14 Apr 2025 01:29:24 +0700 Subject: [PATCH 07/75] linter number 3 --- build-packages.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-packages.sh b/build-packages.sh index 49140488dc..2af2da60c9 100644 --- a/build-packages.sh +++ b/build-packages.sh @@ -60,7 +60,7 @@ cat <dist/frankenphp.service WantedBy=multi-user.target EOF -cat < dist/Caddyfile +cat <dist/Caddyfile # The Caddyfile is an easy way to configure your Caddy web server. # # https://caddyserver.com/docs/caddyfile From 152a218b47689b6ffd85a25fd789efbd7d7c3fed Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 14 Apr 2025 01:34:33 +0700 Subject: [PATCH 08/75] linter number 4 --- build-packages.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 build-packages.sh diff --git a/build-packages.sh b/build-packages.sh old mode 100644 new mode 100755 index 2af2da60c9..a2ba4d262b --- a/build-packages.sh +++ b/build-packages.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash set -o errexit set -x From f65a9397e4b69d537368f3bf38b1257cee7a7438 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 14 Apr 2025 11:06:22 +0700 Subject: [PATCH 09/75] set default locations for ini file, conf files and extensions --- static-builder-gnu.Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/static-builder-gnu.Dockerfile b/static-builder-gnu.Dockerfile index f7224114d7..cba9fd6401 100644 --- a/static-builder-gnu.Dockerfile +++ b/static-builder-gnu.Dockerfile @@ -115,8 +115,9 @@ ENV SPC_LIBC='glibc' ENV SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS_PROGRAM='-Wl,-O3 -pie' ENV SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS='-ldl -lpthread -lm -lresolv -lutil -lrt' ENV SPC_OPT_DOWNLOAD_ARGS='--ignore-cache-sources=php-src' -ENV SPC_OPT_BUILD_ARGS='' +ENV SPC_OPT_BUILD_ARGS='--with-config-file-path=/etc/frankenphp/php.ini --with-config-file-scan-dir=/etc/frankenphp/php.d' ENV SPC_REL_TYPE='binary' +ENV EXTENSION_DIR='/usr/lib64/frankenphp/modules' # not sure if this is needed ENV COMPOSER_ALLOW_SUPERUSER=1 From 6bcb7906df15c060cf45adf52c7603fb31715815 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 14 Apr 2025 14:51:04 +0700 Subject: [PATCH 10/75] set unified path for modules that should be ok on all dists --- static-builder-gnu.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static-builder-gnu.Dockerfile b/static-builder-gnu.Dockerfile index cba9fd6401..44123bb627 100644 --- a/static-builder-gnu.Dockerfile +++ b/static-builder-gnu.Dockerfile @@ -117,7 +117,7 @@ ENV SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS='-ldl -lpthread -lm -lresolv -lutil -lrt' ENV SPC_OPT_DOWNLOAD_ARGS='--ignore-cache-sources=php-src' ENV SPC_OPT_BUILD_ARGS='--with-config-file-path=/etc/frankenphp/php.ini --with-config-file-scan-dir=/etc/frankenphp/php.d' ENV SPC_REL_TYPE='binary' -ENV EXTENSION_DIR='/usr/lib64/frankenphp/modules' +ENV EXTENSION_DIR='/usr/lib/frankenphp/modules' # not sure if this is needed ENV COMPOSER_ALLOW_SUPERUSER=1 From 496dd70bf1df7e25355e7a209bd54dd9d2a14cd0 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 14 Apr 2025 22:48:00 +0700 Subject: [PATCH 11/75] add default content into "package" folder --- build-packages.sh | 60 +- caddy/frankenphp/Caddyfile | 8 + package/Caddyfile | 53 + package/content/example.php | 140 ++ package/content/public/assets/caddy.png | Bin 0 -> 5500 bytes package/content/public/assets/frankenphp.png | Bin 0 -> 180566 bytes package/content/public/index.php | 14 + package/etc/php.ini | 1870 ++++++++++++++++++ package/frankenphp.service | 21 + 9 files changed, 2114 insertions(+), 52 deletions(-) mode change 100755 => 100644 build-packages.sh create mode 100644 package/Caddyfile create mode 100644 package/content/example.php create mode 100644 package/content/public/assets/caddy.png create mode 100644 package/content/public/assets/frankenphp.png create mode 100644 package/content/public/index.php create mode 100644 package/etc/php.ini create mode 100644 package/frankenphp.service diff --git a/build-packages.sh b/build-packages.sh old mode 100755 new mode 100644 index a2ba4d262b..096077a12d --- a/build-packages.sh +++ b/build-packages.sh @@ -27,7 +27,7 @@ os="$(uname -s | tr '[:upper:]' '[:lower:]')" bin="frankenphp-${os}-${arch}" if [ ! -f "dist/$bin" ]; then - echo "Error: $bin not found. Run './build-static.sh' first" + echo "Error: dist/$bin not found. Run './build-static.sh' first" exit 1 fi @@ -36,55 +36,6 @@ if [[ ! "${FRANKENPHP_VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then exit 1 fi -cat <dist/frankenphp.service - [Unit] - Description=FrankenPHP server - After=network.target - - [Service] - Type=notify - User=caddy - Group=caddy - ExecStartPre=/usr/bin/frankenphp validate --config /etc/frankenphp/Caddyfile - ExecStart=/usr/bin/frankenphp run --environ --config /etc/frankenphp/Caddyfile - ExecReload=/usr/bin/frankenphp reload --config /etc/frankenphp/Caddyfile - TimeoutStopSec=5s - LimitNOFILE=1048576 - LimitNPROC=512 - PrivateTmp=true - ProtectHome=true - ProtectSystem=full - AmbientCapabilities=CAP_NET_BIND_SERVICE - - [Install] - WantedBy=multi-user.target -EOF - -cat <dist/Caddyfile - # The Caddyfile is an easy way to configure your Caddy web server. - # - # https://caddyserver.com/docs/caddyfile - # https://frankenphp.dev/docs/config - { - # enable the frankenphp module, otherwise "php_server" and "php" directives do not work - frankenphp { - # optionally set max_threads, num_threads and create workers here - } - } - - http:// { - root * /usr/share/caddy - php_server - file_server - } - - # As an alternative to editing the above site block, you can add your own site - # block files in the Caddyfile.d directory, and they will be included as long - # as they use the .caddyfile extension. - - import Caddyfile.d/*.caddyfile -EOF - iteration="1" cd dist glibc_version=$(ldd -v "$bin" | awk '/GLIBC_/ {gsub(/[()]/, "", $2); print $2}' | grep -v GLIBC_PRIVATE | sort -V | tail -n1) @@ -92,11 +43,16 @@ cxxabi_version=$(strings "$bin" | grep -oP 'CXXABI_\d+\.\d+(\.\d+)?' | sort -V | fpm -s dir -t rpm -n frankenphp -v "${FRANKENPHP_VERSION}" \ --config-files /etc/frankenphp/Caddyfile \ + --config-files /etc/frankenphp/php.ini \ --depends "libc.so.6(${glibc_version})(64bit)" \ --depends "libstdc++.so.6(${cxxabi_version})(64bit)" \ "$bin=/usr/bin/frankenphp" \ - "./frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ - "./Caddyfile=/etc/frankenphp/Caddyfile" + "../package/frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ + "../package/Caddyfile=/etc/frankenphp/Caddyfile" \ + "../package/etc/php.ini=/etc/frankenphp/php.ini" \ + "../package/etc/php.d/=/etc/frankenphp/php.d" \ + "../package/content/=/usr/share/frankenphp" \ + "../package/modules/=/usr/lib/frankenphp/modules" rpm_file="frankenphp-${FRANKENPHP_VERSION}-${iteration}.${arch}.rpm" diff --git a/caddy/frankenphp/Caddyfile b/caddy/frankenphp/Caddyfile index 2da634b031..1f21f9abf6 100644 --- a/caddy/frankenphp/Caddyfile +++ b/caddy/frankenphp/Caddyfile @@ -1,3 +1,5 @@ + + { {$CADDY_GLOBAL_OPTIONS} @@ -43,3 +45,9 @@ php_server } + +# As an alternative to editing the above site block, you can add your own site +# block files in the Caddyfile.d directory, and they will be included as long +# as they use the .caddyfile extension. + +import Caddyfile.d/*.caddyfile diff --git a/package/Caddyfile b/package/Caddyfile new file mode 100644 index 0000000000..e9fa03fef1 --- /dev/null +++ b/package/Caddyfile @@ -0,0 +1,53 @@ +# The Caddyfile is an easy way to configure your Caddy web server. +# +# https://caddyserver.com/docs/caddyfile +# https://frankenphp.dev/docs/config + +{ + {$CADDY_GLOBAL_OPTIONS} + + frankenphp { + worker /usr/share/frankenphp/index.php + {$FRANKENPHP_CONFIG} + } +} + +{$CADDY_EXTRA_CONFIG} + +{$SERVER_NAME:localhost} { + #log { + # # Redact the authorization query parameter that can be set by Mercure + # format filter { + # request>uri query { + # replace authorization REDACTED + # } + # } + #} + + root * /usr/share/frankenphp + encode zstd br gzip + + # Uncomment the following lines to enable Mercure and Vulcain modules + #mercure { + # # Transport to use (default to Bolt) + # transport bolt { + # mercure.db + # } + # # Publisher JWT key + # publisher_jwt {env.MERCURE_PUBLISHER_JWT_KEY} {env.MERCURE_PUBLISHER_JWT_ALG} + # # Subscriber JWT key + # subscriber_jwt {env.MERCURE_SUBSCRIBER_JWT_KEY} {env.MERCURE_SUBSCRIBER_JWT_ALG} + # # Allow anonymous subscribers (double-check that it's what you want) + # anonymous + # # Enable the subscription API (double-check that it's what you want) + # subscriptions + # # Extra directives + # {$MERCURE_EXTRA_DIRECTIVES} + #} + #vulcain + + {$CADDY_SERVER_EXTRA_DIRECTIVES} + + php_server +} + diff --git a/package/content/example.php b/package/content/example.php new file mode 100644 index 0000000000..894393db01 --- /dev/null +++ b/package/content/example.php @@ -0,0 +1,140 @@ + + + + + + + Test Page for FrankenPHP on AlmaLinux + + + + + +

FrankenPHP Test Page

+ +
+
+

This page confirms that the HTTP server powered by FrankenPHP (via the Caddy web server) is operating correctly on this system.

+
+
+ +
+
+

If you are a visitor:

+ +

This default page means the site you tried to access is set up, but no specific content has been deployed yet.

+ +

If you were expecting a different site, it's possible the owner hasn't uploaded any content, or they’re currently making updates.

+ +

If you wish to notify the site administrator, try contacting "webmaster" at the domain you visited. For example: webmaster@example.com.

+ +

Learn more about FrankenPHP at the official website.

+
+
+ +
+

If you are the administrator:

+ +

Your server is running and serving requests using FrankenPHP, integrated as a module within Caddy.

+ +

To replace this page, simply deploy your application files to the configured web root directory in your Caddy setup. If you’re using PHP, FrankenPHP will handle it natively.

+ +

Configuration is handled in your Caddyfile. Make sure your root and php_server directives are properly set for your site.

+ +
+ Requests handled:
+ Last request time: microseconds +
+ +
+ [ Powered by FrankenPHP ] + [ Powered by Caddy ] +
+
+
+
+ + + diff --git a/package/content/public/assets/caddy.png b/package/content/public/assets/caddy.png new file mode 100644 index 0000000000000000000000000000000000000000..f0df626a82f033c6d86dc7b98598a06f7e29c80c GIT binary patch literal 5500 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 literal 0 HcmV?d00001 diff --git a/package/content/public/assets/frankenphp.png b/package/content/public/assets/frankenphp.png new file mode 100644 index 0000000000000000000000000000000000000000..fa527b8f0df40449684637273375fdeb1963d0d9 GIT binary patch literal 180566 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 KKuF!@&i?@S-8p3d literal 0 HcmV?d00001 diff --git a/package/content/public/index.php b/package/content/public/index.php new file mode 100644 index 0000000000..4e71c06ece --- /dev/null +++ b/package/content/public/index.php @@ -0,0 +1,14 @@ + tags as PHP source which should be processed as such. It is +; generally recommended that should be used and that this feature +; should be disabled, as enabling it may result in issues when generating XML +; documents, however this remains supported for backward compatibility reasons. +; Note that this directive does not control the would work. +; https://php.net/syntax-highlighting +;highlight.string = #DD0000 +;highlight.comment = #FF9900 +;highlight.keyword = #007700 +;highlight.default = #0000BB +;highlight.html = #000000 + +; If enabled, the request will be allowed to complete even if the user aborts +; the request. Consider enabling it if executing long requests, which may end up +; being interrupted by the user or a browser timing out. PHP's default behavior +; is to disable this feature. +; https://php.net/ignore-user-abort +;ignore_user_abort = On + +; Determines the size of the realpath cache to be used by PHP. This value should +; be increased on systems where PHP opens many files to reflect the quantity of +; the file operations performed. +; Note: if open_basedir is set, the cache is disabled +; https://php.net/realpath-cache-size +;realpath_cache_size = 4096k + +; Duration of time, in seconds for which to cache realpath information for a given +; file or directory. For systems with rarely changing files, consider increasing this +; value. +; https://php.net/realpath-cache-ttl +;realpath_cache_ttl = 120 + +; Enables or disables the circular reference collector. +; https://php.net/zend.enable-gc +zend.enable_gc = On + +; If enabled, scripts may be written in encodings that are incompatible with +; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such +; encodings. To use this feature, mbstring extension must be enabled. +;zend.multibyte = Off + +; Allows to set the default encoding for the scripts. This value will be used +; unless "declare(encoding=...)" directive appears at the top of the script. +; Only affects if zend.multibyte is set. +;zend.script_encoding = + +; Allows to include or exclude arguments from stack traces generated for exceptions. +; In production, it is recommended to turn this setting on to prohibit the output +; of sensitive information in stack traces +; Default Value: Off +; Development Value: Off +; Production Value: On +zend.exception_ignore_args = On + +; Allows setting the maximum string length in an argument of a stringified stack trace +; to a value between 0 and 1000000. +; This has no effect when zend.exception_ignore_args is enabled. +; Default Value: 15 +; Development Value: 15 +; Production Value: 0 +; In production, it is recommended to set this to 0 to reduce the output +; of sensitive information in stack traces. +zend.exception_string_param_max_len = 0 + +;;;;;;;;;;;;;;;;; +; Miscellaneous ; +;;;;;;;;;;;;;;;;; + +; Decides whether PHP may expose the fact that it is installed on the server +; (e.g. by adding its signature to the Web server header). It is no security +; threat in any way, but it makes it possible to determine whether you use PHP +; on your server or not. +; https://php.net/expose-php +expose_php = On + +;;;;;;;;;;;;;;;;;;; +; Resource Limits ; +;;;;;;;;;;;;;;;;;;; + +; Maximum execution time of each script, in seconds +; https://php.net/max-execution-time +; Note: This directive is hardcoded to 0 for the CLI SAPI +max_execution_time = 30 + +; Maximum amount of time each script may spend parsing request data. It's a good +; idea to limit this time on productions servers in order to eliminate unexpectedly +; long running scripts. +; Note: This directive is hardcoded to -1 for the CLI SAPI +; Default Value: -1 (Unlimited) +; Development Value: 60 (60 seconds) +; Production Value: 60 (60 seconds) +; https://php.net/max-input-time +max_input_time = 60 + +; Maximum input variable nesting level +; https://php.net/max-input-nesting-level +;max_input_nesting_level = 64 + +; How many GET/POST/COOKIE input variables may be accepted +;max_input_vars = 1000 + +; How many multipart body parts (combined input variable and file uploads) may +; be accepted. +; Default Value: -1 (Sum of max_input_vars and max_file_uploads) +;max_multipart_body_parts = 1500 + +; Maximum amount of memory a script may consume +; https://php.net/memory-limit +memory_limit = 128M + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Error handling and logging ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; This directive informs PHP of which errors, warnings and notices you would like +; it to take action for. The recommended way of setting values for this +; directive is through the use of the error level constants and bitwise +; operators. The error level constants are below here for convenience as well as +; some common settings and their meanings. +; By default, PHP is set to take action on all errors, notices and warnings EXCEPT +; those related to E_NOTICE, which together cover best practices and +; recommended coding standards in PHP. For performance reasons, this is the +; recommend error reporting setting. Your production server shouldn't be wasting +; resources complaining about best practices and coding standards. That's what +; development servers and development settings are for. +; Note: The php.ini-development file has this setting as E_ALL. This +; means it pretty much reports everything which is exactly what you want during +; development and early testing. +; +; Error Level Constants: +; E_ALL - All errors and warnings +; E_ERROR - fatal run-time errors +; E_RECOVERABLE_ERROR - almost fatal run-time errors +; E_WARNING - run-time warnings (non-fatal errors) +; E_PARSE - compile-time parse errors +; E_NOTICE - run-time notices (these are warnings which often result +; from a bug in your code, but it's possible that it was +; intentional (e.g., using an uninitialized variable and +; relying on the fact it is automatically initialized to an +; empty string) +; E_CORE_ERROR - fatal errors that occur during PHP's initial startup +; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's +; initial startup +; E_COMPILE_ERROR - fatal compile-time errors +; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) +; E_USER_ERROR - user-generated error message +; E_USER_WARNING - user-generated warning message +; E_USER_NOTICE - user-generated notice message +; E_DEPRECATED - warn about code that will not work in future versions +; of PHP +; E_USER_DEPRECATED - user-generated deprecation warnings +; +; Common Values: +; E_ALL (Show all errors, warnings and notices including coding standards.) +; E_ALL & ~E_NOTICE (Show all errors, except for notices) +; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors) +; Default Value: E_ALL +; Development Value: E_ALL +; Production Value: E_ALL & ~E_DEPRECATED +; https://php.net/error-reporting +error_reporting = E_ALL & ~E_DEPRECATED + +; This directive controls whether or not and where PHP will output errors, +; notices and warnings too. Error output is very useful during development, but +; it could be very dangerous in production environments. Depending on the code +; which is triggering the error, sensitive information could potentially leak +; out of your application such as database usernames and passwords or worse. +; For production environments, we recommend logging errors rather than +; sending them to STDOUT. +; Possible Values: +; Off = Do not display any errors +; stderr = Display errors to STDERR (affects only CGI/CLI binaries!) +; On or stdout = Display errors to STDOUT +; Default Value: On +; Development Value: On +; Production Value: Off +; https://php.net/display-errors +display_errors = Off + +; The display of errors which occur during PHP's startup sequence are handled +; separately from display_errors. We strongly recommend you set this to 'off' +; for production servers to avoid leaking configuration details. +; Default Value: On +; Development Value: On +; Production Value: Off +; https://php.net/display-startup-errors +display_startup_errors = Off + +; Besides displaying errors, PHP can also log errors to locations such as a +; server-specific log, STDERR, or a location specified by the error_log +; directive found below. While errors should not be displayed on productions +; servers they should still be monitored and logging is a great way to do that. +; Default Value: Off +; Development Value: On +; Production Value: On +; https://php.net/log-errors +log_errors = On + +; Do not log repeated messages. Repeated errors must occur in same file on same +; line unless ignore_repeated_source is set true. +; https://php.net/ignore-repeated-errors +ignore_repeated_errors = Off + +; Ignore source of message when ignoring repeated messages. When this setting +; is On you will not log errors with repeated messages from different files or +; source lines. +; https://php.net/ignore-repeated-source +ignore_repeated_source = Off + +; If this parameter is set to Off, then memory leaks will not be shown (on +; stdout or in the log). This is only effective in a debug compile, and if +; error reporting includes E_WARNING in the allowed list +; https://php.net/report-memleaks +report_memleaks = On + +; This setting is off by default. +;report_zend_debug = 0 + +; Turn off normal error reporting and emit XML-RPC error XML +; https://php.net/xmlrpc-errors +;xmlrpc_errors = 0 + +; An XML-RPC faultCode +;xmlrpc_error_number = 0 + +; When PHP displays or logs an error, it has the capability of formatting the +; error message as HTML for easier reading. This directive controls whether +; the error message is formatted as HTML or not. +; Note: This directive is hardcoded to Off for the CLI SAPI +; https://php.net/html-errors +;html_errors = On + +; If html_errors is set to On *and* docref_root is not empty, then PHP +; produces clickable error messages that direct to a page describing the error +; or function causing the error in detail. +; You can download a copy of the PHP manual from https://php.net/docs +; and change docref_root to the base URL of your local copy including the +; leading '/'. You must also specify the file extension being used including +; the dot. PHP's default behavior is to leave these settings empty, in which +; case no links to documentation are generated. +; Note: Never use this feature for production boxes. +; https://php.net/docref-root +; Examples +;docref_root = "/phpmanual/" + +; https://php.net/docref-ext +;docref_ext = .html + +; String to output before an error message. PHP's default behavior is to leave +; this setting blank. +; https://php.net/error-prepend-string +; Example: +;error_prepend_string = "" + +; String to output after an error message. PHP's default behavior is to leave +; this setting blank. +; https://php.net/error-append-string +; Example: +;error_append_string = "" + +; Log errors to specified file. PHP's default behavior is to leave this value +; empty. +; https://php.net/error-log +; Example: +;error_log = php_errors.log +; Log errors to syslog (Event Log on Windows). +;error_log = syslog + +; The syslog ident is a string which is prepended to every message logged +; to syslog. Only used when error_log is set to syslog. +;syslog.ident = php + +; The syslog facility is used to specify what type of program is logging +; the message. Only used when error_log is set to syslog. +;syslog.facility = user + +; Set this to disable filtering control characters (the default). +; Some loggers only accept NVT-ASCII, others accept anything that's not +; control characters. If your logger accepts everything, then no filtering +; is needed at all. +; Allowed values are: +; ascii (all printable ASCII characters and NL) +; no-ctrl (all characters except control characters) +; all (all characters) +; raw (like "all", but messages are not split at newlines) +; https://php.net/syslog.filter +;syslog.filter = ascii + +;windows.show_crt_warning +; Default value: 0 +; Development value: 0 +; Production value: 0 + +;;;;;;;;;;;;;;;;; +; Data Handling ; +;;;;;;;;;;;;;;;;; + +; The separator used in PHP generated URLs to separate arguments. +; PHP's default setting is "&". +; https://php.net/arg-separator.output +; Example: +;arg_separator.output = "&" + +; List of separator(s) used by PHP to parse input URLs into variables. +; PHP's default setting is "&". +; NOTE: Every character in this directive is considered as separator! +; https://php.net/arg-separator.input +; Example: +;arg_separator.input = ";&" + +; This directive determines which super global arrays are registered when PHP +; starts up. G,P,C,E & S are abbreviations for the following respective super +; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty +; paid for the registration of these arrays and because ENV is not as commonly +; used as the others, ENV is not recommended on productions servers. You +; can still get access to the environment variables through getenv() should you +; need to. +; Default Value: "EGPCS" +; Development Value: "GPCS" +; Production Value: "GPCS"; +; https://php.net/variables-order +variables_order = "GPCS" + +; This directive determines which super global data (G,P & C) should be +; registered into the super global array REQUEST. If so, it also determines +; the order in which that data is registered. The values for this directive +; are specified in the same manner as the variables_order directive, +; EXCEPT one. Leaving this value empty will cause PHP to use the value set +; in the variables_order directive. It does not mean it will leave the super +; globals array REQUEST empty. +; Default Value: None +; Development Value: "GP" +; Production Value: "GP" +; https://php.net/request-order +request_order = "GP" + +; This directive determines whether PHP registers $argv & $argc each time it +; runs. $argv contains an array of all the arguments passed to PHP when a script +; is invoked. $argc contains an integer representing the number of arguments +; that were passed when the script was invoked. These arrays are extremely +; useful when running scripts from the command line. When this directive is +; enabled, registering these variables consumes CPU cycles and memory each time +; a script is executed. For performance reasons, this feature should be disabled +; on production servers. +; Note: This directive is hardcoded to On for the CLI SAPI +; Default Value: On +; Development Value: Off +; Production Value: Off +; https://php.net/register-argc-argv +register_argc_argv = Off + +; When enabled, the ENV, REQUEST and SERVER variables are created when they're +; first used (Just In Time) instead of when the script starts. If these +; variables are not used within a script, having this directive on will result +; in a performance gain. The PHP directive register_argc_argv must be disabled +; for this directive to have any effect. +; https://php.net/auto-globals-jit +auto_globals_jit = On + +; Whether PHP will read the POST data. +; This option is enabled by default. +; Most likely, you won't want to disable this option globally. It causes $_POST +; and $_FILES to always be empty; the only way you will be able to read the +; POST data will be through the php://input stream wrapper. This can be useful +; to proxy requests or to process the POST data in a memory efficient fashion. +; https://php.net/enable-post-data-reading +;enable_post_data_reading = Off + +; Maximum size of POST data that PHP will accept. +; Its value may be 0 to disable the limit. It is ignored if POST data reading +; is disabled through enable_post_data_reading. +; https://php.net/post-max-size +post_max_size = 8M + +; Automatically add files before PHP document. +; https://php.net/auto-prepend-file +auto_prepend_file = + +; Automatically add files after PHP document. +; https://php.net/auto-append-file +auto_append_file = + +; By default, PHP will output a media type using the Content-Type header. To +; disable this, simply set it to be empty. +; +; PHP's built-in default media type is set to text/html. +; https://php.net/default-mimetype +default_mimetype = "text/html" + +; PHP's default character set is set to UTF-8. +; https://php.net/default-charset +default_charset = "UTF-8" + +; PHP internal character encoding is set to empty. +; If empty, default_charset is used. +; https://php.net/internal-encoding +;internal_encoding = + +; PHP input character encoding is set to empty. +; If empty, default_charset is used. +; https://php.net/input-encoding +;input_encoding = + +; PHP output character encoding is set to empty. +; If empty, default_charset is used. +; See also output_buffer. +; https://php.net/output-encoding +;output_encoding = + +;;;;;;;;;;;;;;;;;;;;;;;;; +; Paths and Directories ; +;;;;;;;;;;;;;;;;;;;;;;;;; + +; UNIX: "/path1:/path2" +;include_path = ".:/php/includes" +; +; Windows: "\path1;\path2" +;include_path = ".;c:\php\includes" +; +; PHP's default setting for include_path is ".;/path/to/php/pear" +; https://php.net/include-path + +; The root of the PHP pages, used only if nonempty. +; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root +; if you are running php as a CGI under any web server (other than IIS) +; see documentation for security issues. The alternate is to use the +; cgi.force_redirect configuration below +; https://php.net/doc-root +doc_root = + +; The directory under which PHP opens the script using /~username used only +; if nonempty. +; https://php.net/user-dir +user_dir = + +; Directory in which the loadable extensions (modules) reside. +; https://php.net/extension-dir +;extension_dir = "./" +; On windows: +;extension_dir = "ext" + +; Directory where the temporary files should be placed. +; Defaults to the system default (see sys_get_temp_dir) +;sys_temp_dir = "/tmp" + +; Whether or not to enable the dl() function. The dl() function does NOT work +; properly in multithreaded servers, such as IIS or Zeus, and is automatically +; disabled on them. +; https://php.net/enable-dl +enable_dl = Off + +; cgi.force_redirect is necessary to provide security running PHP as a CGI under +; most web servers. Left undefined, PHP turns this on by default. You can +; turn it off here AT YOUR OWN RISK +; **You CAN safely turn this off for IIS, in fact, you MUST.** +; https://php.net/cgi.force-redirect +;cgi.force_redirect = 1 + +; if cgi.nph is enabled it will force cgi to always sent Status: 200 with +; every request. PHP's default behavior is to disable this feature. +;cgi.nph = 1 + +; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape +; (iPlanet) web servers, you MAY need to set an environment variable name that PHP +; will look for to know it is OK to continue execution. Setting this variable MAY +; cause security issues, KNOW WHAT YOU ARE DOING FIRST. +; https://php.net/cgi.redirect-status-env +;cgi.redirect_status_env = + +; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's +; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok +; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting +; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting +; of zero causes PHP to behave as before. Default is 1. You should fix your scripts +; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. +; https://php.net/cgi.fix-pathinfo +;cgi.fix_pathinfo=1 + +; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside +; of the web tree and people will not be able to circumvent .htaccess security. +;cgi.discard_path=1 + +; FastCGI under IIS supports the ability to impersonate +; security tokens of the calling client. This allows IIS to define the +; security context that the request runs under. mod_fastcgi under Apache +; does not currently support this feature (03/17/2002) +; Set to 1 if running under IIS. Default is zero. +; https://php.net/fastcgi.impersonate +;fastcgi.impersonate = 1 + +; Prevent decoding of SCRIPT_FILENAME when using Apache ProxyPass or +; ProxyPassMatch. This should only be used if script file paths are already +; stored in an encoded format on the file system. +; Default is 0. +;fastcgi.script_path_encoded = 1 + +; Disable logging through FastCGI connection. PHP's default behavior is to enable +; this feature. +;fastcgi.logging = 0 + +; cgi.rfc2616_headers configuration option tells PHP what type of headers to +; use when sending HTTP response code. If set to 0, PHP sends Status: header that +; is supported by Apache. When this option is set to 1, PHP will send +; RFC2616 compliant header. +; Default is zero. +; https://php.net/cgi.rfc2616-headers +;cgi.rfc2616_headers = 0 + +; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #! +; (shebang) at the top of the running script. This line might be needed if the +; script support running both as stand-alone script and via PHP CGI<. PHP in CGI +; mode skips this line and ignores its content if this directive is turned on. +; https://php.net/cgi.check-shebang-line +;cgi.check_shebang_line=1 + +;;;;;;;;;;;;;;;; +; File Uploads ; +;;;;;;;;;;;;;;;; + +; Whether to allow HTTP file uploads. +; https://php.net/file-uploads +file_uploads = On + +; Temporary directory for HTTP uploaded files (will use system default if not +; specified). +; https://php.net/upload-tmp-dir +;upload_tmp_dir = + +; Maximum allowed size for uploaded files. +; https://php.net/upload-max-filesize +upload_max_filesize = 2M + +; Maximum number of files that can be uploaded via a single request +max_file_uploads = 20 + +;;;;;;;;;;;;;;;;;; +; Fopen wrappers ; +;;;;;;;;;;;;;;;;;; + +; Whether to allow the treatment of URLs (like http:// or ftp://) as files. +; https://php.net/allow-url-fopen +allow_url_fopen = On + +; Whether to allow include/require to open URLs (like https:// or ftp://) as files. +; https://php.net/allow-url-include +allow_url_include = Off + +; Define the anonymous ftp password (your email address). PHP's default setting +; for this is empty. +; https://php.net/from +;from="john@doe.com" + +; Define the User-Agent string. PHP's default setting for this is empty. +; https://php.net/user-agent +;user_agent="PHP" + +; Default timeout for socket based streams (seconds) +; https://php.net/default-socket-timeout +default_socket_timeout = 60 + +; If your scripts have to deal with files from Macintosh systems, +; or you are running on a Mac and need to deal with files from +; unix or win32 systems, setting this flag will cause PHP to +; automatically detect the EOL character in those files so that +; fgets() and file() will work regardless of the source of the file. +; https://php.net/auto-detect-line-endings +;auto_detect_line_endings = Off + +;;;;;;;;;;;;;;;;;;;;;; +; Dynamic Extensions ; +;;;;;;;;;;;;;;;;;;;;;; + +; If you wish to have an extension loaded automatically, use the following +; syntax: +; +; extension=modulename +; +; For example: +; +; extension=mysqli +; +; When the extension library to load is not located in the default extension +; directory, You may specify an absolute path to the library file: +; +; extension=/path/to/extension/mysqli.so +; +; Note : The syntax used in previous PHP versions ('extension=.so' and +; 'extension='php_.dll') is supported for legacy reasons and may be +; deprecated in a future PHP major version. So, when it is possible, please +; move to the new ('extension=) syntax. +; +; Notes for Windows environments : +; +; - Many DLL files are located in the ext/ +; extension folders as well as the separate PECL DLL download. +; Be sure to appropriately set the extension_dir directive. +; +;extension=bz2 +;extension=curl +;extension=exif +;extension=ffi +;extension=ftp +;extension=fileinfo +;extension=gd +;extension=gettext +;extension=gmp +;extension=intl +;extension=ldap +;extension=mbstring +;extension=mysqli +;extension=odbc +;extension=openssl +;extension=pdo_firebird +;extension=pdo_mysql +;extension=pdo_odbc +;extension=pdo_pgsql +;extension=pdo_sqlite +;extension=pgsql +;extension=shmop + +; The MIBS data available in the PHP distribution must be installed. +; See https://www.php.net/manual/en/snmp.installation.php +;extension=snmp + +;extension=soap +;extension=sockets +;extension=sodium +;extension=sqlite3 +;extension=tidy +;extension=xsl +;extension=zip + +;zend_extension=opcache + +;;;;;;;;;;;;;;;;;;; +; Module Settings ; +;;;;;;;;;;;;;;;;;;; + +[CLI Server] +; Whether the CLI web server uses ANSI color coding in its terminal output. +cli_server.color = On + +[Date] +; Defines the default timezone used by the date functions +; https://php.net/date.timezone +;date.timezone = + +; https://php.net/date.default-latitude +;date.default_latitude = 31.7667 + +; https://php.net/date.default-longitude +;date.default_longitude = 35.2333 + +; https://php.net/date.sunrise-zenith +;date.sunrise_zenith = 90.833333 + +; https://php.net/date.sunset-zenith +;date.sunset_zenith = 90.833333 + +[filter] +; https://php.net/filter.default +;filter.default = unsafe_raw + +; https://php.net/filter.default-flags +;filter.default_flags = + +[iconv] +; Use of this INI entry is deprecated, use global input_encoding instead. +; If empty, default_charset or input_encoding or iconv.input_encoding is used. +; The precedence is: default_charset < input_encoding < iconv.input_encoding +;iconv.input_encoding = + +; Use of this INI entry is deprecated, use global internal_encoding instead. +; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. +; The precedence is: default_charset < internal_encoding < iconv.internal_encoding +;iconv.internal_encoding = + +; Use of this INI entry is deprecated, use global output_encoding instead. +; If empty, default_charset or output_encoding or iconv.output_encoding is used. +; The precedence is: default_charset < output_encoding < iconv.output_encoding +; To use an output encoding conversion, iconv's output handler must be set +; otherwise output encoding conversion cannot be performed. +;iconv.output_encoding = + +[intl] +;intl.default_locale = +; This directive allows you to produce PHP errors when some error +; happens within intl functions. The value is the level of the error produced. +; Default is 0, which does not produce any errors. +;intl.error_level = E_WARNING +;intl.use_exceptions = 0 + +[sqlite3] +; Directory pointing to SQLite3 extensions +; https://php.net/sqlite3.extension-dir +;sqlite3.extension_dir = + +; SQLite defensive mode flag (only available from SQLite 3.26+) +; When the defensive flag is enabled, language features that allow ordinary +; SQL to deliberately corrupt the database file are disabled. This forbids +; writing directly to the schema, shadow tables (eg. FTS data tables), or +; the sqlite_dbpage virtual table. +; https://www.sqlite.org/c3ref/c_dbconfig_defensive.html +; (for older SQLite versions, this flag has no use) +;sqlite3.defensive = 1 + +[Pcre] +; PCRE library backtracking limit. +; https://php.net/pcre.backtrack-limit +;pcre.backtrack_limit=100000 + +; PCRE library recursion limit. +; Please note that if you set this value to a high number you may consume all +; the available process stack and eventually crash PHP (due to reaching the +; stack size limit imposed by the Operating System). +; https://php.net/pcre.recursion-limit +;pcre.recursion_limit=100000 + +; Enables or disables JIT compilation of patterns. This requires the PCRE +; library to be compiled with JIT support. +;pcre.jit=1 + +[Pdo] +; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off" +; https://php.net/pdo-odbc.connection-pooling +;pdo_odbc.connection_pooling=strict + +[Pdo_mysql] +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +pdo_mysql.default_socket= + +[Phar] +; https://php.net/phar.readonly +;phar.readonly = On + +; https://php.net/phar.require-hash +;phar.require_hash = On + +;phar.cache_list = + +[mail function] +; For Win32 only. +; https://php.net/smtp +SMTP = localhost +; https://php.net/smtp-port +smtp_port = 25 + +; For Win32 only. +; https://php.net/sendmail-from +;sendmail_from = me@example.com + +; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). +; https://php.net/sendmail-path +;sendmail_path = + +; Force the addition of the specified parameters to be passed as extra parameters +; to the sendmail binary. These parameters will always replace the value of +; the 5th parameter to mail(). +;mail.force_extra_parameters = + +; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename +mail.add_x_header = Off + +; Use mixed LF and CRLF line separators to keep compatibility with some +; RFC 2822 non conformant MTA. +mail.mixed_lf_and_crlf = Off + +; The path to a log file that will log all mail() calls. Log entries include +; the full path of the script, line number, To address and headers. +;mail.log = +; Log mail to syslog (Event Log on Windows). +;mail.log = syslog + +[ODBC] +; https://php.net/odbc.default-db +;odbc.default_db = Not yet implemented + +; https://php.net/odbc.default-user +;odbc.default_user = Not yet implemented + +; https://php.net/odbc.default-pw +;odbc.default_pw = Not yet implemented + +; Controls the ODBC cursor model. +; Default: SQL_CURSOR_STATIC (default). +;odbc.default_cursortype + +; Allow or prevent persistent links. +; https://php.net/odbc.allow-persistent +odbc.allow_persistent = On + +; Check that a connection is still valid before reuse. +; https://php.net/odbc.check-persistent +odbc.check_persistent = On + +; Maximum number of persistent links. -1 means no limit. +; https://php.net/odbc.max-persistent +odbc.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +; https://php.net/odbc.max-links +odbc.max_links = -1 + +; Handling of LONG fields. Returns number of bytes to variables. 0 means +; passthru. +; https://php.net/odbc.defaultlrl +odbc.defaultlrl = 4096 + +; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. +; See the documentation on odbc_binmode and odbc_longreadlen for an explanation +; of odbc.defaultlrl and odbc.defaultbinmode +; https://php.net/odbc.defaultbinmode +odbc.defaultbinmode = 1 + +[MySQLi] + +; Maximum number of persistent links. -1 means no limit. +; https://php.net/mysqli.max-persistent +mysqli.max_persistent = -1 + +; Allow accessing, from PHP's perspective, local files with LOAD DATA statements +; https://php.net/mysqli.allow_local_infile +;mysqli.allow_local_infile = On + +; It allows the user to specify a folder where files that can be sent via LOAD DATA +; LOCAL can exist. It is ignored if mysqli.allow_local_infile is enabled. +;mysqli.local_infile_directory = + +; Allow or prevent persistent links. +; https://php.net/mysqli.allow-persistent +mysqli.allow_persistent = On + +; Maximum number of links. -1 means no limit. +; https://php.net/mysqli.max-links +mysqli.max_links = -1 + +; Default port number for mysqli_connect(). +; https://php.net/mysqli.default-port +mysqli.default_port = 3306 + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +; https://php.net/mysqli.default-socket +mysqli.default_socket = + +; Default host for mysqli_connect(). +; https://php.net/mysqli.default-host +mysqli.default_host = + +; Default user for mysqli_connect(). +; https://php.net/mysqli.default-user +mysqli.default_user = + +; Default password for mysqli_connect(). +; Note that this is generally a *bad* idea to store passwords in this file. +; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") +; and reveal this password! And of course, any users with read access to this +; file will be able to reveal the password as well. +; https://php.net/mysqli.default-pw +mysqli.default_pw = + +; If this option is enabled, closing a persistent connection will rollback +; any pending transactions of this connection, before it is put back +; into the persistent connection pool. +;mysqli.rollback_on_cached_plink = Off + +[mysqlnd] +; Enable / Disable collection of general statistics by mysqlnd which can be +; used to tune and monitor MySQL operations. +mysqlnd.collect_statistics = On + +; Enable / Disable collection of memory usage statistics by mysqlnd which can be +; used to tune and monitor MySQL operations. +; Default Value: Off +; Development Value: On +; Production Value: Off +mysqlnd.collect_memory_statistics = Off + +; Records communication from all extensions using mysqlnd to the specified log +; file. +; https://php.net/mysqlnd.debug +;mysqlnd.debug = + +; Defines which queries will be logged. +;mysqlnd.log_mask = 0 + +; Default size of the mysqlnd memory pool, which is used by result sets. +;mysqlnd.mempool_default_size = 16000 + +; Size of a pre-allocated buffer used when sending commands to MySQL in bytes. +;mysqlnd.net_cmd_buffer_size = 2048 + +; Size of a pre-allocated buffer used for reading data sent by the server in +; bytes. +;mysqlnd.net_read_buffer_size = 32768 + +; Timeout for network requests in seconds. +;mysqlnd.net_read_timeout = 31536000 + +; SHA-256 Authentication Plugin related. File with the MySQL server public RSA +; key. +;mysqlnd.sha256_server_public_key = + +[PostgreSQL] +; Allow or prevent persistent links. +; https://php.net/pgsql.allow-persistent +pgsql.allow_persistent = On + +; Detect broken persistent links always with pg_pconnect(). +; Auto reset feature requires a little overheads. +; https://php.net/pgsql.auto-reset-persistent +pgsql.auto_reset_persistent = Off + +; Maximum number of persistent links. -1 means no limit. +; https://php.net/pgsql.max-persistent +pgsql.max_persistent = -1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +; https://php.net/pgsql.max-links +pgsql.max_links = -1 + +; Ignore PostgreSQL backends Notice message or not. +; Notice message logging require a little overheads. +; https://php.net/pgsql.ignore-notice +pgsql.ignore_notice = 0 + +; Log PostgreSQL backends Notice message or not. +; Unless pgsql.ignore_notice=0, module cannot log notice message. +; https://php.net/pgsql.log-notice +pgsql.log_notice = 0 + +[bcmath] +; Number of decimal digits for all bcmath functions. +; https://php.net/bcmath.scale +bcmath.scale = 0 + +[browscap] +; https://php.net/browscap +;browscap = extra/browscap.ini + +[Session] +; Handler used to store/retrieve data. +; https://php.net/session.save-handler +session.save_handler = files + +; Argument passed to save_handler. In the case of files, this is the path +; where data files are stored. Note: Windows users have to change this +; variable in order to use PHP's session functions. +; +; The path can be defined as: +; +; session.save_path = "N;/path" +; +; where N is an integer. Instead of storing all the session files in +; /path, what this will do is use subdirectories N-levels deep, and +; store the session data in those directories. This is useful if +; your OS has problems with many files in one directory, and is +; a more efficient layout for servers that handle many sessions. +; +; NOTE 1: PHP will not create this directory structure automatically. +; You can use the script in the ext/session dir for that purpose. +; NOTE 2: See the section on garbage collection below if you choose to +; use subdirectories for session storage +; +; The file storage module creates files using mode 600 by default. +; You can change that by using +; +; session.save_path = "N;MODE;/path" +; +; where MODE is the octal representation of the mode. Note that this +; does not overwrite the process's umask. +; https://php.net/session.save-path +;session.save_path = "/tmp" + +; Whether to use strict session mode. +; Strict session mode does not accept an uninitialized session ID, and +; regenerates the session ID if the browser sends an uninitialized session ID. +; Strict mode protects applications from session fixation via a session adoption +; vulnerability. It is disabled by default for maximum compatibility, but +; enabling it is encouraged. +; https://wiki.php.net/rfc/strict_sessions +session.use_strict_mode = 0 + +; Whether to use cookies. +; https://php.net/session.use-cookies +session.use_cookies = 1 + +; https://php.net/session.cookie-secure +;session.cookie_secure = + +; This option forces PHP to fetch and use a cookie for storing and maintaining +; the session id. We encourage this operation as it's very helpful in combating +; session hijacking when not specifying and managing your own session id. It is +; not the be-all and end-all of session hijacking defense, but it's a good start. +; https://php.net/session.use-only-cookies +session.use_only_cookies = 1 + +; Name of the session (used as cookie name). +; https://php.net/session.name +session.name = PHPSESSID + +; Initialize session on request startup. +; https://php.net/session.auto-start +session.auto_start = 0 + +; Lifetime in seconds of cookie or, if 0, until browser is restarted. +; https://php.net/session.cookie-lifetime +session.cookie_lifetime = 0 + +; The path for which the cookie is valid. +; https://php.net/session.cookie-path +session.cookie_path = / + +; The domain for which the cookie is valid. +; https://php.net/session.cookie-domain +session.cookie_domain = + +; Whether or not to add the httpOnly flag to the cookie, which makes it +; inaccessible to browser scripting languages such as JavaScript. +; https://php.net/session.cookie-httponly +session.cookie_httponly = + +; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF) +; Current valid values are "Strict", "Lax" or "None". When using "None", +; make sure to include the quotes, as `none` is interpreted like `false` in ini files. +; https://tools.ietf.org/html/draft-west-first-party-cookies-07 +session.cookie_samesite = + +; Handler used to serialize data. php is the standard serializer of PHP. +; https://php.net/session.serialize-handler +session.serialize_handler = php + +; Defines the probability that the 'garbage collection' process is started on every +; session initialization. The probability is calculated by using gc_probability/gc_divisor, +; e.g. 1/100 means there is a 1% chance that the GC process starts on each request. +; Default Value: 1 +; Development Value: 1 +; Production Value: 1 +; https://php.net/session.gc-probability +session.gc_probability = 1 + +; Defines the probability that the 'garbage collection' process is started on every +; session initialization. The probability is calculated by using gc_probability/gc_divisor, +; e.g. 1/100 means there is a 1% chance that the GC process starts on each request. +; For high volume production servers, using a value of 1000 is a more efficient approach. +; Default Value: 100 +; Development Value: 1000 +; Production Value: 1000 +; https://php.net/session.gc-divisor +session.gc_divisor = 1000 + +; After this number of seconds, stored data will be seen as 'garbage' and +; cleaned up by the garbage collection process. +; https://php.net/session.gc-maxlifetime +session.gc_maxlifetime = 1440 + +; NOTE: If you are using the subdirectory option for storing session files +; (see session.save_path above), then garbage collection does *not* +; happen automatically. You will need to do your own garbage +; collection through a shell script, cron entry, or some other method. +; For example, the following script is the equivalent of setting +; session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): +; find /path/to/sessions -cmin +24 -type f | xargs rm + +; Check HTTP Referer to invalidate externally stored URLs containing ids. +; HTTP_REFERER has to contain this substring for the session to be +; considered as valid. +; https://php.net/session.referer-check +session.referer_check = + +; Set to {nocache,private,public,} to determine HTTP caching aspects +; or leave this empty to avoid sending anti-caching headers. +; https://php.net/session.cache-limiter +session.cache_limiter = nocache + +; Document expires after n minutes. +; https://php.net/session.cache-expire +session.cache_expire = 180 + +; trans sid support is disabled by default. +; Use of trans sid may risk your users' security. +; Use this option with caution. +; - User may send URL contains active session ID +; to other person via. email/irc/etc. +; - URL that contains active session ID may be stored +; in publicly accessible computer. +; - User may access your site with the same session ID +; always using URL stored in browser's history or bookmarks. +; https://php.net/session.use-trans-sid +session.use_trans_sid = 0 + +; The URL rewriter will look for URLs in a defined set of HTML tags. +;
is special; if you include them here, the rewriter will +; add a hidden field with the info which is otherwise appended +; to URLs. tag's action attribute URL will not be modified +; unless it is specified. +; Note that all valid entries require a "=", even if no value follows. +; Default Value: "a=href,area=href,frame=src,form=" +; Development Value: "a=href,area=href,frame=src,form=" +; Production Value: "a=href,area=href,frame=src,form=" +; https://php.net/url-rewriter.tags +session.trans_sid_tags = "a=href,area=href,frame=src,form=" + +; URL rewriter does not rewrite absolute URLs by default. +; To enable rewrites for absolute paths, target hosts must be specified +; at RUNTIME. i.e. use ini_set() +; tags is special. PHP will check action attribute's URL regardless +; of session.trans_sid_tags setting. +; If no host is defined, HTTP_HOST will be used for allowed host. +; Example value: php.net,www.php.net,wiki.php.net +; Use "," for multiple hosts. No spaces are allowed. +; Default Value: "" +; Development Value: "" +; Production Value: "" +;session.trans_sid_hosts="" + +; Enable upload progress tracking in $_SESSION +; Default Value: On +; Development Value: On +; Production Value: On +; https://php.net/session.upload-progress.enabled +;session.upload_progress.enabled = On + +; Cleanup the progress information as soon as all POST data has been read +; (i.e. upload completed). +; Default Value: On +; Development Value: On +; Production Value: On +; https://php.net/session.upload-progress.cleanup +;session.upload_progress.cleanup = On + +; A prefix used for the upload progress key in $_SESSION +; Default Value: "upload_progress_" +; Development Value: "upload_progress_" +; Production Value: "upload_progress_" +; https://php.net/session.upload-progress.prefix +;session.upload_progress.prefix = "upload_progress_" + +; The index name (concatenated with the prefix) in $_SESSION +; containing the upload progress information +; Default Value: "PHP_SESSION_UPLOAD_PROGRESS" +; Development Value: "PHP_SESSION_UPLOAD_PROGRESS" +; Production Value: "PHP_SESSION_UPLOAD_PROGRESS" +; https://php.net/session.upload-progress.name +;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" + +; How frequently the upload progress should be updated. +; Given either in percentages (per-file), or in bytes +; Default Value: "1%" +; Development Value: "1%" +; Production Value: "1%" +; https://php.net/session.upload-progress.freq +;session.upload_progress.freq = "1%" + +; The minimum delay between updates, in seconds +; Default Value: 1 +; Development Value: 1 +; Production Value: 1 +; https://php.net/session.upload-progress.min-freq +;session.upload_progress.min_freq = "1" + +; Only write session data when session data is changed. Enabled by default. +; https://php.net/session.lazy-write +;session.lazy_write = On + +[Assertion] +; Switch whether to compile assertions at all (to have no overhead at run-time) +; -1: Do not compile at all +; 0: Jump over assertion at run-time +; 1: Execute assertions +; Changing from or to a negative value is only possible in php.ini! +; (For turning assertions on and off at run-time, toggle zend.assertions between the values 1 and 0) +; Default Value: 1 +; Development Value: 1 +; Production Value: -1 +; https://php.net/zend.assertions +zend.assertions = -1 + +[COM] +; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs +; https://php.net/com.typelib-file +;com.typelib_file = + +; allow Distributed-COM calls +; https://php.net/com.allow-dcom +;com.allow_dcom = true + +; autoregister constants of a component's typelib on com_load() +; https://php.net/com.autoregister-typelib +;com.autoregister_typelib = true + +; register constants casesensitive +; https://php.net/com.autoregister-casesensitive +;com.autoregister_casesensitive = false + +; show warnings on duplicate constant registrations +; https://php.net/com.autoregister-verbose +;com.autoregister_verbose = true + +; The default character set code-page to use when passing strings to and from COM objects. +; Default: system ANSI code page +;com.code_page= + +; The version of the .NET framework to use. The value of the setting are the first three parts +; of the framework's version number, separated by dots, and prefixed with "v", e.g. "v4.0.30319". +;com.dotnet_version= + +[mbstring] +; language for internal character representation. +; This affects mb_send_mail() and mbstring.detect_order. +; https://php.net/mbstring.language +;mbstring.language = Japanese + +; Use of this INI entry is deprecated, use global internal_encoding instead. +; internal/script encoding. +; Some encoding cannot work as internal encoding. (e.g. SJIS, BIG5, ISO-2022-*) +; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. +; The precedence is: default_charset < internal_encoding < iconv.internal_encoding +;mbstring.internal_encoding = + +; Use of this INI entry is deprecated, use global input_encoding instead. +; http input encoding. +; mbstring.encoding_translation = On is needed to use this setting. +; If empty, default_charset or input_encoding or mbstring.input is used. +; The precedence is: default_charset < input_encoding < mbstring.http_input +; https://php.net/mbstring.http-input +;mbstring.http_input = + +; Use of this INI entry is deprecated, use global output_encoding instead. +; http output encoding. +; mb_output_handler must be registered as output buffer to function. +; If empty, default_charset or output_encoding or mbstring.http_output is used. +; The precedence is: default_charset < output_encoding < mbstring.http_output +; To use an output encoding conversion, mbstring's output handler must be set +; otherwise output encoding conversion cannot be performed. +; https://php.net/mbstring.http-output +;mbstring.http_output = + +; enable automatic encoding translation according to +; mbstring.internal_encoding setting. Input chars are +; converted to internal encoding by setting this to On. +; Note: Do _not_ use automatic encoding translation for +; portable libs/applications. +; https://php.net/mbstring.encoding-translation +;mbstring.encoding_translation = Off + +; automatic encoding detection order. +; "auto" detect order is changed according to mbstring.language +; https://php.net/mbstring.detect-order +;mbstring.detect_order = auto + +; substitute_character used when character cannot be converted +; one from another +; https://php.net/mbstring.substitute-character +;mbstring.substitute_character = none + +; Enable strict encoding detection. +;mbstring.strict_detection = Off + +; This directive specifies the regex pattern of content types for which mb_output_handler() +; is activated. +; Default: mbstring.http_output_conv_mimetypes=^(text/|application/xhtml\+xml) +;mbstring.http_output_conv_mimetypes= + +; This directive specifies maximum stack depth for mbstring regular expressions. It is similar +; to the pcre.recursion_limit for PCRE. +;mbstring.regex_stack_limit=100000 + +; This directive specifies maximum retry count for mbstring regular expressions. It is similar +; to the pcre.backtrack_limit for PCRE. +;mbstring.regex_retry_limit=1000000 + +[gd] +; Tell the jpeg decode to ignore warnings and try to create +; a gd image. The warning will then be displayed as notices +; disabled by default +; https://php.net/gd.jpeg-ignore-warning +;gd.jpeg_ignore_warning = 1 + +[exif] +; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS. +; With mbstring support this will automatically be converted into the encoding +; given by corresponding encode setting. When empty mbstring.internal_encoding +; is used. For the decode settings you can distinguish between motorola and +; intel byte order. A decode setting must not be empty. +; https://php.net/exif.encode-unicode +;exif.encode_unicode = ISO-8859-15 + +; https://php.net/exif.decode-unicode-motorola +;exif.decode_unicode_motorola = UCS-2BE + +; https://php.net/exif.decode-unicode-intel +;exif.decode_unicode_intel = UCS-2LE + +; https://php.net/exif.encode-jis +;exif.encode_jis = + +; https://php.net/exif.decode-jis-motorola +;exif.decode_jis_motorola = JIS + +; https://php.net/exif.decode-jis-intel +;exif.decode_jis_intel = JIS + +[Tidy] +; The path to a default tidy configuration file to use when using tidy +; https://php.net/tidy.default-config +;tidy.default_config = /usr/local/lib/php/default.tcfg + +; Should tidy clean and repair output automatically? +; WARNING: Do not use this option if you are generating non-html content +; such as dynamic images +; https://php.net/tidy.clean-output +tidy.clean_output = Off + +[soap] +; Enables or disables WSDL caching feature. +; https://php.net/soap.wsdl-cache-enabled +soap.wsdl_cache_enabled=1 + +; Sets the directory name where SOAP extension will put cache files. +; https://php.net/soap.wsdl-cache-dir +soap.wsdl_cache_dir="/tmp" + +; (time to live) Sets the number of second while cached file will be used +; instead of original one. +; https://php.net/soap.wsdl-cache-ttl +soap.wsdl_cache_ttl=86400 + +; Sets the size of the cache limit. (Max. number of WSDL files to cache) +soap.wsdl_cache_limit = 5 + +[sysvshm] +; A default size of the shared memory segment +;sysvshm.init_mem = 10000 + +[ldap] +; Sets the maximum number of open links or -1 for unlimited. +ldap.max_links = -1 + +[dba] +;dba.default_handler= + +[opcache] +; Determines if Zend OPCache is enabled +;opcache.enable=1 + +; Determines if Zend OPCache is enabled for the CLI version of PHP +;opcache.enable_cli=0 + +; The OPcache shared memory storage size. +;opcache.memory_consumption=128 + +; The amount of memory for interned strings in Mbytes. +;opcache.interned_strings_buffer=8 + +; The maximum number of keys (scripts) in the OPcache hash table. +; Only numbers between 200 and 1000000 are allowed. +;opcache.max_accelerated_files=10000 + +; The maximum percentage of "wasted" memory until a restart is scheduled. +;opcache.max_wasted_percentage=5 + +; When this directive is enabled, the OPcache appends the current working +; directory to the script key, thus eliminating possible collisions between +; files with the same name (basename). Disabling the directive improves +; performance, but may break existing applications. +;opcache.use_cwd=1 + +; When disabled, you must reset the OPcache manually or restart the +; webserver for changes to the filesystem to take effect. +;opcache.validate_timestamps=1 + +; How often (in seconds) to check file timestamps for changes to the shared +; memory storage allocation. ("1" means validate once per second, but only +; once per request. "0" means always validate) +;opcache.revalidate_freq=2 + +; Enables or disables file search in include_path optimization +;opcache.revalidate_path=0 + +; If disabled, all PHPDoc comments are dropped from the code to reduce the +; size of the optimized code. +;opcache.save_comments=1 + +; If enabled, compilation warnings (including notices and deprecations) will +; be recorded and replayed each time a file is included. Otherwise, compilation +; warnings will only be emitted when the file is first cached. +;opcache.record_warnings=0 + +; Allow file existence override (file_exists, etc.) performance feature. +;opcache.enable_file_override=0 + +; A bitmask, where each bit enables or disables the appropriate OPcache +; passes +;opcache.optimization_level=0x7FFFBFFF + +;opcache.dups_fix=0 + +; The location of the OPcache blacklist file (wildcards allowed). +; Each OPcache blacklist file is a text file that holds the names of files +; that should not be accelerated. The file format is to add each filename +; to a new line. The filename may be a full path or just a file prefix +; (i.e., /var/www/x blacklists all the files and directories in /var/www +; that start with 'x'). Line starting with a ; are ignored (comments). +;opcache.blacklist_filename= + +; Allows exclusion of large files from being cached. By default all files +; are cached. +;opcache.max_file_size=0 + +; How long to wait (in seconds) for a scheduled restart to begin if the cache +; is not being accessed. +;opcache.force_restart_timeout=180 + +; OPcache error_log file name. Empty string assumes "stderr". +;opcache.error_log= + +; All OPcache errors go to the Web server log. +; By default, only fatal errors (level 0) or errors (level 1) are logged. +; You can also enable warnings (level 2), info messages (level 3) or +; debug messages (level 4). +;opcache.log_verbosity_level=1 + +; Preferred Shared Memory back-end. Leave empty and let the system decide. +;opcache.preferred_memory_model= + +; Protect the shared memory from unexpected writing during script execution. +; Useful for internal debugging only. +;opcache.protect_memory=0 + +; Allows calling OPcache API functions only from PHP scripts which path is +; started from specified string. The default "" means no restriction +;opcache.restrict_api= + +; Mapping base of shared memory segments (for Windows only). All the PHP +; processes have to map shared memory into the same address space. This +; directive allows to manually fix the "Unable to reattach to base address" +; errors. +;opcache.mmap_base= + +; Facilitates multiple OPcache instances per user (for Windows only). All PHP +; processes with the same cache ID and user share an OPcache instance. +;opcache.cache_id= + +; Enables and sets the second level cache directory. +; It should improve performance when SHM memory is full, at server restart or +; SHM reset. The default "" disables file based caching. +;opcache.file_cache= + +; Enables or disables read-only mode for the second level cache directory. +; It should improve performance for read-only containers, +; when the cache is pre-warmed and packaged alongside the application. +; Best used with `opcache.validate_timestamps=0`, `opcache.enable_file_override=1` +; and `opcache.file_cache_consistency_checks=0`. +; Note: A cache generated with a different build of PHP, a different file path, +; or different settings (including which extensions are loaded), may be ignored. +;opcache.file_cache_read_only=0 + +; Enables or disables opcode caching in shared memory. +;opcache.file_cache_only=0 + +; Enables or disables checksum validation when script loaded from file cache. +;opcache.file_cache_consistency_checks=1 + +; Implies opcache.file_cache_only=1 for a certain process that failed to +; reattach to the shared memory (for Windows only). Explicitly enabled file +; cache is required. +;opcache.file_cache_fallback=1 + +; Enables or disables copying of PHP code (text segment) into HUGE PAGES. +; Under certain circumstances (if only a single global PHP process is +; started from which all others fork), this can increase performance +; by a tiny amount because TLB misses are reduced. On the other hand, this +; delays PHP startup, increases memory usage and degrades performance +; under memory pressure - use with care. +; Requires appropriate OS configuration. +;opcache.huge_code_pages=0 + +; Validate cached file permissions. +;opcache.validate_permission=0 + +; Prevent name collisions in chroot'ed environment. +;opcache.validate_root=0 + +; If specified, it produces opcode dumps for debugging different stages of +; optimizations. +;opcache.opt_debug_level=0 + +; Specifies a PHP script that is going to be compiled and executed at server +; start-up. +; https://php.net/opcache.preload +;opcache.preload= + +; Preloading code as root is not allowed for security reasons. This directive +; facilitates to let the preloading to be run as another user. +; https://php.net/opcache.preload_user +;opcache.preload_user= + +; Prevents caching files that are less than this number of seconds old. It +; protects from caching of incompletely updated files. In case all file updates +; on your site are atomic, you may increase performance by setting it to "0". +;opcache.file_update_protection=2 + +; Absolute path used to store shared lockfiles (for *nix only). +;opcache.lockfile_path=/tmp + +[curl] +; A default value for the CURLOPT_CAINFO option. This is required to be an +; absolute path. +;curl.cainfo = + +[openssl] +; The location of a Certificate Authority (CA) file on the local filesystem +; to use when verifying the identity of SSL/TLS peers. Most users should +; not specify a value for this directive as PHP will attempt to use the +; OS-managed cert stores in its absence. If specified, this value may still +; be overridden on a per-stream basis via the "cafile" SSL stream context +; option. +;openssl.cafile= + +; If openssl.cafile is not specified or if the CA file is not found, the +; directory pointed to by openssl.capath is searched for a suitable +; certificate. This value must be a correctly hashed certificate directory. +; Most users should not specify a value for this directive as PHP will +; attempt to use the OS-managed cert stores in its absence. If specified, +; this value may still be overridden on a per-stream basis via the "capath" +; SSL stream context option. +;openssl.capath= + +[ffi] +; FFI API restriction. Possible values: +; "preload" - enabled in CLI scripts and preloaded files (default) +; "false" - always disabled +; "true" - always enabled +;ffi.enable=preload + +; List of headers files to preload, wildcard patterns allowed. +;ffi.preload= \ No newline at end of file diff --git a/package/frankenphp.service b/package/frankenphp.service new file mode 100644 index 0000000000..8cc372b525 --- /dev/null +++ b/package/frankenphp.service @@ -0,0 +1,21 @@ +[Unit] +Description=FrankenPHP server +After=network.target + +[Service] +Type=notify +User=caddy +Group=caddy +ExecStartPre=/usr/bin/frankenphp validate --config /etc/frankenphp/Caddyfile +ExecStart=/usr/bin/frankenphp run --environ --config /etc/frankenphp/Caddyfile +ExecReload=/usr/bin/frankenphp reload --config /etc/frankenphp/Caddyfile +TimeoutStopSec=5s +LimitNOFILE=1048576 +LimitNPROC=512 +PrivateTmp=true +ProtectHome=true +ProtectSystem=full +AmbientCapabilities=CAP_NET_BIND_SERVICE + +[Install] +WantedBy=multi-user.target \ No newline at end of file From baddcf19fb2201d1051f6858bd0e87cd707b69c8 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 14 Apr 2025 22:54:37 +0700 Subject: [PATCH 12/75] make file executable --- build-packages.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 build-packages.sh diff --git a/build-packages.sh b/build-packages.sh old mode 100644 new mode 100755 From 55141aef03ac687b39bae1279500ef60ae381280 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 14 Apr 2025 22:56:13 +0700 Subject: [PATCH 13/75] worker is in public folder --- package/Caddyfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/Caddyfile b/package/Caddyfile index e9fa03fef1..710abebd75 100644 --- a/package/Caddyfile +++ b/package/Caddyfile @@ -7,7 +7,7 @@ {$CADDY_GLOBAL_OPTIONS} frankenphp { - worker /usr/share/frankenphp/index.php + worker /usr/share/frankenphp/public/index.php {$FRANKENPHP_CONFIG} } } From 391f759e74e0f0bc84cb584d47bf610fe9f87009 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 14 Apr 2025 22:57:08 +0700 Subject: [PATCH 14/75] what on earth did I do x) --- package/Caddyfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/Caddyfile b/package/Caddyfile index 710abebd75..5495ca626b 100644 --- a/package/Caddyfile +++ b/package/Caddyfile @@ -24,7 +24,7 @@ # } #} - root * /usr/share/frankenphp + root * /usr/share/frankenphp/public/ encode zstd br gzip # Uncomment the following lines to enable Mercure and Vulcain modules From 0fc0ec863770c5cf8bfdde665db0a0bc269fa03a Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 15 Apr 2025 10:36:06 +0700 Subject: [PATCH 15/75] use same FRANKENPHP_VERSION and make sure to let pr's run the rpm generation too (version 0.0.0) to see issues --- .github/workflows/static.yaml | 1 + build-packages.sh | 22 +++++++++++++++++++++- static-builder-gnu.Dockerfile | 7 ++++++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/.github/workflows/static.yaml b/.github/workflows/static.yaml index a6ed634c32..287cd6682f 100644 --- a/.github/workflows/static.yaml +++ b/.github/workflows/static.yaml @@ -216,6 +216,7 @@ jobs: targets: static-builder-gnu set: | ${{ (github.event_name == 'pull_request' || matrix.platform == 'linux/arm64') && 'static-builder-gnu.args.NO_COMPRESS=1' || '' }} + static-builder-gnu.args.BUILD_PACKAGES=1 *.tags= *.platform=${{ matrix.platform }} *.cache-from=type=gha,scope=${{ needs.prepare.outputs.ref || github.ref }}-static-builder-gnu diff --git a/build-packages.sh b/build-packages.sh index 096077a12d..670d085e31 100755 --- a/build-packages.sh +++ b/build-packages.sh @@ -31,9 +31,29 @@ if [ ! -f "dist/$bin" ]; then exit 1 fi +if [ -z "${FRANKENPHP_VERSION}" ]; then + FRANKENPHP_VERSION="$(git rev-parse --verify HEAD)" + export FRANKENPHP_VERSION +elif [ -d ".git/" ]; then + CURRENT_REF="$(git rev-parse --abbrev-ref HEAD)" + export CURRENT_REF + + if echo "${FRANKENPHP_VERSION}" | grep -F -q "."; then + # Tag + + # Trim "v" prefix if any + FRANKENPHP_VERSION=${FRANKENPHP_VERSION#v} + export FRANKENPHP_VERSION + + git checkout "v${FRANKENPHP_VERSION}" + else + git checkout "${FRANKENPHP_VERSION}" + fi +fi + if [[ ! "${FRANKENPHP_VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "Error: FRANKENPHP_VERSION must be set to X.Y.Z (e.g. 1.5.1), got '${FRANKENPHP_VERSION}'" - exit 1 + FRANKENPHP_VERSION=0.0.0 fi iteration="1" diff --git a/static-builder-gnu.Dockerfile b/static-builder-gnu.Dockerfile index 44123bb627..268fa84c6c 100644 --- a/static-builder-gnu.Dockerfile +++ b/static-builder-gnu.Dockerfile @@ -6,6 +6,8 @@ FROM centos:7 ARG FRANKENPHP_VERSION='' ENV FRANKENPHP_VERSION=${FRANKENPHP_VERSION} +ARG BUILD_PACKAGES='' + ARG PHP_VERSION='' ENV PHP_VERSION=${PHP_VERSION} @@ -136,4 +138,7 @@ COPY --link caddy caddy COPY --link internal internal RUN --mount=type=secret,id=github-token ./build-static.sh && \ - rm -Rf dist/static-php-cli/source/* + rm -Rf dist/static-php-cli/source/* && \ + if [ "${BUILD_PACKAGES}" != "" ]; then \ + ./build-packages.sh; \ + fi From 0ded8dc1dfd9232345fff61375dc11d4652029bb Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 15 Apr 2025 10:38:52 +0700 Subject: [PATCH 16/75] install ruby, fpm and rpm-build --- static-builder-gnu.Dockerfile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/static-builder-gnu.Dockerfile b/static-builder-gnu.Dockerfile index 268fa84c6c..c2c623e2d9 100644 --- a/static-builder-gnu.Dockerfile +++ b/static-builder-gnu.Dockerfile @@ -43,6 +43,11 @@ RUN sed -i 's/mirror.centos.org/vault.centos.org/g' /etc/yum.repos.d/*.repo && \ yum update -y && \ yum install -y centos-release-scl +RUN if [ "${BUILD_PACKAGES}" != "" ]; then \ + yum install -y ruby rpm-build && \ + gem install fpm; \ + fi + # different arch for different scl repo RUN if [ "$(uname -m)" = "aarch64" ]; then \ sed -i 's|mirror.centos.org/centos|vault.centos.org/altarch|g' /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo ; \ From 3a0593d5bb1e3c4cf8aeb4bb33576ff7811c6ac4 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 15 Apr 2025 10:41:59 +0700 Subject: [PATCH 17/75] move to after changing base urls because it would fail with packages not found --- static-builder-gnu.Dockerfile | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/static-builder-gnu.Dockerfile b/static-builder-gnu.Dockerfile index c2c623e2d9..a74be6ec63 100644 --- a/static-builder-gnu.Dockerfile +++ b/static-builder-gnu.Dockerfile @@ -43,11 +43,6 @@ RUN sed -i 's/mirror.centos.org/vault.centos.org/g' /etc/yum.repos.d/*.repo && \ yum update -y && \ yum install -y centos-release-scl -RUN if [ "${BUILD_PACKAGES}" != "" ]; then \ - yum install -y ruby rpm-build && \ - gem install fpm; \ - fi - # different arch for different scl repo RUN if [ "$(uname -m)" = "aarch64" ]; then \ sed -i 's|mirror.centos.org/centos|vault.centos.org/altarch|g' /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo ; \ @@ -70,6 +65,12 @@ RUN curl -o cmake.tgz -fsSL https://github.com/Kitware/CMake/releases/download/v tar -xzf cmake.tgz -C /cmake --strip-components 1 && \ rm cmake.tgz +# install tools to build packages, if requested +RUN if [ "${BUILD_PACKAGES}" != "" ]; then \ + yum install -y ruby rpm-build && \ + gem install fpm; \ + fi + # install build essentials RUN yum install -y \ perl \ From 1999713e8bff0920eef4780a5a8715a40a793f73 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 15 Apr 2025 11:12:26 +0700 Subject: [PATCH 18/75] ruby 3 build needs gcc 10 --- static-builder-gnu.Dockerfile | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/static-builder-gnu.Dockerfile b/static-builder-gnu.Dockerfile index a74be6ec63..30801848af 100644 --- a/static-builder-gnu.Dockerfile +++ b/static-builder-gnu.Dockerfile @@ -65,12 +65,6 @@ RUN curl -o cmake.tgz -fsSL https://github.com/Kitware/CMake/releases/download/v tar -xzf cmake.tgz -C /cmake --strip-components 1 && \ rm cmake.tgz -# install tools to build packages, if requested -RUN if [ "${BUILD_PACKAGES}" != "" ]; then \ - yum install -y ruby rpm-build && \ - gem install fpm; \ - fi - # install build essentials RUN yum install -y \ perl \ @@ -130,6 +124,20 @@ ENV EXTENSION_DIR='/usr/lib/frankenphp/modules' # not sure if this is needed ENV COMPOSER_ALLOW_SUPERUSER=1 +# install tools to build packages, if requested - needs gcc 10 +RUN if [ "${BUILD_PACKAGES}" != "" ]; then \ + yum install -y make bzip2 openssl-devel libffi-devel zlib-devel libyaml libyaml-devel && \ + curl -o ruby.tar.gz -fsSL https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz && \ + tar -xzf ruby.tar.gz && \ + cd ruby-3.2.2 && \ + ./configure --without-baseruby && \ + make && \ + make install && \ + cd .. && \ + rm -rf ruby-3.2.2 ruby.tar.gz && \ + gem install fpm; \ + fi + WORKDIR /go/src/app COPY go.mod go.sum ./ RUN go mod graph | awk '{if ($1 !~ "@") print $2}' | xargs go get From 8616e69d8b475471de07bba7a349b3b89afbd72c Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 15 Apr 2025 11:21:15 +0700 Subject: [PATCH 19/75] rpm-build is necessary too... --- static-builder-gnu.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static-builder-gnu.Dockerfile b/static-builder-gnu.Dockerfile index 30801848af..7e31600b4a 100644 --- a/static-builder-gnu.Dockerfile +++ b/static-builder-gnu.Dockerfile @@ -126,7 +126,7 @@ ENV COMPOSER_ALLOW_SUPERUSER=1 # install tools to build packages, if requested - needs gcc 10 RUN if [ "${BUILD_PACKAGES}" != "" ]; then \ - yum install -y make bzip2 openssl-devel libffi-devel zlib-devel libyaml libyaml-devel && \ + yum install -y make bzip2 openssl-devel libffi-devel zlib-devel libyaml libyaml-devel rpm-build && \ curl -o ruby.tar.gz -fsSL https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz && \ tar -xzf ruby.tar.gz && \ cd ruby-3.2.2 && \ From dcfb09bb5a6d3b609d787c52a08af2c0633a3905 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 15 Apr 2025 11:43:12 +0700 Subject: [PATCH 20/75] and I forgot to link the package folder --- static-builder-gnu.Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/static-builder-gnu.Dockerfile b/static-builder-gnu.Dockerfile index 7e31600b4a..539aad3681 100644 --- a/static-builder-gnu.Dockerfile +++ b/static-builder-gnu.Dockerfile @@ -150,6 +150,7 @@ WORKDIR /go/src/app COPY --link *.* ./ COPY --link caddy caddy COPY --link internal internal +COPY --link package package RUN --mount=type=secret,id=github-token ./build-static.sh && \ rm -Rf dist/static-php-cli/source/* && \ From c241248e5aae97289d28d4fc1f1ed499dfcf56e3 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 15 Apr 2025 13:27:05 +0700 Subject: [PATCH 21/75] create directories if they don't exist --- build-packages.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build-packages.sh b/build-packages.sh index 670d085e31..b3a5c18a0a 100755 --- a/build-packages.sh +++ b/build-packages.sh @@ -56,6 +56,9 @@ if [[ ! "${FRANKENPHP_VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then FRANKENPHP_VERSION=0.0.0 fi +mkdir -p package/etc/php.d +mkdir -p package/modules + iteration="1" cd dist glibc_version=$(ldd -v "$bin" | awk '/GLIBC_/ {gsub(/[()]/, "", $2); print $2}' | grep -v GLIBC_PRIVATE | sort -V | tail -n1) From 6daaacde0c6ca62df5f051d449153e23bd9ba38b Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 15 Apr 2025 15:02:12 +0700 Subject: [PATCH 22/75] copy out all frankenphp* files? --- .github/workflows/static.yaml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/static.yaml b/.github/workflows/static.yaml index 287cd6682f..7fde32189e 100644 --- a/.github/workflows/static.yaml +++ b/.github/workflows/static.yaml @@ -246,12 +246,16 @@ jobs: path: /tmp/metadata-gnu/* if-no-files-found: error retention-days: 1 - - name: Copy binary + - name: Copy all frankenphp* files run: | # shellcheck disable=SC2034 digest=$(jq -r '."static-builder-gnu"."${{ fromJson(needs.prepare.outputs.push) && 'containerimage.digest' || 'containerimage.config.digest' }}"' <<< "${METADATA}") - docker create --platform=${{ matrix.platform }} --name static-builder-gnu "${{ fromJson(needs.prepare.outputs.push) && format('{0}-gnu@{1}', env.IMAGE_NAME, '${digest}') || '${digest}' }}" - docker cp "static-builder-gnu:/go/src/app/dist/${BINARY}" "${BINARY}-gnu" + container_id=$(docker create --platform=${{ matrix.platform }} "${{ fromJson(needs.prepare.outputs.push) && format('{0}-gnu@{1}', env.IMAGE_NAME, '${digest}') || '${digest}' }}") + for file in $(docker run --rm "${{ fromJson(needs.prepare.outputs.push) && format('{0}-gnu@{1}', env.IMAGE_NAME, '${digest}') || '${digest}' }}" sh -c "ls /go/src/app/dist | grep '^frankenphp'"); do + docker cp "${container_id}:/go/src/app/dist/${file}" "./${file}" + done + docker rm "${container_id}" + mv ${BINARY} ${BINARY}-gnu env: METADATA: ${{ steps.build.outputs.metadata }} BINARY: frankenphp-linux-${{ matrix.platform == 'linux/amd64' && 'x86_64' || 'aarch64' }} @@ -259,11 +263,11 @@ jobs: if: ${{ !fromJson(needs.prepare.outputs.push) }} uses: actions/upload-artifact@v4 with: - name: frankenphp-linux-${{ matrix.platform == 'linux/amd64' && 'x86_64' || 'aarch64' }}-gnu - path: frankenphp-linux-${{ matrix.platform == 'linux/amd64' && 'x86_64' || 'aarch64' }}-gnu + name: frankenphp-linux-${{ matrix.platform == 'linux/amd64' && 'x86_64' || 'aarch64' }}-gnu-files + path: frankenphp* - name: Upload assets if: fromJson(needs.prepare.outputs.push) && (needs.prepare.outputs.ref || github.ref_type == 'tag') - run: gh release upload "${{ (github.ref_type == 'tag' && github.ref_name) || needs.prepare.outputs.ref }}" frankenphp-linux-${{ matrix.platform == 'linux/amd64' && 'x86_64' || 'aarch64' }}-gnu --repo dunglas/frankenphp --clobber + run: gh release upload "${{ (github.ref_type == 'tag' && github.ref_name) || needs.prepare.outputs.ref }}" frankenphp* --repo dunglas/frankenphp --clobber env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - if: fromJson(needs.prepare.outputs.push) && (needs.prepare.outputs.ref || github.ref_type == 'tag') From bd87a1291ccbc63051a89128a025e602d3c0f528 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 15 Apr 2025 16:51:39 +0700 Subject: [PATCH 23/75] lint fix --- .github/workflows/static.yaml | 2 +- package/content/example.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/static.yaml b/.github/workflows/static.yaml index 7fde32189e..4da70a32dc 100644 --- a/.github/workflows/static.yaml +++ b/.github/workflows/static.yaml @@ -255,7 +255,7 @@ jobs: docker cp "${container_id}:/go/src/app/dist/${file}" "./${file}" done docker rm "${container_id}" - mv ${BINARY} ${BINARY}-gnu + mv "${BINARY}" "${BINARY}-gnu" env: METADATA: ${{ steps.build.outputs.metadata }} BINARY: frankenphp-linux-${{ matrix.platform == 'linux/amd64' && 'x86_64' || 'aarch64' }} diff --git a/package/content/example.php b/package/content/example.php index 894393db01..757fce67fe 100644 --- a/package/content/example.php +++ b/package/content/example.php @@ -127,8 +127,8 @@
- [ Powered by FrankenPHP ] - [ Powered by Caddy ] + [ Powered by FrankenPHP ] + [ Powered by Caddy ]
From 60762243d095ac42d9f478dfe1f39d3e85c191ba Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 15 Apr 2025 17:13:24 +0700 Subject: [PATCH 24/75] only copy frankenphp-* files --- .github/workflows/static.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/static.yaml b/.github/workflows/static.yaml index 4da70a32dc..a41f776fb6 100644 --- a/.github/workflows/static.yaml +++ b/.github/workflows/static.yaml @@ -251,7 +251,7 @@ jobs: # shellcheck disable=SC2034 digest=$(jq -r '."static-builder-gnu"."${{ fromJson(needs.prepare.outputs.push) && 'containerimage.digest' || 'containerimage.config.digest' }}"' <<< "${METADATA}") container_id=$(docker create --platform=${{ matrix.platform }} "${{ fromJson(needs.prepare.outputs.push) && format('{0}-gnu@{1}', env.IMAGE_NAME, '${digest}') || '${digest}' }}") - for file in $(docker run --rm "${{ fromJson(needs.prepare.outputs.push) && format('{0}-gnu@{1}', env.IMAGE_NAME, '${digest}') || '${digest}' }}" sh -c "ls /go/src/app/dist | grep '^frankenphp'"); do + for file in $(docker run --rm "${{ fromJson(needs.prepare.outputs.push) && format('{0}-gnu@{1}', env.IMAGE_NAME, '${digest}') || '${digest}' }}" sh -c "ls /go/src/app/dist | grep '^frankenphp-'"); do docker cp "${container_id}:/go/src/app/dist/${file}" "./${file}" done docker rm "${container_id}" From 5405dcef347a8c8588755e6d3c8614439bd3908a Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 15 Apr 2025 17:13:24 +0700 Subject: [PATCH 25/75] only copy frankenphp-* files --- .github/workflows/static.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/static.yaml b/.github/workflows/static.yaml index a41f776fb6..d682f3de04 100644 --- a/.github/workflows/static.yaml +++ b/.github/workflows/static.yaml @@ -264,10 +264,10 @@ jobs: uses: actions/upload-artifact@v4 with: name: frankenphp-linux-${{ matrix.platform == 'linux/amd64' && 'x86_64' || 'aarch64' }}-gnu-files - path: frankenphp* + path: frankenphp-* - name: Upload assets if: fromJson(needs.prepare.outputs.push) && (needs.prepare.outputs.ref || github.ref_type == 'tag') - run: gh release upload "${{ (github.ref_type == 'tag' && github.ref_name) || needs.prepare.outputs.ref }}" frankenphp* --repo dunglas/frankenphp --clobber + run: gh release upload "${{ (github.ref_type == 'tag' && github.ref_name) || needs.prepare.outputs.ref }}" frankenphp-* --repo dunglas/frankenphp --clobber env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - if: fromJson(needs.prepare.outputs.push) && (needs.prepare.outputs.ref || github.ref_type == 'tag') From e97e4295447c4a2af639f52165aeb76f478331ba Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 15 Apr 2025 19:04:58 +0700 Subject: [PATCH 26/75] the .deb file is name frankenphp_1.5.0... - create output folder instead and upload all things inside that will simplify things when later adding xdebug.so and ffi.so --- .github/workflows/static.yaml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/static.yaml b/.github/workflows/static.yaml index d682f3de04..2ceb4c036c 100644 --- a/.github/workflows/static.yaml +++ b/.github/workflows/static.yaml @@ -251,7 +251,9 @@ jobs: # shellcheck disable=SC2034 digest=$(jq -r '."static-builder-gnu"."${{ fromJson(needs.prepare.outputs.push) && 'containerimage.digest' || 'containerimage.config.digest' }}"' <<< "${METADATA}") container_id=$(docker create --platform=${{ matrix.platform }} "${{ fromJson(needs.prepare.outputs.push) && format('{0}-gnu@{1}', env.IMAGE_NAME, '${digest}') || '${digest}' }}") - for file in $(docker run --rm "${{ fromJson(needs.prepare.outputs.push) && format('{0}-gnu@{1}', env.IMAGE_NAME, '${digest}') || '${digest}' }}" sh -c "ls /go/src/app/dist | grep '^frankenphp-'"); do + mkdir -p gh-output + cd gh-output + for file in $(docker run --rm "${{ fromJson(needs.prepare.outputs.push) && format('{0}-gnu@{1}', env.IMAGE_NAME, '${digest}') || '${digest}' }}" sh -c "ls /go/src/app/dist | grep '^frankenphp'"); do docker cp "${container_id}:/go/src/app/dist/${file}" "./${file}" done docker rm "${container_id}" @@ -264,10 +266,10 @@ jobs: uses: actions/upload-artifact@v4 with: name: frankenphp-linux-${{ matrix.platform == 'linux/amd64' && 'x86_64' || 'aarch64' }}-gnu-files - path: frankenphp-* + path: gh-output/* - name: Upload assets if: fromJson(needs.prepare.outputs.push) && (needs.prepare.outputs.ref || github.ref_type == 'tag') - run: gh release upload "${{ (github.ref_type == 'tag' && github.ref_name) || needs.prepare.outputs.ref }}" frankenphp-* --repo dunglas/frankenphp --clobber + run: gh release upload "${{ (github.ref_type == 'tag' && github.ref_name) || needs.prepare.outputs.ref }}" gh-output/* --repo dunglas/frankenphp --clobber env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - if: fromJson(needs.prepare.outputs.push) && (needs.prepare.outputs.ref || github.ref_type == 'tag') From 2fc0a2983cf5ac5cda5781e299d4a7dbb0f96f89 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 15 Apr 2025 19:43:45 +0700 Subject: [PATCH 27/75] update the last two steps to use the gh-output directory --- .github/workflows/static.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/static.yaml b/.github/workflows/static.yaml index 2ceb4c036c..fcfa7c9257 100644 --- a/.github/workflows/static.yaml +++ b/.github/workflows/static.yaml @@ -275,7 +275,7 @@ jobs: - if: fromJson(needs.prepare.outputs.push) && (needs.prepare.outputs.ref || github.ref_type == 'tag') uses: actions/attest-build-provenance@v2 with: - subject-path: ${{ github.workspace }}/frankenphp-linux-*-gnu + subject-path: ${{ github.workspace }}/gh-output/frankenphp-linux-*-gnu - name: Run sanity checks run: | "${BINARY}" version @@ -285,7 +285,7 @@ jobs: "${BINARY}" list-modules | grep http.handlers.mercure "${BINARY}" list-modules | grep http.handlers.vulcain env: - BINARY: ./frankenphp-linux-${{ matrix.platform == 'linux/amd64' && 'x86_64' || 'aarch64' }}-gnu + BINARY: ./gh-output/frankenphp-linux-${{ matrix.platform == 'linux/amd64' && 'x86_64' || 'aarch64' }}-gnu # Adapted from https://docs.docker.com/build/ci/github-actions/multi-platform/ push: From a363a8bec6c9c9cd78fc215228f9242bd5e8ca63 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Wed, 16 Apr 2025 10:55:13 +0700 Subject: [PATCH 28/75] add post install script to set frankenphp able to bind to port 80 for non-root users --- build-packages.sh | 20 +++++++++++++++++--- package/after_install.sh | 13 +++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) create mode 100755 package/after_install.sh diff --git a/build-packages.sh b/build-packages.sh index b3a5c18a0a..167dbfcef5 100755 --- a/build-packages.sh +++ b/build-packages.sh @@ -59,7 +59,6 @@ fi mkdir -p package/etc/php.d mkdir -p package/modules -iteration="1" cd dist glibc_version=$(ldd -v "$bin" | awk '/GLIBC_/ {gsub(/[()]/, "", $2); print $2}' | grep -v GLIBC_PRIVATE | sort -V | tail -n1) cxxabi_version=$(strings "$bin" | grep -oP 'CXXABI_\d+\.\d+(\.\d+)?' | sort -V | tail -n1) @@ -69,6 +68,7 @@ fpm -s dir -t rpm -n frankenphp -v "${FRANKENPHP_VERSION}" \ --config-files /etc/frankenphp/php.ini \ --depends "libc.so.6(${glibc_version})(64bit)" \ --depends "libstdc++.so.6(${cxxabi_version})(64bit)" \ + --after-install ../package/after_install.sh \ "$bin=/usr/bin/frankenphp" \ "../package/frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ "../package/Caddyfile=/etc/frankenphp/Caddyfile" \ @@ -77,8 +77,22 @@ fpm -s dir -t rpm -n frankenphp -v "${FRANKENPHP_VERSION}" \ "../package/content/=/usr/share/frankenphp" \ "../package/modules/=/usr/lib/frankenphp/modules" -rpm_file="frankenphp-${FRANKENPHP_VERSION}-${iteration}.${arch}.rpm" +glibc_version=$(ldd -v "$bin" | awk '/GLIBC_/ {gsub(/[()]/, "", $2); print $2}' | grep -v GLIBC_PRIVATE | sed 's/GLIBC_//' | sort -V | tail -n1) +cxxabi_version=$(strings "$bin" | grep -oP 'CXXABI_\d+\.\d+(\.\d+)?' | sed 's/CXXABI_//' | sort -V | tail -n1) -fpm -s rpm -t deb "$rpm_file" +fpm -s dir -t deb -n frankenphp -v "${FRANKENPHP_VERSION}" \ + --config-files /etc/frankenphp/Caddyfile \ + --config-files /etc/frankenphp/php.ini \ + --depends "libc6 (>= ${glibc_version})" \ + --depends "libstdc++6 (>= ${cxxabi_version})" \ + --deb-suggests libcap2-bin \ + --after-install ../package/after_install.sh \ + "$bin=/usr/bin/frankenphp" \ + "../package/frankenphp.service=/lib/systemd/system/frankenphp.service" \ + "../package/Caddyfile=/etc/frankenphp/Caddyfile" \ + "../package/etc/php.ini=/etc/frankenphp/php.ini" \ + "../package/etc/php.d/=/etc/frankenphp/php.d" \ + "../package/content/=/usr/share/frankenphp" \ + "../package/modules/=/usr/lib/frankenphp/modules" cd .. diff --git a/package/after_install.sh b/package/after_install.sh new file mode 100755 index 0000000000..1909ab5e64 --- /dev/null +++ b/package/after_install.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +if command -v setcap >/dev/null 2>&1; then + setcap 'cap_net_bind_service=+ep' /usr/bin/frankenphp || echo "Warning: failed to set capabilities on frankenphp" +else + if [ -f /etc/debian_version ]; then + echo "Warning: setcap not found. Install it with: sudo apt install libcap2-bin" + elif [ -f /etc/redhat-release ]; then + echo "Warning: setcap not found. Install it with: sudo yum install libcap" + else + echo "Warning: setcap not found. Install the appropriate libcap package for your system." + fi +fi \ No newline at end of file From 9c3554a24b8c9b8e37deebc8c55fd821f67f185f Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Wed, 16 Apr 2025 10:56:08 +0700 Subject: [PATCH 29/75] dnf over yum, I think the yum alias was removed in RH 9.5 --- package/after_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/after_install.sh b/package/after_install.sh index 1909ab5e64..1b1b3f08b0 100755 --- a/package/after_install.sh +++ b/package/after_install.sh @@ -6,7 +6,7 @@ else if [ -f /etc/debian_version ]; then echo "Warning: setcap not found. Install it with: sudo apt install libcap2-bin" elif [ -f /etc/redhat-release ]; then - echo "Warning: setcap not found. Install it with: sudo yum install libcap" + echo "Warning: setcap not found. Install it with: sudo dnf install libcap" else echo "Warning: setcap not found. Install the appropriate libcap package for your system." fi From d945be24a63a012898e62adf5d5102c81cb1019a Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Wed, 16 Apr 2025 11:24:24 +0700 Subject: [PATCH 30/75] newlines --- package/after_install.sh | 2 +- package/frankenphp.service | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package/after_install.sh b/package/after_install.sh index 1b1b3f08b0..6684e6cc54 100755 --- a/package/after_install.sh +++ b/package/after_install.sh @@ -10,4 +10,4 @@ else else echo "Warning: setcap not found. Install the appropriate libcap package for your system." fi -fi \ No newline at end of file +fi diff --git a/package/frankenphp.service b/package/frankenphp.service index 8cc372b525..955cfa8184 100644 --- a/package/frankenphp.service +++ b/package/frankenphp.service @@ -18,4 +18,4 @@ ProtectSystem=full AmbientCapabilities=CAP_NET_BIND_SERVICE [Install] -WantedBy=multi-user.target \ No newline at end of file +WantedBy=multi-user.target From 2877985d26e7fa47ad77371c4949db6fb8c64214 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Wed, 16 Apr 2025 11:24:24 +0700 Subject: [PATCH 31/75] newlines --- package/after_install.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package/after_install.sh b/package/after_install.sh index 6684e6cc54..f47defb8a4 100755 --- a/package/after_install.sh +++ b/package/after_install.sh @@ -2,6 +2,7 @@ if command -v setcap >/dev/null 2>&1; then setcap 'cap_net_bind_service=+ep' /usr/bin/frankenphp || echo "Warning: failed to set capabilities on frankenphp" + echo "Users without root privileges will not be able to bind to ports < 1024." else if [ -f /etc/debian_version ]; then echo "Warning: setcap not found. Install it with: sudo apt install libcap2-bin" @@ -10,4 +11,5 @@ else else echo "Warning: setcap not found. Install the appropriate libcap package for your system." fi + echo "Users without root privileges will not be able to bind to ports < 1024." fi From 50f98a9abeadf27b5776406c6e7bcc08195a925f Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Wed, 16 Apr 2025 12:16:20 +0700 Subject: [PATCH 32/75] add text what missing libcap means --- package/after_install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/after_install.sh b/package/after_install.sh index f47defb8a4..acc4774359 100755 --- a/package/after_install.sh +++ b/package/after_install.sh @@ -2,7 +2,7 @@ if command -v setcap >/dev/null 2>&1; then setcap 'cap_net_bind_service=+ep' /usr/bin/frankenphp || echo "Warning: failed to set capabilities on frankenphp" - echo "Users without root privileges will not be able to bind to ports < 1024." + echo "Users without root privileges will not be to run 'frankenphp php-server' on ports 80/443." else if [ -f /etc/debian_version ]; then echo "Warning: setcap not found. Install it with: sudo apt install libcap2-bin" @@ -11,5 +11,5 @@ else else echo "Warning: setcap not found. Install the appropriate libcap package for your system." fi - echo "Users without root privileges will not be able to bind to ports < 1024." + echo "Users without root privileges will not be to run 'frankenphp php-server' on ports 80/443." fi From 8b5af4a5f38f019eb5be2a9b53fed2536330692e Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Fri, 18 Apr 2025 15:16:39 +0700 Subject: [PATCH 33/75] copy php.ini-production from php-src, linter, update ruby version --- build-packages.sh | 1 + caddy/frankenphp/Caddyfile | 1 - package/Caddyfile | 1 - package/content/public/index.php | 2 +- package/etc/php.ini | 1870 ------------------------------ static-builder-gnu.Dockerfile | 10 +- 6 files changed, 7 insertions(+), 1878 deletions(-) delete mode 100644 package/etc/php.ini diff --git a/build-packages.sh b/build-packages.sh index 167dbfcef5..1f4aa6d465 100755 --- a/build-packages.sh +++ b/build-packages.sh @@ -58,6 +58,7 @@ fi mkdir -p package/etc/php.d mkdir -p package/modules +[ -f source_file ] && cp -f dist/static-php-cli/source/php-src/php.ini-production package/etc/php.ini cd dist glibc_version=$(ldd -v "$bin" | awk '/GLIBC_/ {gsub(/[()]/, "", $2); print $2}' | grep -v GLIBC_PRIVATE | sort -V | tail -n1) diff --git a/caddy/frankenphp/Caddyfile b/caddy/frankenphp/Caddyfile index 1f21f9abf6..5b69428043 100644 --- a/caddy/frankenphp/Caddyfile +++ b/caddy/frankenphp/Caddyfile @@ -1,5 +1,4 @@ - { {$CADDY_GLOBAL_OPTIONS} diff --git a/package/Caddyfile b/package/Caddyfile index 5495ca626b..2a987dfc6d 100644 --- a/package/Caddyfile +++ b/package/Caddyfile @@ -50,4 +50,3 @@ php_server } - diff --git a/package/content/public/index.php b/package/content/public/index.php index 4e71c06ece..44b2b60ac3 100644 --- a/package/content/public/index.php +++ b/package/content/public/index.php @@ -11,4 +11,4 @@ }); $i++; -} while ($ok); \ No newline at end of file +} while ($ok); diff --git a/package/etc/php.ini b/package/etc/php.ini deleted file mode 100644 index d6f7dbae2d..0000000000 --- a/package/etc/php.ini +++ /dev/null @@ -1,1870 +0,0 @@ -[PHP] - -;;;;;;;;;;;;;;;;;;; -; About php.ini ; -;;;;;;;;;;;;;;;;;;; -; PHP's initialization file, generally called php.ini, is responsible for -; configuring many of the aspects of PHP's behavior. - -; PHP attempts to find and load this configuration from a number of locations. -; The following is a summary of its search order: -; 1. SAPI module specific location. -; 2. The PHPRC environment variable. -; 3. A number of predefined registry keys on Windows -; 4. Current working directory (except CLI) -; 5. The web server's directory (for SAPI modules), or directory of PHP -; (otherwise in Windows) -; 6. The directory from the --with-config-file-path compile time option, or the -; Windows directory (usually C:\windows) -; See the PHP docs for more specific information. -; https://php.net/configuration.file - -; The syntax of the file is extremely simple. Whitespace and lines -; beginning with a semicolon are silently ignored (as you probably guessed). -; Section headers (e.g. [Foo]) are also silently ignored, even though -; they might mean something in the future. - -; Directives following the section heading [PATH=/www/mysite] only -; apply to PHP files in the /www/mysite directory. Directives -; following the section heading [HOST=www.example.com] only apply to -; PHP files served from www.example.com. Directives set in these -; special sections cannot be overridden by user-defined INI files or -; at runtime. Currently, [PATH=] and [HOST=] sections only work under -; CGI/FastCGI. -; https://php.net/ini.sections - -; Directives are specified using the following syntax: -; directive = value -; Directive names are *case sensitive* - foo=bar is different from FOO=bar. -; Directives are variables used to configure PHP or PHP extensions. -; There is no name validation. If PHP can't find an expected -; directive because it is not set or is mistyped, a default value will be used. - -; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one -; of the INI constants (On, Off, True, False, Yes, No and None) or an expression -; (e.g. E_ALL & ~E_NOTICE), a quoted string ("bar"), or a reference to a -; previously set variable or directive (e.g. ${foo}) - -; Expressions in the INI file are limited to bitwise operators and parentheses: -; | bitwise OR -; ^ bitwise XOR -; & bitwise AND -; ~ bitwise NOT -; ! boolean NOT - -; Boolean flags can be turned on using the values 1, On, True or Yes. -; They can be turned off using the values 0, Off, False or No. - -; An empty string can be denoted by simply not writing anything after the equal -; sign, or by using the None keyword: - -; foo = ; sets foo to an empty string -; foo = None ; sets foo to an empty string -; foo = "None" ; sets foo to the string 'None' - -; If you use constants in your value, and these constants belong to a -; dynamically loaded extension (either a PHP extension or a Zend extension), -; you may only use these constants *after* the line that loads the extension. - -;;;;;;;;;;;;;;;;;;; -; About this file ; -;;;;;;;;;;;;;;;;;;; -; PHP comes packaged with two INI files. One that is recommended to be used -; in production environments and one that is recommended to be used in -; development environments. - -; php.ini-production contains settings which hold security, performance and -; best practices at its core. But please be aware, these settings may break -; compatibility with older or less security-conscious applications. We -; recommending using the production ini in production and testing environments. - -; php.ini-development is very similar to its production variant, except it is -; much more verbose when it comes to errors. We recommend using the -; development version only in development environments, as errors shown to -; application users can inadvertently leak otherwise secure information. - -; This is the php.ini-production INI file. - -;;;;;;;;;;;;;;;;;;; -; Quick Reference ; -;;;;;;;;;;;;;;;;;;; - -; The following are all the settings which are different in either the production -; or development versions of the INIs with respect to PHP's default behavior. -; Please see the actual settings later in the document for more details as to why -; we recommend these changes in PHP's behavior. - -; display_errors -; Default Value: On -; Development Value: On -; Production Value: Off - -; display_startup_errors -; Default Value: On -; Development Value: On -; Production Value: Off - -; error_reporting -; Default Value: E_ALL -; Development Value: E_ALL -; Production Value: E_ALL & ~E_DEPRECATED - -; log_errors -; Default Value: Off -; Development Value: On -; Production Value: On - -; max_input_time -; Default Value: -1 (Unlimited) -; Development Value: 60 (60 seconds) -; Production Value: 60 (60 seconds) - -; mysqlnd.collect_memory_statistics -; Default Value: Off -; Development Value: On -; Production Value: Off - -; output_buffering -; Default Value: Off -; Development Value: 4096 -; Production Value: 4096 - -; register_argc_argv -; Default Value: On -; Development Value: Off -; Production Value: Off - -; request_order -; Default Value: None -; Development Value: "GP" -; Production Value: "GP" - -; session.gc_divisor -; Default Value: 100 -; Development Value: 1000 -; Production Value: 1000 - -; short_open_tag -; Default Value: On -; Development Value: Off -; Production Value: Off - -; variables_order -; Default Value: "EGPCS" -; Development Value: "GPCS" -; Production Value: "GPCS" - -; zend.assertions -; Default Value: 1 -; Development Value: 1 -; Production Value: -1 - -; zend.exception_ignore_args -; Default Value: Off -; Development Value: Off -; Production Value: On - -; zend.exception_string_param_max_len -; Default Value: 15 -; Development Value: 15 -; Production Value: 0 - -;;;;;;;;;;;;;;;;;;;; -; php.ini Options ; -;;;;;;;;;;;;;;;;;;;; -; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini" -;user_ini.filename = ".user.ini" - -; To disable this feature set this option to an empty value -;user_ini.filename = - -; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes) -;user_ini.cache_ttl = 300 - -;;;;;;;;;;;;;;;;;;;; -; Language Options ; -;;;;;;;;;;;;;;;;;;;; - -; Enable the PHP scripting language engine under Apache. -; https://php.net/engine -engine = On - -; This directive determines whether or not PHP will recognize code between -; tags as PHP source which should be processed as such. It is -; generally recommended that should be used and that this feature -; should be disabled, as enabling it may result in issues when generating XML -; documents, however this remains supported for backward compatibility reasons. -; Note that this directive does not control the would work. -; https://php.net/syntax-highlighting -;highlight.string = #DD0000 -;highlight.comment = #FF9900 -;highlight.keyword = #007700 -;highlight.default = #0000BB -;highlight.html = #000000 - -; If enabled, the request will be allowed to complete even if the user aborts -; the request. Consider enabling it if executing long requests, which may end up -; being interrupted by the user or a browser timing out. PHP's default behavior -; is to disable this feature. -; https://php.net/ignore-user-abort -;ignore_user_abort = On - -; Determines the size of the realpath cache to be used by PHP. This value should -; be increased on systems where PHP opens many files to reflect the quantity of -; the file operations performed. -; Note: if open_basedir is set, the cache is disabled -; https://php.net/realpath-cache-size -;realpath_cache_size = 4096k - -; Duration of time, in seconds for which to cache realpath information for a given -; file or directory. For systems with rarely changing files, consider increasing this -; value. -; https://php.net/realpath-cache-ttl -;realpath_cache_ttl = 120 - -; Enables or disables the circular reference collector. -; https://php.net/zend.enable-gc -zend.enable_gc = On - -; If enabled, scripts may be written in encodings that are incompatible with -; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such -; encodings. To use this feature, mbstring extension must be enabled. -;zend.multibyte = Off - -; Allows to set the default encoding for the scripts. This value will be used -; unless "declare(encoding=...)" directive appears at the top of the script. -; Only affects if zend.multibyte is set. -;zend.script_encoding = - -; Allows to include or exclude arguments from stack traces generated for exceptions. -; In production, it is recommended to turn this setting on to prohibit the output -; of sensitive information in stack traces -; Default Value: Off -; Development Value: Off -; Production Value: On -zend.exception_ignore_args = On - -; Allows setting the maximum string length in an argument of a stringified stack trace -; to a value between 0 and 1000000. -; This has no effect when zend.exception_ignore_args is enabled. -; Default Value: 15 -; Development Value: 15 -; Production Value: 0 -; In production, it is recommended to set this to 0 to reduce the output -; of sensitive information in stack traces. -zend.exception_string_param_max_len = 0 - -;;;;;;;;;;;;;;;;; -; Miscellaneous ; -;;;;;;;;;;;;;;;;; - -; Decides whether PHP may expose the fact that it is installed on the server -; (e.g. by adding its signature to the Web server header). It is no security -; threat in any way, but it makes it possible to determine whether you use PHP -; on your server or not. -; https://php.net/expose-php -expose_php = On - -;;;;;;;;;;;;;;;;;;; -; Resource Limits ; -;;;;;;;;;;;;;;;;;;; - -; Maximum execution time of each script, in seconds -; https://php.net/max-execution-time -; Note: This directive is hardcoded to 0 for the CLI SAPI -max_execution_time = 30 - -; Maximum amount of time each script may spend parsing request data. It's a good -; idea to limit this time on productions servers in order to eliminate unexpectedly -; long running scripts. -; Note: This directive is hardcoded to -1 for the CLI SAPI -; Default Value: -1 (Unlimited) -; Development Value: 60 (60 seconds) -; Production Value: 60 (60 seconds) -; https://php.net/max-input-time -max_input_time = 60 - -; Maximum input variable nesting level -; https://php.net/max-input-nesting-level -;max_input_nesting_level = 64 - -; How many GET/POST/COOKIE input variables may be accepted -;max_input_vars = 1000 - -; How many multipart body parts (combined input variable and file uploads) may -; be accepted. -; Default Value: -1 (Sum of max_input_vars and max_file_uploads) -;max_multipart_body_parts = 1500 - -; Maximum amount of memory a script may consume -; https://php.net/memory-limit -memory_limit = 128M - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Error handling and logging ; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -; This directive informs PHP of which errors, warnings and notices you would like -; it to take action for. The recommended way of setting values for this -; directive is through the use of the error level constants and bitwise -; operators. The error level constants are below here for convenience as well as -; some common settings and their meanings. -; By default, PHP is set to take action on all errors, notices and warnings EXCEPT -; those related to E_NOTICE, which together cover best practices and -; recommended coding standards in PHP. For performance reasons, this is the -; recommend error reporting setting. Your production server shouldn't be wasting -; resources complaining about best practices and coding standards. That's what -; development servers and development settings are for. -; Note: The php.ini-development file has this setting as E_ALL. This -; means it pretty much reports everything which is exactly what you want during -; development and early testing. -; -; Error Level Constants: -; E_ALL - All errors and warnings -; E_ERROR - fatal run-time errors -; E_RECOVERABLE_ERROR - almost fatal run-time errors -; E_WARNING - run-time warnings (non-fatal errors) -; E_PARSE - compile-time parse errors -; E_NOTICE - run-time notices (these are warnings which often result -; from a bug in your code, but it's possible that it was -; intentional (e.g., using an uninitialized variable and -; relying on the fact it is automatically initialized to an -; empty string) -; E_CORE_ERROR - fatal errors that occur during PHP's initial startup -; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's -; initial startup -; E_COMPILE_ERROR - fatal compile-time errors -; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) -; E_USER_ERROR - user-generated error message -; E_USER_WARNING - user-generated warning message -; E_USER_NOTICE - user-generated notice message -; E_DEPRECATED - warn about code that will not work in future versions -; of PHP -; E_USER_DEPRECATED - user-generated deprecation warnings -; -; Common Values: -; E_ALL (Show all errors, warnings and notices including coding standards.) -; E_ALL & ~E_NOTICE (Show all errors, except for notices) -; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors) -; Default Value: E_ALL -; Development Value: E_ALL -; Production Value: E_ALL & ~E_DEPRECATED -; https://php.net/error-reporting -error_reporting = E_ALL & ~E_DEPRECATED - -; This directive controls whether or not and where PHP will output errors, -; notices and warnings too. Error output is very useful during development, but -; it could be very dangerous in production environments. Depending on the code -; which is triggering the error, sensitive information could potentially leak -; out of your application such as database usernames and passwords or worse. -; For production environments, we recommend logging errors rather than -; sending them to STDOUT. -; Possible Values: -; Off = Do not display any errors -; stderr = Display errors to STDERR (affects only CGI/CLI binaries!) -; On or stdout = Display errors to STDOUT -; Default Value: On -; Development Value: On -; Production Value: Off -; https://php.net/display-errors -display_errors = Off - -; The display of errors which occur during PHP's startup sequence are handled -; separately from display_errors. We strongly recommend you set this to 'off' -; for production servers to avoid leaking configuration details. -; Default Value: On -; Development Value: On -; Production Value: Off -; https://php.net/display-startup-errors -display_startup_errors = Off - -; Besides displaying errors, PHP can also log errors to locations such as a -; server-specific log, STDERR, or a location specified by the error_log -; directive found below. While errors should not be displayed on productions -; servers they should still be monitored and logging is a great way to do that. -; Default Value: Off -; Development Value: On -; Production Value: On -; https://php.net/log-errors -log_errors = On - -; Do not log repeated messages. Repeated errors must occur in same file on same -; line unless ignore_repeated_source is set true. -; https://php.net/ignore-repeated-errors -ignore_repeated_errors = Off - -; Ignore source of message when ignoring repeated messages. When this setting -; is On you will not log errors with repeated messages from different files or -; source lines. -; https://php.net/ignore-repeated-source -ignore_repeated_source = Off - -; If this parameter is set to Off, then memory leaks will not be shown (on -; stdout or in the log). This is only effective in a debug compile, and if -; error reporting includes E_WARNING in the allowed list -; https://php.net/report-memleaks -report_memleaks = On - -; This setting is off by default. -;report_zend_debug = 0 - -; Turn off normal error reporting and emit XML-RPC error XML -; https://php.net/xmlrpc-errors -;xmlrpc_errors = 0 - -; An XML-RPC faultCode -;xmlrpc_error_number = 0 - -; When PHP displays or logs an error, it has the capability of formatting the -; error message as HTML for easier reading. This directive controls whether -; the error message is formatted as HTML or not. -; Note: This directive is hardcoded to Off for the CLI SAPI -; https://php.net/html-errors -;html_errors = On - -; If html_errors is set to On *and* docref_root is not empty, then PHP -; produces clickable error messages that direct to a page describing the error -; or function causing the error in detail. -; You can download a copy of the PHP manual from https://php.net/docs -; and change docref_root to the base URL of your local copy including the -; leading '/'. You must also specify the file extension being used including -; the dot. PHP's default behavior is to leave these settings empty, in which -; case no links to documentation are generated. -; Note: Never use this feature for production boxes. -; https://php.net/docref-root -; Examples -;docref_root = "/phpmanual/" - -; https://php.net/docref-ext -;docref_ext = .html - -; String to output before an error message. PHP's default behavior is to leave -; this setting blank. -; https://php.net/error-prepend-string -; Example: -;error_prepend_string = "" - -; String to output after an error message. PHP's default behavior is to leave -; this setting blank. -; https://php.net/error-append-string -; Example: -;error_append_string = "" - -; Log errors to specified file. PHP's default behavior is to leave this value -; empty. -; https://php.net/error-log -; Example: -;error_log = php_errors.log -; Log errors to syslog (Event Log on Windows). -;error_log = syslog - -; The syslog ident is a string which is prepended to every message logged -; to syslog. Only used when error_log is set to syslog. -;syslog.ident = php - -; The syslog facility is used to specify what type of program is logging -; the message. Only used when error_log is set to syslog. -;syslog.facility = user - -; Set this to disable filtering control characters (the default). -; Some loggers only accept NVT-ASCII, others accept anything that's not -; control characters. If your logger accepts everything, then no filtering -; is needed at all. -; Allowed values are: -; ascii (all printable ASCII characters and NL) -; no-ctrl (all characters except control characters) -; all (all characters) -; raw (like "all", but messages are not split at newlines) -; https://php.net/syslog.filter -;syslog.filter = ascii - -;windows.show_crt_warning -; Default value: 0 -; Development value: 0 -; Production value: 0 - -;;;;;;;;;;;;;;;;; -; Data Handling ; -;;;;;;;;;;;;;;;;; - -; The separator used in PHP generated URLs to separate arguments. -; PHP's default setting is "&". -; https://php.net/arg-separator.output -; Example: -;arg_separator.output = "&" - -; List of separator(s) used by PHP to parse input URLs into variables. -; PHP's default setting is "&". -; NOTE: Every character in this directive is considered as separator! -; https://php.net/arg-separator.input -; Example: -;arg_separator.input = ";&" - -; This directive determines which super global arrays are registered when PHP -; starts up. G,P,C,E & S are abbreviations for the following respective super -; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty -; paid for the registration of these arrays and because ENV is not as commonly -; used as the others, ENV is not recommended on productions servers. You -; can still get access to the environment variables through getenv() should you -; need to. -; Default Value: "EGPCS" -; Development Value: "GPCS" -; Production Value: "GPCS"; -; https://php.net/variables-order -variables_order = "GPCS" - -; This directive determines which super global data (G,P & C) should be -; registered into the super global array REQUEST. If so, it also determines -; the order in which that data is registered. The values for this directive -; are specified in the same manner as the variables_order directive, -; EXCEPT one. Leaving this value empty will cause PHP to use the value set -; in the variables_order directive. It does not mean it will leave the super -; globals array REQUEST empty. -; Default Value: None -; Development Value: "GP" -; Production Value: "GP" -; https://php.net/request-order -request_order = "GP" - -; This directive determines whether PHP registers $argv & $argc each time it -; runs. $argv contains an array of all the arguments passed to PHP when a script -; is invoked. $argc contains an integer representing the number of arguments -; that were passed when the script was invoked. These arrays are extremely -; useful when running scripts from the command line. When this directive is -; enabled, registering these variables consumes CPU cycles and memory each time -; a script is executed. For performance reasons, this feature should be disabled -; on production servers. -; Note: This directive is hardcoded to On for the CLI SAPI -; Default Value: On -; Development Value: Off -; Production Value: Off -; https://php.net/register-argc-argv -register_argc_argv = Off - -; When enabled, the ENV, REQUEST and SERVER variables are created when they're -; first used (Just In Time) instead of when the script starts. If these -; variables are not used within a script, having this directive on will result -; in a performance gain. The PHP directive register_argc_argv must be disabled -; for this directive to have any effect. -; https://php.net/auto-globals-jit -auto_globals_jit = On - -; Whether PHP will read the POST data. -; This option is enabled by default. -; Most likely, you won't want to disable this option globally. It causes $_POST -; and $_FILES to always be empty; the only way you will be able to read the -; POST data will be through the php://input stream wrapper. This can be useful -; to proxy requests or to process the POST data in a memory efficient fashion. -; https://php.net/enable-post-data-reading -;enable_post_data_reading = Off - -; Maximum size of POST data that PHP will accept. -; Its value may be 0 to disable the limit. It is ignored if POST data reading -; is disabled through enable_post_data_reading. -; https://php.net/post-max-size -post_max_size = 8M - -; Automatically add files before PHP document. -; https://php.net/auto-prepend-file -auto_prepend_file = - -; Automatically add files after PHP document. -; https://php.net/auto-append-file -auto_append_file = - -; By default, PHP will output a media type using the Content-Type header. To -; disable this, simply set it to be empty. -; -; PHP's built-in default media type is set to text/html. -; https://php.net/default-mimetype -default_mimetype = "text/html" - -; PHP's default character set is set to UTF-8. -; https://php.net/default-charset -default_charset = "UTF-8" - -; PHP internal character encoding is set to empty. -; If empty, default_charset is used. -; https://php.net/internal-encoding -;internal_encoding = - -; PHP input character encoding is set to empty. -; If empty, default_charset is used. -; https://php.net/input-encoding -;input_encoding = - -; PHP output character encoding is set to empty. -; If empty, default_charset is used. -; See also output_buffer. -; https://php.net/output-encoding -;output_encoding = - -;;;;;;;;;;;;;;;;;;;;;;;;; -; Paths and Directories ; -;;;;;;;;;;;;;;;;;;;;;;;;; - -; UNIX: "/path1:/path2" -;include_path = ".:/php/includes" -; -; Windows: "\path1;\path2" -;include_path = ".;c:\php\includes" -; -; PHP's default setting for include_path is ".;/path/to/php/pear" -; https://php.net/include-path - -; The root of the PHP pages, used only if nonempty. -; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root -; if you are running php as a CGI under any web server (other than IIS) -; see documentation for security issues. The alternate is to use the -; cgi.force_redirect configuration below -; https://php.net/doc-root -doc_root = - -; The directory under which PHP opens the script using /~username used only -; if nonempty. -; https://php.net/user-dir -user_dir = - -; Directory in which the loadable extensions (modules) reside. -; https://php.net/extension-dir -;extension_dir = "./" -; On windows: -;extension_dir = "ext" - -; Directory where the temporary files should be placed. -; Defaults to the system default (see sys_get_temp_dir) -;sys_temp_dir = "/tmp" - -; Whether or not to enable the dl() function. The dl() function does NOT work -; properly in multithreaded servers, such as IIS or Zeus, and is automatically -; disabled on them. -; https://php.net/enable-dl -enable_dl = Off - -; cgi.force_redirect is necessary to provide security running PHP as a CGI under -; most web servers. Left undefined, PHP turns this on by default. You can -; turn it off here AT YOUR OWN RISK -; **You CAN safely turn this off for IIS, in fact, you MUST.** -; https://php.net/cgi.force-redirect -;cgi.force_redirect = 1 - -; if cgi.nph is enabled it will force cgi to always sent Status: 200 with -; every request. PHP's default behavior is to disable this feature. -;cgi.nph = 1 - -; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape -; (iPlanet) web servers, you MAY need to set an environment variable name that PHP -; will look for to know it is OK to continue execution. Setting this variable MAY -; cause security issues, KNOW WHAT YOU ARE DOING FIRST. -; https://php.net/cgi.redirect-status-env -;cgi.redirect_status_env = - -; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's -; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok -; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting -; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting -; of zero causes PHP to behave as before. Default is 1. You should fix your scripts -; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. -; https://php.net/cgi.fix-pathinfo -;cgi.fix_pathinfo=1 - -; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside -; of the web tree and people will not be able to circumvent .htaccess security. -;cgi.discard_path=1 - -; FastCGI under IIS supports the ability to impersonate -; security tokens of the calling client. This allows IIS to define the -; security context that the request runs under. mod_fastcgi under Apache -; does not currently support this feature (03/17/2002) -; Set to 1 if running under IIS. Default is zero. -; https://php.net/fastcgi.impersonate -;fastcgi.impersonate = 1 - -; Prevent decoding of SCRIPT_FILENAME when using Apache ProxyPass or -; ProxyPassMatch. This should only be used if script file paths are already -; stored in an encoded format on the file system. -; Default is 0. -;fastcgi.script_path_encoded = 1 - -; Disable logging through FastCGI connection. PHP's default behavior is to enable -; this feature. -;fastcgi.logging = 0 - -; cgi.rfc2616_headers configuration option tells PHP what type of headers to -; use when sending HTTP response code. If set to 0, PHP sends Status: header that -; is supported by Apache. When this option is set to 1, PHP will send -; RFC2616 compliant header. -; Default is zero. -; https://php.net/cgi.rfc2616-headers -;cgi.rfc2616_headers = 0 - -; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #! -; (shebang) at the top of the running script. This line might be needed if the -; script support running both as stand-alone script and via PHP CGI<. PHP in CGI -; mode skips this line and ignores its content if this directive is turned on. -; https://php.net/cgi.check-shebang-line -;cgi.check_shebang_line=1 - -;;;;;;;;;;;;;;;; -; File Uploads ; -;;;;;;;;;;;;;;;; - -; Whether to allow HTTP file uploads. -; https://php.net/file-uploads -file_uploads = On - -; Temporary directory for HTTP uploaded files (will use system default if not -; specified). -; https://php.net/upload-tmp-dir -;upload_tmp_dir = - -; Maximum allowed size for uploaded files. -; https://php.net/upload-max-filesize -upload_max_filesize = 2M - -; Maximum number of files that can be uploaded via a single request -max_file_uploads = 20 - -;;;;;;;;;;;;;;;;;; -; Fopen wrappers ; -;;;;;;;;;;;;;;;;;; - -; Whether to allow the treatment of URLs (like http:// or ftp://) as files. -; https://php.net/allow-url-fopen -allow_url_fopen = On - -; Whether to allow include/require to open URLs (like https:// or ftp://) as files. -; https://php.net/allow-url-include -allow_url_include = Off - -; Define the anonymous ftp password (your email address). PHP's default setting -; for this is empty. -; https://php.net/from -;from="john@doe.com" - -; Define the User-Agent string. PHP's default setting for this is empty. -; https://php.net/user-agent -;user_agent="PHP" - -; Default timeout for socket based streams (seconds) -; https://php.net/default-socket-timeout -default_socket_timeout = 60 - -; If your scripts have to deal with files from Macintosh systems, -; or you are running on a Mac and need to deal with files from -; unix or win32 systems, setting this flag will cause PHP to -; automatically detect the EOL character in those files so that -; fgets() and file() will work regardless of the source of the file. -; https://php.net/auto-detect-line-endings -;auto_detect_line_endings = Off - -;;;;;;;;;;;;;;;;;;;;;; -; Dynamic Extensions ; -;;;;;;;;;;;;;;;;;;;;;; - -; If you wish to have an extension loaded automatically, use the following -; syntax: -; -; extension=modulename -; -; For example: -; -; extension=mysqli -; -; When the extension library to load is not located in the default extension -; directory, You may specify an absolute path to the library file: -; -; extension=/path/to/extension/mysqli.so -; -; Note : The syntax used in previous PHP versions ('extension=.so' and -; 'extension='php_.dll') is supported for legacy reasons and may be -; deprecated in a future PHP major version. So, when it is possible, please -; move to the new ('extension=) syntax. -; -; Notes for Windows environments : -; -; - Many DLL files are located in the ext/ -; extension folders as well as the separate PECL DLL download. -; Be sure to appropriately set the extension_dir directive. -; -;extension=bz2 -;extension=curl -;extension=exif -;extension=ffi -;extension=ftp -;extension=fileinfo -;extension=gd -;extension=gettext -;extension=gmp -;extension=intl -;extension=ldap -;extension=mbstring -;extension=mysqli -;extension=odbc -;extension=openssl -;extension=pdo_firebird -;extension=pdo_mysql -;extension=pdo_odbc -;extension=pdo_pgsql -;extension=pdo_sqlite -;extension=pgsql -;extension=shmop - -; The MIBS data available in the PHP distribution must be installed. -; See https://www.php.net/manual/en/snmp.installation.php -;extension=snmp - -;extension=soap -;extension=sockets -;extension=sodium -;extension=sqlite3 -;extension=tidy -;extension=xsl -;extension=zip - -;zend_extension=opcache - -;;;;;;;;;;;;;;;;;;; -; Module Settings ; -;;;;;;;;;;;;;;;;;;; - -[CLI Server] -; Whether the CLI web server uses ANSI color coding in its terminal output. -cli_server.color = On - -[Date] -; Defines the default timezone used by the date functions -; https://php.net/date.timezone -;date.timezone = - -; https://php.net/date.default-latitude -;date.default_latitude = 31.7667 - -; https://php.net/date.default-longitude -;date.default_longitude = 35.2333 - -; https://php.net/date.sunrise-zenith -;date.sunrise_zenith = 90.833333 - -; https://php.net/date.sunset-zenith -;date.sunset_zenith = 90.833333 - -[filter] -; https://php.net/filter.default -;filter.default = unsafe_raw - -; https://php.net/filter.default-flags -;filter.default_flags = - -[iconv] -; Use of this INI entry is deprecated, use global input_encoding instead. -; If empty, default_charset or input_encoding or iconv.input_encoding is used. -; The precedence is: default_charset < input_encoding < iconv.input_encoding -;iconv.input_encoding = - -; Use of this INI entry is deprecated, use global internal_encoding instead. -; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. -; The precedence is: default_charset < internal_encoding < iconv.internal_encoding -;iconv.internal_encoding = - -; Use of this INI entry is deprecated, use global output_encoding instead. -; If empty, default_charset or output_encoding or iconv.output_encoding is used. -; The precedence is: default_charset < output_encoding < iconv.output_encoding -; To use an output encoding conversion, iconv's output handler must be set -; otherwise output encoding conversion cannot be performed. -;iconv.output_encoding = - -[intl] -;intl.default_locale = -; This directive allows you to produce PHP errors when some error -; happens within intl functions. The value is the level of the error produced. -; Default is 0, which does not produce any errors. -;intl.error_level = E_WARNING -;intl.use_exceptions = 0 - -[sqlite3] -; Directory pointing to SQLite3 extensions -; https://php.net/sqlite3.extension-dir -;sqlite3.extension_dir = - -; SQLite defensive mode flag (only available from SQLite 3.26+) -; When the defensive flag is enabled, language features that allow ordinary -; SQL to deliberately corrupt the database file are disabled. This forbids -; writing directly to the schema, shadow tables (eg. FTS data tables), or -; the sqlite_dbpage virtual table. -; https://www.sqlite.org/c3ref/c_dbconfig_defensive.html -; (for older SQLite versions, this flag has no use) -;sqlite3.defensive = 1 - -[Pcre] -; PCRE library backtracking limit. -; https://php.net/pcre.backtrack-limit -;pcre.backtrack_limit=100000 - -; PCRE library recursion limit. -; Please note that if you set this value to a high number you may consume all -; the available process stack and eventually crash PHP (due to reaching the -; stack size limit imposed by the Operating System). -; https://php.net/pcre.recursion-limit -;pcre.recursion_limit=100000 - -; Enables or disables JIT compilation of patterns. This requires the PCRE -; library to be compiled with JIT support. -;pcre.jit=1 - -[Pdo] -; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off" -; https://php.net/pdo-odbc.connection-pooling -;pdo_odbc.connection_pooling=strict - -[Pdo_mysql] -; Default socket name for local MySQL connects. If empty, uses the built-in -; MySQL defaults. -pdo_mysql.default_socket= - -[Phar] -; https://php.net/phar.readonly -;phar.readonly = On - -; https://php.net/phar.require-hash -;phar.require_hash = On - -;phar.cache_list = - -[mail function] -; For Win32 only. -; https://php.net/smtp -SMTP = localhost -; https://php.net/smtp-port -smtp_port = 25 - -; For Win32 only. -; https://php.net/sendmail-from -;sendmail_from = me@example.com - -; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). -; https://php.net/sendmail-path -;sendmail_path = - -; Force the addition of the specified parameters to be passed as extra parameters -; to the sendmail binary. These parameters will always replace the value of -; the 5th parameter to mail(). -;mail.force_extra_parameters = - -; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename -mail.add_x_header = Off - -; Use mixed LF and CRLF line separators to keep compatibility with some -; RFC 2822 non conformant MTA. -mail.mixed_lf_and_crlf = Off - -; The path to a log file that will log all mail() calls. Log entries include -; the full path of the script, line number, To address and headers. -;mail.log = -; Log mail to syslog (Event Log on Windows). -;mail.log = syslog - -[ODBC] -; https://php.net/odbc.default-db -;odbc.default_db = Not yet implemented - -; https://php.net/odbc.default-user -;odbc.default_user = Not yet implemented - -; https://php.net/odbc.default-pw -;odbc.default_pw = Not yet implemented - -; Controls the ODBC cursor model. -; Default: SQL_CURSOR_STATIC (default). -;odbc.default_cursortype - -; Allow or prevent persistent links. -; https://php.net/odbc.allow-persistent -odbc.allow_persistent = On - -; Check that a connection is still valid before reuse. -; https://php.net/odbc.check-persistent -odbc.check_persistent = On - -; Maximum number of persistent links. -1 means no limit. -; https://php.net/odbc.max-persistent -odbc.max_persistent = -1 - -; Maximum number of links (persistent + non-persistent). -1 means no limit. -; https://php.net/odbc.max-links -odbc.max_links = -1 - -; Handling of LONG fields. Returns number of bytes to variables. 0 means -; passthru. -; https://php.net/odbc.defaultlrl -odbc.defaultlrl = 4096 - -; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. -; See the documentation on odbc_binmode and odbc_longreadlen for an explanation -; of odbc.defaultlrl and odbc.defaultbinmode -; https://php.net/odbc.defaultbinmode -odbc.defaultbinmode = 1 - -[MySQLi] - -; Maximum number of persistent links. -1 means no limit. -; https://php.net/mysqli.max-persistent -mysqli.max_persistent = -1 - -; Allow accessing, from PHP's perspective, local files with LOAD DATA statements -; https://php.net/mysqli.allow_local_infile -;mysqli.allow_local_infile = On - -; It allows the user to specify a folder where files that can be sent via LOAD DATA -; LOCAL can exist. It is ignored if mysqli.allow_local_infile is enabled. -;mysqli.local_infile_directory = - -; Allow or prevent persistent links. -; https://php.net/mysqli.allow-persistent -mysqli.allow_persistent = On - -; Maximum number of links. -1 means no limit. -; https://php.net/mysqli.max-links -mysqli.max_links = -1 - -; Default port number for mysqli_connect(). -; https://php.net/mysqli.default-port -mysqli.default_port = 3306 - -; Default socket name for local MySQL connects. If empty, uses the built-in -; MySQL defaults. -; https://php.net/mysqli.default-socket -mysqli.default_socket = - -; Default host for mysqli_connect(). -; https://php.net/mysqli.default-host -mysqli.default_host = - -; Default user for mysqli_connect(). -; https://php.net/mysqli.default-user -mysqli.default_user = - -; Default password for mysqli_connect(). -; Note that this is generally a *bad* idea to store passwords in this file. -; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") -; and reveal this password! And of course, any users with read access to this -; file will be able to reveal the password as well. -; https://php.net/mysqli.default-pw -mysqli.default_pw = - -; If this option is enabled, closing a persistent connection will rollback -; any pending transactions of this connection, before it is put back -; into the persistent connection pool. -;mysqli.rollback_on_cached_plink = Off - -[mysqlnd] -; Enable / Disable collection of general statistics by mysqlnd which can be -; used to tune and monitor MySQL operations. -mysqlnd.collect_statistics = On - -; Enable / Disable collection of memory usage statistics by mysqlnd which can be -; used to tune and monitor MySQL operations. -; Default Value: Off -; Development Value: On -; Production Value: Off -mysqlnd.collect_memory_statistics = Off - -; Records communication from all extensions using mysqlnd to the specified log -; file. -; https://php.net/mysqlnd.debug -;mysqlnd.debug = - -; Defines which queries will be logged. -;mysqlnd.log_mask = 0 - -; Default size of the mysqlnd memory pool, which is used by result sets. -;mysqlnd.mempool_default_size = 16000 - -; Size of a pre-allocated buffer used when sending commands to MySQL in bytes. -;mysqlnd.net_cmd_buffer_size = 2048 - -; Size of a pre-allocated buffer used for reading data sent by the server in -; bytes. -;mysqlnd.net_read_buffer_size = 32768 - -; Timeout for network requests in seconds. -;mysqlnd.net_read_timeout = 31536000 - -; SHA-256 Authentication Plugin related. File with the MySQL server public RSA -; key. -;mysqlnd.sha256_server_public_key = - -[PostgreSQL] -; Allow or prevent persistent links. -; https://php.net/pgsql.allow-persistent -pgsql.allow_persistent = On - -; Detect broken persistent links always with pg_pconnect(). -; Auto reset feature requires a little overheads. -; https://php.net/pgsql.auto-reset-persistent -pgsql.auto_reset_persistent = Off - -; Maximum number of persistent links. -1 means no limit. -; https://php.net/pgsql.max-persistent -pgsql.max_persistent = -1 - -; Maximum number of links (persistent+non persistent). -1 means no limit. -; https://php.net/pgsql.max-links -pgsql.max_links = -1 - -; Ignore PostgreSQL backends Notice message or not. -; Notice message logging require a little overheads. -; https://php.net/pgsql.ignore-notice -pgsql.ignore_notice = 0 - -; Log PostgreSQL backends Notice message or not. -; Unless pgsql.ignore_notice=0, module cannot log notice message. -; https://php.net/pgsql.log-notice -pgsql.log_notice = 0 - -[bcmath] -; Number of decimal digits for all bcmath functions. -; https://php.net/bcmath.scale -bcmath.scale = 0 - -[browscap] -; https://php.net/browscap -;browscap = extra/browscap.ini - -[Session] -; Handler used to store/retrieve data. -; https://php.net/session.save-handler -session.save_handler = files - -; Argument passed to save_handler. In the case of files, this is the path -; where data files are stored. Note: Windows users have to change this -; variable in order to use PHP's session functions. -; -; The path can be defined as: -; -; session.save_path = "N;/path" -; -; where N is an integer. Instead of storing all the session files in -; /path, what this will do is use subdirectories N-levels deep, and -; store the session data in those directories. This is useful if -; your OS has problems with many files in one directory, and is -; a more efficient layout for servers that handle many sessions. -; -; NOTE 1: PHP will not create this directory structure automatically. -; You can use the script in the ext/session dir for that purpose. -; NOTE 2: See the section on garbage collection below if you choose to -; use subdirectories for session storage -; -; The file storage module creates files using mode 600 by default. -; You can change that by using -; -; session.save_path = "N;MODE;/path" -; -; where MODE is the octal representation of the mode. Note that this -; does not overwrite the process's umask. -; https://php.net/session.save-path -;session.save_path = "/tmp" - -; Whether to use strict session mode. -; Strict session mode does not accept an uninitialized session ID, and -; regenerates the session ID if the browser sends an uninitialized session ID. -; Strict mode protects applications from session fixation via a session adoption -; vulnerability. It is disabled by default for maximum compatibility, but -; enabling it is encouraged. -; https://wiki.php.net/rfc/strict_sessions -session.use_strict_mode = 0 - -; Whether to use cookies. -; https://php.net/session.use-cookies -session.use_cookies = 1 - -; https://php.net/session.cookie-secure -;session.cookie_secure = - -; This option forces PHP to fetch and use a cookie for storing and maintaining -; the session id. We encourage this operation as it's very helpful in combating -; session hijacking when not specifying and managing your own session id. It is -; not the be-all and end-all of session hijacking defense, but it's a good start. -; https://php.net/session.use-only-cookies -session.use_only_cookies = 1 - -; Name of the session (used as cookie name). -; https://php.net/session.name -session.name = PHPSESSID - -; Initialize session on request startup. -; https://php.net/session.auto-start -session.auto_start = 0 - -; Lifetime in seconds of cookie or, if 0, until browser is restarted. -; https://php.net/session.cookie-lifetime -session.cookie_lifetime = 0 - -; The path for which the cookie is valid. -; https://php.net/session.cookie-path -session.cookie_path = / - -; The domain for which the cookie is valid. -; https://php.net/session.cookie-domain -session.cookie_domain = - -; Whether or not to add the httpOnly flag to the cookie, which makes it -; inaccessible to browser scripting languages such as JavaScript. -; https://php.net/session.cookie-httponly -session.cookie_httponly = - -; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF) -; Current valid values are "Strict", "Lax" or "None". When using "None", -; make sure to include the quotes, as `none` is interpreted like `false` in ini files. -; https://tools.ietf.org/html/draft-west-first-party-cookies-07 -session.cookie_samesite = - -; Handler used to serialize data. php is the standard serializer of PHP. -; https://php.net/session.serialize-handler -session.serialize_handler = php - -; Defines the probability that the 'garbage collection' process is started on every -; session initialization. The probability is calculated by using gc_probability/gc_divisor, -; e.g. 1/100 means there is a 1% chance that the GC process starts on each request. -; Default Value: 1 -; Development Value: 1 -; Production Value: 1 -; https://php.net/session.gc-probability -session.gc_probability = 1 - -; Defines the probability that the 'garbage collection' process is started on every -; session initialization. The probability is calculated by using gc_probability/gc_divisor, -; e.g. 1/100 means there is a 1% chance that the GC process starts on each request. -; For high volume production servers, using a value of 1000 is a more efficient approach. -; Default Value: 100 -; Development Value: 1000 -; Production Value: 1000 -; https://php.net/session.gc-divisor -session.gc_divisor = 1000 - -; After this number of seconds, stored data will be seen as 'garbage' and -; cleaned up by the garbage collection process. -; https://php.net/session.gc-maxlifetime -session.gc_maxlifetime = 1440 - -; NOTE: If you are using the subdirectory option for storing session files -; (see session.save_path above), then garbage collection does *not* -; happen automatically. You will need to do your own garbage -; collection through a shell script, cron entry, or some other method. -; For example, the following script is the equivalent of setting -; session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): -; find /path/to/sessions -cmin +24 -type f | xargs rm - -; Check HTTP Referer to invalidate externally stored URLs containing ids. -; HTTP_REFERER has to contain this substring for the session to be -; considered as valid. -; https://php.net/session.referer-check -session.referer_check = - -; Set to {nocache,private,public,} to determine HTTP caching aspects -; or leave this empty to avoid sending anti-caching headers. -; https://php.net/session.cache-limiter -session.cache_limiter = nocache - -; Document expires after n minutes. -; https://php.net/session.cache-expire -session.cache_expire = 180 - -; trans sid support is disabled by default. -; Use of trans sid may risk your users' security. -; Use this option with caution. -; - User may send URL contains active session ID -; to other person via. email/irc/etc. -; - URL that contains active session ID may be stored -; in publicly accessible computer. -; - User may access your site with the same session ID -; always using URL stored in browser's history or bookmarks. -; https://php.net/session.use-trans-sid -session.use_trans_sid = 0 - -; The URL rewriter will look for URLs in a defined set of HTML tags. -; is special; if you include them here, the rewriter will -; add a hidden field with the info which is otherwise appended -; to URLs. tag's action attribute URL will not be modified -; unless it is specified. -; Note that all valid entries require a "=", even if no value follows. -; Default Value: "a=href,area=href,frame=src,form=" -; Development Value: "a=href,area=href,frame=src,form=" -; Production Value: "a=href,area=href,frame=src,form=" -; https://php.net/url-rewriter.tags -session.trans_sid_tags = "a=href,area=href,frame=src,form=" - -; URL rewriter does not rewrite absolute URLs by default. -; To enable rewrites for absolute paths, target hosts must be specified -; at RUNTIME. i.e. use ini_set() -; tags is special. PHP will check action attribute's URL regardless -; of session.trans_sid_tags setting. -; If no host is defined, HTTP_HOST will be used for allowed host. -; Example value: php.net,www.php.net,wiki.php.net -; Use "," for multiple hosts. No spaces are allowed. -; Default Value: "" -; Development Value: "" -; Production Value: "" -;session.trans_sid_hosts="" - -; Enable upload progress tracking in $_SESSION -; Default Value: On -; Development Value: On -; Production Value: On -; https://php.net/session.upload-progress.enabled -;session.upload_progress.enabled = On - -; Cleanup the progress information as soon as all POST data has been read -; (i.e. upload completed). -; Default Value: On -; Development Value: On -; Production Value: On -; https://php.net/session.upload-progress.cleanup -;session.upload_progress.cleanup = On - -; A prefix used for the upload progress key in $_SESSION -; Default Value: "upload_progress_" -; Development Value: "upload_progress_" -; Production Value: "upload_progress_" -; https://php.net/session.upload-progress.prefix -;session.upload_progress.prefix = "upload_progress_" - -; The index name (concatenated with the prefix) in $_SESSION -; containing the upload progress information -; Default Value: "PHP_SESSION_UPLOAD_PROGRESS" -; Development Value: "PHP_SESSION_UPLOAD_PROGRESS" -; Production Value: "PHP_SESSION_UPLOAD_PROGRESS" -; https://php.net/session.upload-progress.name -;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" - -; How frequently the upload progress should be updated. -; Given either in percentages (per-file), or in bytes -; Default Value: "1%" -; Development Value: "1%" -; Production Value: "1%" -; https://php.net/session.upload-progress.freq -;session.upload_progress.freq = "1%" - -; The minimum delay between updates, in seconds -; Default Value: 1 -; Development Value: 1 -; Production Value: 1 -; https://php.net/session.upload-progress.min-freq -;session.upload_progress.min_freq = "1" - -; Only write session data when session data is changed. Enabled by default. -; https://php.net/session.lazy-write -;session.lazy_write = On - -[Assertion] -; Switch whether to compile assertions at all (to have no overhead at run-time) -; -1: Do not compile at all -; 0: Jump over assertion at run-time -; 1: Execute assertions -; Changing from or to a negative value is only possible in php.ini! -; (For turning assertions on and off at run-time, toggle zend.assertions between the values 1 and 0) -; Default Value: 1 -; Development Value: 1 -; Production Value: -1 -; https://php.net/zend.assertions -zend.assertions = -1 - -[COM] -; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs -; https://php.net/com.typelib-file -;com.typelib_file = - -; allow Distributed-COM calls -; https://php.net/com.allow-dcom -;com.allow_dcom = true - -; autoregister constants of a component's typelib on com_load() -; https://php.net/com.autoregister-typelib -;com.autoregister_typelib = true - -; register constants casesensitive -; https://php.net/com.autoregister-casesensitive -;com.autoregister_casesensitive = false - -; show warnings on duplicate constant registrations -; https://php.net/com.autoregister-verbose -;com.autoregister_verbose = true - -; The default character set code-page to use when passing strings to and from COM objects. -; Default: system ANSI code page -;com.code_page= - -; The version of the .NET framework to use. The value of the setting are the first three parts -; of the framework's version number, separated by dots, and prefixed with "v", e.g. "v4.0.30319". -;com.dotnet_version= - -[mbstring] -; language for internal character representation. -; This affects mb_send_mail() and mbstring.detect_order. -; https://php.net/mbstring.language -;mbstring.language = Japanese - -; Use of this INI entry is deprecated, use global internal_encoding instead. -; internal/script encoding. -; Some encoding cannot work as internal encoding. (e.g. SJIS, BIG5, ISO-2022-*) -; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. -; The precedence is: default_charset < internal_encoding < iconv.internal_encoding -;mbstring.internal_encoding = - -; Use of this INI entry is deprecated, use global input_encoding instead. -; http input encoding. -; mbstring.encoding_translation = On is needed to use this setting. -; If empty, default_charset or input_encoding or mbstring.input is used. -; The precedence is: default_charset < input_encoding < mbstring.http_input -; https://php.net/mbstring.http-input -;mbstring.http_input = - -; Use of this INI entry is deprecated, use global output_encoding instead. -; http output encoding. -; mb_output_handler must be registered as output buffer to function. -; If empty, default_charset or output_encoding or mbstring.http_output is used. -; The precedence is: default_charset < output_encoding < mbstring.http_output -; To use an output encoding conversion, mbstring's output handler must be set -; otherwise output encoding conversion cannot be performed. -; https://php.net/mbstring.http-output -;mbstring.http_output = - -; enable automatic encoding translation according to -; mbstring.internal_encoding setting. Input chars are -; converted to internal encoding by setting this to On. -; Note: Do _not_ use automatic encoding translation for -; portable libs/applications. -; https://php.net/mbstring.encoding-translation -;mbstring.encoding_translation = Off - -; automatic encoding detection order. -; "auto" detect order is changed according to mbstring.language -; https://php.net/mbstring.detect-order -;mbstring.detect_order = auto - -; substitute_character used when character cannot be converted -; one from another -; https://php.net/mbstring.substitute-character -;mbstring.substitute_character = none - -; Enable strict encoding detection. -;mbstring.strict_detection = Off - -; This directive specifies the regex pattern of content types for which mb_output_handler() -; is activated. -; Default: mbstring.http_output_conv_mimetypes=^(text/|application/xhtml\+xml) -;mbstring.http_output_conv_mimetypes= - -; This directive specifies maximum stack depth for mbstring regular expressions. It is similar -; to the pcre.recursion_limit for PCRE. -;mbstring.regex_stack_limit=100000 - -; This directive specifies maximum retry count for mbstring regular expressions. It is similar -; to the pcre.backtrack_limit for PCRE. -;mbstring.regex_retry_limit=1000000 - -[gd] -; Tell the jpeg decode to ignore warnings and try to create -; a gd image. The warning will then be displayed as notices -; disabled by default -; https://php.net/gd.jpeg-ignore-warning -;gd.jpeg_ignore_warning = 1 - -[exif] -; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS. -; With mbstring support this will automatically be converted into the encoding -; given by corresponding encode setting. When empty mbstring.internal_encoding -; is used. For the decode settings you can distinguish between motorola and -; intel byte order. A decode setting must not be empty. -; https://php.net/exif.encode-unicode -;exif.encode_unicode = ISO-8859-15 - -; https://php.net/exif.decode-unicode-motorola -;exif.decode_unicode_motorola = UCS-2BE - -; https://php.net/exif.decode-unicode-intel -;exif.decode_unicode_intel = UCS-2LE - -; https://php.net/exif.encode-jis -;exif.encode_jis = - -; https://php.net/exif.decode-jis-motorola -;exif.decode_jis_motorola = JIS - -; https://php.net/exif.decode-jis-intel -;exif.decode_jis_intel = JIS - -[Tidy] -; The path to a default tidy configuration file to use when using tidy -; https://php.net/tidy.default-config -;tidy.default_config = /usr/local/lib/php/default.tcfg - -; Should tidy clean and repair output automatically? -; WARNING: Do not use this option if you are generating non-html content -; such as dynamic images -; https://php.net/tidy.clean-output -tidy.clean_output = Off - -[soap] -; Enables or disables WSDL caching feature. -; https://php.net/soap.wsdl-cache-enabled -soap.wsdl_cache_enabled=1 - -; Sets the directory name where SOAP extension will put cache files. -; https://php.net/soap.wsdl-cache-dir -soap.wsdl_cache_dir="/tmp" - -; (time to live) Sets the number of second while cached file will be used -; instead of original one. -; https://php.net/soap.wsdl-cache-ttl -soap.wsdl_cache_ttl=86400 - -; Sets the size of the cache limit. (Max. number of WSDL files to cache) -soap.wsdl_cache_limit = 5 - -[sysvshm] -; A default size of the shared memory segment -;sysvshm.init_mem = 10000 - -[ldap] -; Sets the maximum number of open links or -1 for unlimited. -ldap.max_links = -1 - -[dba] -;dba.default_handler= - -[opcache] -; Determines if Zend OPCache is enabled -;opcache.enable=1 - -; Determines if Zend OPCache is enabled for the CLI version of PHP -;opcache.enable_cli=0 - -; The OPcache shared memory storage size. -;opcache.memory_consumption=128 - -; The amount of memory for interned strings in Mbytes. -;opcache.interned_strings_buffer=8 - -; The maximum number of keys (scripts) in the OPcache hash table. -; Only numbers between 200 and 1000000 are allowed. -;opcache.max_accelerated_files=10000 - -; The maximum percentage of "wasted" memory until a restart is scheduled. -;opcache.max_wasted_percentage=5 - -; When this directive is enabled, the OPcache appends the current working -; directory to the script key, thus eliminating possible collisions between -; files with the same name (basename). Disabling the directive improves -; performance, but may break existing applications. -;opcache.use_cwd=1 - -; When disabled, you must reset the OPcache manually or restart the -; webserver for changes to the filesystem to take effect. -;opcache.validate_timestamps=1 - -; How often (in seconds) to check file timestamps for changes to the shared -; memory storage allocation. ("1" means validate once per second, but only -; once per request. "0" means always validate) -;opcache.revalidate_freq=2 - -; Enables or disables file search in include_path optimization -;opcache.revalidate_path=0 - -; If disabled, all PHPDoc comments are dropped from the code to reduce the -; size of the optimized code. -;opcache.save_comments=1 - -; If enabled, compilation warnings (including notices and deprecations) will -; be recorded and replayed each time a file is included. Otherwise, compilation -; warnings will only be emitted when the file is first cached. -;opcache.record_warnings=0 - -; Allow file existence override (file_exists, etc.) performance feature. -;opcache.enable_file_override=0 - -; A bitmask, where each bit enables or disables the appropriate OPcache -; passes -;opcache.optimization_level=0x7FFFBFFF - -;opcache.dups_fix=0 - -; The location of the OPcache blacklist file (wildcards allowed). -; Each OPcache blacklist file is a text file that holds the names of files -; that should not be accelerated. The file format is to add each filename -; to a new line. The filename may be a full path or just a file prefix -; (i.e., /var/www/x blacklists all the files and directories in /var/www -; that start with 'x'). Line starting with a ; are ignored (comments). -;opcache.blacklist_filename= - -; Allows exclusion of large files from being cached. By default all files -; are cached. -;opcache.max_file_size=0 - -; How long to wait (in seconds) for a scheduled restart to begin if the cache -; is not being accessed. -;opcache.force_restart_timeout=180 - -; OPcache error_log file name. Empty string assumes "stderr". -;opcache.error_log= - -; All OPcache errors go to the Web server log. -; By default, only fatal errors (level 0) or errors (level 1) are logged. -; You can also enable warnings (level 2), info messages (level 3) or -; debug messages (level 4). -;opcache.log_verbosity_level=1 - -; Preferred Shared Memory back-end. Leave empty and let the system decide. -;opcache.preferred_memory_model= - -; Protect the shared memory from unexpected writing during script execution. -; Useful for internal debugging only. -;opcache.protect_memory=0 - -; Allows calling OPcache API functions only from PHP scripts which path is -; started from specified string. The default "" means no restriction -;opcache.restrict_api= - -; Mapping base of shared memory segments (for Windows only). All the PHP -; processes have to map shared memory into the same address space. This -; directive allows to manually fix the "Unable to reattach to base address" -; errors. -;opcache.mmap_base= - -; Facilitates multiple OPcache instances per user (for Windows only). All PHP -; processes with the same cache ID and user share an OPcache instance. -;opcache.cache_id= - -; Enables and sets the second level cache directory. -; It should improve performance when SHM memory is full, at server restart or -; SHM reset. The default "" disables file based caching. -;opcache.file_cache= - -; Enables or disables read-only mode for the second level cache directory. -; It should improve performance for read-only containers, -; when the cache is pre-warmed and packaged alongside the application. -; Best used with `opcache.validate_timestamps=0`, `opcache.enable_file_override=1` -; and `opcache.file_cache_consistency_checks=0`. -; Note: A cache generated with a different build of PHP, a different file path, -; or different settings (including which extensions are loaded), may be ignored. -;opcache.file_cache_read_only=0 - -; Enables or disables opcode caching in shared memory. -;opcache.file_cache_only=0 - -; Enables or disables checksum validation when script loaded from file cache. -;opcache.file_cache_consistency_checks=1 - -; Implies opcache.file_cache_only=1 for a certain process that failed to -; reattach to the shared memory (for Windows only). Explicitly enabled file -; cache is required. -;opcache.file_cache_fallback=1 - -; Enables or disables copying of PHP code (text segment) into HUGE PAGES. -; Under certain circumstances (if only a single global PHP process is -; started from which all others fork), this can increase performance -; by a tiny amount because TLB misses are reduced. On the other hand, this -; delays PHP startup, increases memory usage and degrades performance -; under memory pressure - use with care. -; Requires appropriate OS configuration. -;opcache.huge_code_pages=0 - -; Validate cached file permissions. -;opcache.validate_permission=0 - -; Prevent name collisions in chroot'ed environment. -;opcache.validate_root=0 - -; If specified, it produces opcode dumps for debugging different stages of -; optimizations. -;opcache.opt_debug_level=0 - -; Specifies a PHP script that is going to be compiled and executed at server -; start-up. -; https://php.net/opcache.preload -;opcache.preload= - -; Preloading code as root is not allowed for security reasons. This directive -; facilitates to let the preloading to be run as another user. -; https://php.net/opcache.preload_user -;opcache.preload_user= - -; Prevents caching files that are less than this number of seconds old. It -; protects from caching of incompletely updated files. In case all file updates -; on your site are atomic, you may increase performance by setting it to "0". -;opcache.file_update_protection=2 - -; Absolute path used to store shared lockfiles (for *nix only). -;opcache.lockfile_path=/tmp - -[curl] -; A default value for the CURLOPT_CAINFO option. This is required to be an -; absolute path. -;curl.cainfo = - -[openssl] -; The location of a Certificate Authority (CA) file on the local filesystem -; to use when verifying the identity of SSL/TLS peers. Most users should -; not specify a value for this directive as PHP will attempt to use the -; OS-managed cert stores in its absence. If specified, this value may still -; be overridden on a per-stream basis via the "cafile" SSL stream context -; option. -;openssl.cafile= - -; If openssl.cafile is not specified or if the CA file is not found, the -; directory pointed to by openssl.capath is searched for a suitable -; certificate. This value must be a correctly hashed certificate directory. -; Most users should not specify a value for this directive as PHP will -; attempt to use the OS-managed cert stores in its absence. If specified, -; this value may still be overridden on a per-stream basis via the "capath" -; SSL stream context option. -;openssl.capath= - -[ffi] -; FFI API restriction. Possible values: -; "preload" - enabled in CLI scripts and preloaded files (default) -; "false" - always disabled -; "true" - always enabled -;ffi.enable=preload - -; List of headers files to preload, wildcard patterns allowed. -;ffi.preload= \ No newline at end of file diff --git a/static-builder-gnu.Dockerfile b/static-builder-gnu.Dockerfile index 539aad3681..f818b77e72 100644 --- a/static-builder-gnu.Dockerfile +++ b/static-builder-gnu.Dockerfile @@ -127,14 +127,14 @@ ENV COMPOSER_ALLOW_SUPERUSER=1 # install tools to build packages, if requested - needs gcc 10 RUN if [ "${BUILD_PACKAGES}" != "" ]; then \ yum install -y make bzip2 openssl-devel libffi-devel zlib-devel libyaml libyaml-devel rpm-build && \ - curl -o ruby.tar.gz -fsSL https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz && \ + curl -o ruby.tar.gz -fsSL https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.2.tar.gz && \ tar -xzf ruby.tar.gz && \ - cd ruby-3.2.2 && \ + cd ruby-3.4.2 && \ ./configure --without-baseruby && \ make && \ make install && \ cd .. && \ - rm -rf ruby-3.2.2 ruby.tar.gz && \ + rm -rf ruby-3.4.2 ruby.tar.gz && \ gem install fpm; \ fi @@ -153,7 +153,7 @@ COPY --link internal internal COPY --link package package RUN --mount=type=secret,id=github-token ./build-static.sh && \ - rm -Rf dist/static-php-cli/source/* && \ if [ "${BUILD_PACKAGES}" != "" ]; then \ ./build-packages.sh; \ - fi + fi ; \ + rm -Rf dist/static-php-cli/source/* From 0a7df356c7524e8492561bcb1b66e49bbd910aa1 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Fri, 18 Apr 2025 15:28:30 +0700 Subject: [PATCH 34/75] move Caddyfile to /etc/frankenphp/Caddyfile --- Dockerfile | 8 ++++---- alpine.Dockerfile | 6 +++--- dev-alpine.Dockerfile | 9 ++++++--- dev.Dockerfile | 9 ++++++--- docs/cn/config.md | 2 +- docs/config.md | 3 ++- docs/fr/config.md | 2 +- docs/ru/config.md | 2 +- docs/tr/config.md | 2 +- 9 files changed, 25 insertions(+), 18 deletions(-) diff --git a/Dockerfile b/Dockerfile index a1e804153f..4e08c2a13e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,17 +19,17 @@ RUN set -eux; \ /app/public \ /config/caddy \ /data/caddy \ - /etc/caddy; \ + /etc/frankenphp; \ sed -i 's/php/frankenphp run/g' /usr/local/bin/docker-php-entrypoint; \ echo ' /app/public/index.php -COPY --link caddy/frankenphp/Caddyfile /etc/caddy/Caddyfile +COPY --link caddy/frankenphp/Caddyfile /etc/frankenphp/Caddyfile RUN curl -sSLf \ -o /usr/local/bin/install-php-extensions \ https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions && \ chmod +x /usr/local/bin/install-php-extensions -CMD ["--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"] +CMD ["--config", "/etc/frankenphp/Caddyfile", "--adapter", "caddyfile"] HEALTHCHECK CMD curl -f http://localhost:2019/metrics || exit 1 # See https://caddyserver.com/docs/conventions#file-locations for details @@ -112,7 +112,7 @@ RUN echo $CGO_LDFLAGS WORKDIR /go/src/app/caddy/frankenphp RUN GOBIN=/usr/local/bin go install -tags 'nobadger,nomysql,nopgx' -ldflags "-w -s -X 'github.com/caddyserver/caddy/v2.CustomVersion=FrankenPHP $FRANKENPHP_VERSION PHP $PHP_VERSION Caddy'" -buildvcs=true && \ setcap cap_net_bind_service=+ep /usr/local/bin/frankenphp && \ - cp Caddyfile /etc/caddy/Caddyfile && \ + cp Caddyfile /etc/frankenphp/Caddyfile && \ frankenphp version && \ frankenphp build-info diff --git a/alpine.Dockerfile b/alpine.Dockerfile index 7089ce93a6..964daa95ef 100644 --- a/alpine.Dockerfile +++ b/alpine.Dockerfile @@ -18,17 +18,17 @@ RUN set -eux; \ /app/public \ /config/caddy \ /data/caddy \ - /etc/caddy; \ + /etc/frankenphp; \ sed -i 's/php/frankenphp run/g' /usr/local/bin/docker-php-entrypoint; \ echo ' /app/public/index.php -COPY --link caddy/frankenphp/Caddyfile /etc/caddy/Caddyfile +COPY --link caddy/frankenphp/Caddyfile /etc/frankenphp/Caddyfile RUN curl -sSLf \ -o /usr/local/bin/install-php-extensions \ https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions && \ chmod +x /usr/local/bin/install-php-extensions -CMD ["--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"] +CMD ["--config", "/etc/frankenphp/Caddyfile", "--adapter", "caddyfile"] HEALTHCHECK CMD curl -f http://localhost:2019/metrics || exit 1 # See https://caddyserver.com/docs/conventions#file-locations for details diff --git a/dev-alpine.Dockerfile b/dev-alpine.Dockerfile index e5f35f2ec8..371898ed42 100644 --- a/dev-alpine.Dockerfile +++ b/dev-alpine.Dockerfile @@ -55,13 +55,16 @@ RUN git clone --branch=PHP-8.4 https://github.com/php/php-src.git . && \ --enable-zts \ --disable-zend-signals \ --enable-zend-max-execution-timers \ + --with-config-file-path=/etc/frankenphp/php.ini \ + --with-config-file-scan-dir=/etc/frankenphp/php.d \ --enable-debug && \ make -j"$(nproc)" && \ make install && \ ldconfig /etc/ld.so.conf.d && \ - cp php.ini-development /usr/local/lib/php.ini && \ - echo "zend_extension=opcache.so" >> /usr/local/lib/php.ini && \ - echo "opcache.enable=1" >> /usr/local/lib/php.ini && \ + mkdir -p /etc/frankenphp/php.d && \ + cp php.ini-development /etc/frankenphp/php.ini && \ + echo "zend_extension=opcache.so" >> /etc/frankenphp/php.ini && \ + echo "opcache.enable=1" >> /etcfrankenphp/php.ini && \ php --version # Install e-dant/watcher (necessary for file watching) diff --git a/dev.Dockerfile b/dev.Dockerfile index 8a5e7f46d1..1d0d292c79 100644 --- a/dev.Dockerfile +++ b/dev.Dockerfile @@ -57,13 +57,16 @@ RUN git clone --branch=PHP-8.4 https://github.com/php/php-src.git . && \ --enable-zts \ --disable-zend-signals \ --enable-zend-max-execution-timers \ + --with-config-file-path=/etc/frankenphp/php.ini \ + --with-config-file-scan-dir=/etc/frankenphp/php.d \ --enable-debug && \ make -j"$(nproc)" && \ make install && \ ldconfig && \ - cp php.ini-development /usr/local/lib/php.ini && \ - echo "zend_extension=opcache.so" >> /usr/local/lib/php.ini && \ - echo "opcache.enable=1" >> /usr/local/lib/php.ini && \ + mkdir -p /etc/frankenphp/php.d && \ + cp php.ini-development /etc/frankenphp/php.ini && \ + echo "zend_extension=opcache.so" >> /etc/frankenphp/php.ini && \ + echo "opcache.enable=1" >> /etcfrankenphp/php.ini && \ php --version # Install e-dant/watcher (necessary for file watching) diff --git a/docs/cn/config.md b/docs/cn/config.md index 870af359ba..72496f4afc 100644 --- a/docs/cn/config.md +++ b/docs/cn/config.md @@ -2,7 +2,7 @@ FrankenPHP,Caddy 以及 Mercure 和 Vulcain 模块可以使用 [Caddy 支持的格式](https://caddyserver.com/docs/getting-started#your-first-config) 进行配置。 -在[Docker 映像](docker.md) 中,`Caddyfile` 位于 `/etc/caddy/Caddyfile`。 +在[Docker 映像](docker.md) 中,`Caddyfile` 位于 `/etc/frankenphp/Caddyfile`。 静态二进制文件会在启动时所在的目录中查找 `Caddyfile`。 PHP 本身可以[使用 `php.ini` 文件](https://www.php.net/manual/zh/configuration.file.php)进行配置。 默认情况下,随 Docker 映像提供的 PHP 和静态二进制文件中包含的 PHP 将在启动 FrankenPHP 的目录和 `/usr/local/etc/php/` 中查找`php.ini` 文件。它们还会从 `/usr/local/etc/php/conf.d/` 中加载所有以 `.ini` 结尾的文件。 diff --git a/docs/config.md b/docs/config.md index e62528a47a..0167ff5904 100644 --- a/docs/config.md +++ b/docs/config.md @@ -2,7 +2,8 @@ FrankenPHP, Caddy as well as the Mercure and Vulcain modules can be configured using [the formats supported by Caddy](https://caddyserver.com/docs/getting-started#your-first-config). -In [the Docker images](docker.md), the `Caddyfile` is located at `/etc/caddy/Caddyfile`. The static binary will look for the `Caddyfile` in the directory where the `frankenphp run` command is executed. You can specify a custom path with the `-c` or `--config` option. +In [the Docker images](docker.md), the `Caddyfile` is located at `/etc/frankenphp/Caddyfile`. +The static binary will look for the `Caddyfile` in the directory in which it is started. PHP itself can be configured [using a `php.ini` file](https://www.php.net/manual/en/configuration.file.php). diff --git a/docs/fr/config.md b/docs/fr/config.md index 787c6bfcb4..f400acf301 100644 --- a/docs/fr/config.md +++ b/docs/fr/config.md @@ -2,7 +2,7 @@ FrankenPHP, Caddy ainsi que les modules Mercure et Vulcain peuvent être configurés en utilisant [les formats pris en charge par Caddy](https://caddyserver.com/docs/getting-started#your-first-config). -Dans [les images Docker](docker.md), le `Caddyfile` est situé dans `/etc/caddy/Caddyfile`. +Dans [les images Docker](docker.md), le `Caddyfile` est situé dans `/etc/frankenphp/Caddyfile`. Le binaire statique cherchera le `Caddyfile` dans le répertoire dans lequel il est démarré. PHP lui-même peut être configuré [en utilisant un fichier `php.ini`](https://www.php.net/manual/fr/configuration.file.php). diff --git a/docs/ru/config.md b/docs/ru/config.md index ebc62a5bee..af35826cce 100644 --- a/docs/ru/config.md +++ b/docs/ru/config.md @@ -2,7 +2,7 @@ FrankenPHP, Caddy, а также модули Mercure и Vulcain могут быть настроены с использованием [конфигурационных форматов, поддерживаемых Caddy](https://caddyserver.com/docs/getting-started#your-first-config). -В [Docker-образах](docker.md) файл `Caddyfile` находится по пути `/etc/caddy/Caddyfile`. +В [Docker-образах](docker.md) файл `Caddyfile` находится по пути `/etc/frankenphp/Caddyfile`. Статический бинарный файл будет искать `Caddyfile` в директории запуска. PHP можно настроить [с помощью файла `php.ini`](https://www.php.net/manual/en/configuration.file.php). diff --git a/docs/tr/config.md b/docs/tr/config.md index 0ea66b45b9..084c52167d 100644 --- a/docs/tr/config.md +++ b/docs/tr/config.md @@ -2,7 +2,7 @@ FrankenPHP, Caddy'nin yanı sıra Mercure ve Vulcain modülleri [Caddy tarafından desteklenen formatlar](https://caddyserver.com/docs/getting-started#your-first-config) kullanılarak yapılandırılabilir. -Docker imajlarında] (docker.md), `Caddyfile` `/etc/caddy/Caddyfile` adresinde bulunur. +Docker imajlarında] (docker.md), `Caddyfile` `/etc/frankenphp/Caddyfile` adresinde bulunur. Statik ikili, başlatıldığı dizinde `Caddyfile` dosyasını arayacaktır. PHP'nin kendisi [bir `php.ini` dosyası kullanılarak yapılandırılabilir](https://www.php.net/manual/tr/configuration.file.php). From b5853ff1379ae99db535d3fe899043a054d01588 Mon Sep 17 00:00:00 2001 From: Marc Date: Fri, 18 Apr 2025 17:37:42 +0700 Subject: [PATCH 35/75] linter --- docs/config.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/config.md b/docs/config.md index 0167ff5904..79c7ca59c9 100644 --- a/docs/config.md +++ b/docs/config.md @@ -3,7 +3,8 @@ FrankenPHP, Caddy as well as the Mercure and Vulcain modules can be configured using [the formats supported by Caddy](https://caddyserver.com/docs/getting-started#your-first-config). In [the Docker images](docker.md), the `Caddyfile` is located at `/etc/frankenphp/Caddyfile`. -The static binary will look for the `Caddyfile` in the directory in which it is started. +The static binary will also look for the `Caddyfile` in the directory where the `frankenphp run` command is executed. +You can specify a custom path with the `-c` or `--config` option. PHP itself can be configured [using a `php.ini` file](https://www.php.net/manual/en/configuration.file.php). From 69831c575fc72732895281e3f278acb1b5650966 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Fri, 18 Apr 2025 18:37:37 +0700 Subject: [PATCH 36/75] fix a copy and paste error --- .gitignore | 1 + build-packages.sh | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 16910ad232..21bd3b59b4 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ __debug_bin frankenphp.test caddy/frankenphp/Build +package/etc/php.ini *.log diff --git a/build-packages.sh b/build-packages.sh index 1f4aa6d465..8219038dc7 100755 --- a/build-packages.sh +++ b/build-packages.sh @@ -58,9 +58,10 @@ fi mkdir -p package/etc/php.d mkdir -p package/modules -[ -f source_file ] && cp -f dist/static-php-cli/source/php-src/php.ini-production package/etc/php.ini +[ -f ./dist/static-php-cli/source/php-src/php.ini-production ] && cp -f ./dist/static-php-cli/source/php-src/php.ini-production ./package/etc/php.ini cd dist +iteration=1 glibc_version=$(ldd -v "$bin" | awk '/GLIBC_/ {gsub(/[()]/, "", $2); print $2}' | grep -v GLIBC_PRIVATE | sort -V | tail -n1) cxxabi_version=$(strings "$bin" | grep -oP 'CXXABI_\d+\.\d+(\.\d+)?' | sort -V | tail -n1) @@ -70,7 +71,8 @@ fpm -s dir -t rpm -n frankenphp -v "${FRANKENPHP_VERSION}" \ --depends "libc.so.6(${glibc_version})(64bit)" \ --depends "libstdc++.so.6(${cxxabi_version})(64bit)" \ --after-install ../package/after_install.sh \ - "$bin=/usr/bin/frankenphp" \ + --iteration "${iteration}"\ + "${bin}=/usr/bin/frankenphp" \ "../package/frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ "../package/Caddyfile=/etc/frankenphp/Caddyfile" \ "../package/etc/php.ini=/etc/frankenphp/php.ini" \ @@ -88,7 +90,8 @@ fpm -s dir -t deb -n frankenphp -v "${FRANKENPHP_VERSION}" \ --depends "libstdc++6 (>= ${cxxabi_version})" \ --deb-suggests libcap2-bin \ --after-install ../package/after_install.sh \ - "$bin=/usr/bin/frankenphp" \ + --iteration "${iteration}"\ + "${bin}=/usr/bin/frankenphp" \ "../package/frankenphp.service=/lib/systemd/system/frankenphp.service" \ "../package/Caddyfile=/etc/frankenphp/Caddyfile" \ "../package/etc/php.ini=/etc/frankenphp/php.ini" \ From ddf325aca2557eb06df67ca4e3ccc899fa85c195 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Fri, 18 Apr 2025 18:40:51 +0700 Subject: [PATCH 37/75] better describe fallback to 0.0.0 --- build-packages.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build-packages.sh b/build-packages.sh index 8219038dc7..be5b7b62a2 100755 --- a/build-packages.sh +++ b/build-packages.sh @@ -52,7 +52,8 @@ elif [ -d ".git/" ]; then fi if [[ ! "${FRANKENPHP_VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - echo "Error: FRANKENPHP_VERSION must be set to X.Y.Z (e.g. 1.5.1), got '${FRANKENPHP_VERSION}'" + echo "Warning: FRANKENPHP_VERSION must be set to X.Y.Z (e.g. 1.5.1), got '${FRANKENPHP_VERSION}'" + echo "Falling back to non-release version 0.0.0" FRANKENPHP_VERSION=0.0.0 fi From 2d10fa90c52adf77358e975d8053bad561f7c1eb Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Fri, 18 Apr 2025 18:41:47 +0700 Subject: [PATCH 38/75] linter --- build-packages.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build-packages.sh b/build-packages.sh index be5b7b62a2..c590ec95f0 100755 --- a/build-packages.sh +++ b/build-packages.sh @@ -72,7 +72,7 @@ fpm -s dir -t rpm -n frankenphp -v "${FRANKENPHP_VERSION}" \ --depends "libc.so.6(${glibc_version})(64bit)" \ --depends "libstdc++.so.6(${cxxabi_version})(64bit)" \ --after-install ../package/after_install.sh \ - --iteration "${iteration}"\ + --iteration "${iteration}" \ "${bin}=/usr/bin/frankenphp" \ "../package/frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ "../package/Caddyfile=/etc/frankenphp/Caddyfile" \ @@ -91,7 +91,7 @@ fpm -s dir -t deb -n frankenphp -v "${FRANKENPHP_VERSION}" \ --depends "libstdc++6 (>= ${cxxabi_version})" \ --deb-suggests libcap2-bin \ --after-install ../package/after_install.sh \ - --iteration "${iteration}"\ + --iteration "${iteration}" \ "${bin}=/usr/bin/frankenphp" \ "../package/frankenphp.service=/lib/systemd/system/frankenphp.service" \ "../package/Caddyfile=/etc/frankenphp/Caddyfile" \ From 2b774cdc36b89b0f90e48d5f1f88bc052f1639ba Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Fri, 18 Apr 2025 19:40:50 +0700 Subject: [PATCH 39/75] copy installation scripts from official caddy packages, change user to frankenphp too --- build-packages.sh | 13 ++++-- package/after_install.sh | 15 ------ package/debian/frankenphp.service | 27 +++++++++++ package/debian/postinst.sh | 67 +++++++++++++++++++++++++++ package/debian/postrm.sh | 20 ++++++++ package/debian/prerm.sh | 7 +++ package/{ => rhel}/frankenphp.service | 4 +- package/rhel/postinstall.sh | 34 ++++++++++++++ package/rhel/postuninstall.sh | 26 +++++++++++ package/rhel/preinstall.sh | 7 +++ package/rhel/preuninstall.sh | 6 +++ 11 files changed, 205 insertions(+), 21 deletions(-) delete mode 100755 package/after_install.sh create mode 100644 package/debian/frankenphp.service create mode 100644 package/debian/postinst.sh create mode 100644 package/debian/postrm.sh create mode 100644 package/debian/prerm.sh rename package/{ => rhel}/frankenphp.service (93%) create mode 100644 package/rhel/postinstall.sh create mode 100644 package/rhel/postuninstall.sh create mode 100644 package/rhel/preinstall.sh create mode 100644 package/rhel/preuninstall.sh diff --git a/build-packages.sh b/build-packages.sh index c590ec95f0..a81da1f4f1 100755 --- a/build-packages.sh +++ b/build-packages.sh @@ -71,10 +71,13 @@ fpm -s dir -t rpm -n frankenphp -v "${FRANKENPHP_VERSION}" \ --config-files /etc/frankenphp/php.ini \ --depends "libc.so.6(${glibc_version})(64bit)" \ --depends "libstdc++.so.6(${cxxabi_version})(64bit)" \ - --after-install ../package/after_install.sh \ + --before-install ../package/rhel/preinstall.sh \ + --after-install ../package/rhel/postinstall.sh \ + --before-remove ../package/rhel/preuninstall.sh \ + --after-remove ../package/rhel/postuninstall.sh \ --iteration "${iteration}" \ "${bin}=/usr/bin/frankenphp" \ - "../package/frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ + "../package/rhel/frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ "../package/Caddyfile=/etc/frankenphp/Caddyfile" \ "../package/etc/php.ini=/etc/frankenphp/php.ini" \ "../package/etc/php.d/=/etc/frankenphp/php.d" \ @@ -90,10 +93,12 @@ fpm -s dir -t deb -n frankenphp -v "${FRANKENPHP_VERSION}" \ --depends "libc6 (>= ${glibc_version})" \ --depends "libstdc++6 (>= ${cxxabi_version})" \ --deb-suggests libcap2-bin \ - --after-install ../package/after_install.sh \ + --after-install ../package/debian/postinst.sh \ + --before-remove ../package/debian/prerm.sh \ + --after-remove ../package/debian/postrm.sh \ --iteration "${iteration}" \ "${bin}=/usr/bin/frankenphp" \ - "../package/frankenphp.service=/lib/systemd/system/frankenphp.service" \ + "../package/debian/frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ "../package/Caddyfile=/etc/frankenphp/Caddyfile" \ "../package/etc/php.ini=/etc/frankenphp/php.ini" \ "../package/etc/php.d/=/etc/frankenphp/php.d" \ diff --git a/package/after_install.sh b/package/after_install.sh deleted file mode 100755 index acc4774359..0000000000 --- a/package/after_install.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -if command -v setcap >/dev/null 2>&1; then - setcap 'cap_net_bind_service=+ep' /usr/bin/frankenphp || echo "Warning: failed to set capabilities on frankenphp" - echo "Users without root privileges will not be to run 'frankenphp php-server' on ports 80/443." -else - if [ -f /etc/debian_version ]; then - echo "Warning: setcap not found. Install it with: sudo apt install libcap2-bin" - elif [ -f /etc/redhat-release ]; then - echo "Warning: setcap not found. Install it with: sudo dnf install libcap" - else - echo "Warning: setcap not found. Install the appropriate libcap package for your system." - fi - echo "Users without root privileges will not be to run 'frankenphp php-server' on ports 80/443." -fi diff --git a/package/debian/frankenphp.service b/package/debian/frankenphp.service new file mode 100644 index 0000000000..c6ff3e57ec --- /dev/null +++ b/package/debian/frankenphp.service @@ -0,0 +1,27 @@ +# See https://caddyserver.com/docs/install for instructions. +# +# WARNING: This service does not use the --resume flag, so if you +# use the API to make changes, they will be overwritten by the +# Caddyfile next time the service is restarted. If you intend to + +[Unit] +Description=FrankenPHP +Documentation=https://frankenphp.dev/docs/ +After=network.target network-online.target +Requires=network-online.target + +[Service] +Type=notify +User=frankenphp +Group=frankenphp +ExecStart=/usr/bin/frankenphp run --environ --config /etc/frankenphp/Caddyfile +ExecReload=/usr/bin/frankenphp reload --config /etc/frankenphp/Caddyfile --force +TimeoutStopSec=5s +LimitNOFILE=1048576 +LimitNPROC=512 +PrivateTmp=true +ProtectSystem=full +AmbientCapabilities=CAP_NET_BIND_SERVICE + +[Install] +WantedBy=multi-user.target diff --git a/package/debian/postinst.sh b/package/debian/postinst.sh new file mode 100644 index 0000000000..3f700b8a7b --- /dev/null +++ b/package/debian/postinst.sh @@ -0,0 +1,67 @@ +#!/bin/sh +set -e + +if command -v setcap >/dev/null 2>&1; then + setcap 'cap_net_bind_service=+ep' /usr/bin/frankenphp || echo "Warning: failed to set capabilities on frankenphp" + echo "Users without root privileges will not be to run 'frankenphp php-server' on ports 80/443." +else + echo "Warning: setcap not found. Install it with: sudo apt install libcap2-bin" + echo "Users without root privileges will not be to run 'frankenphp php-server' on ports 80/443." +fi + +if [ "$1" = "configure" ]; then + # Add user and group + if ! getent group frankenphp >/dev/null; then + groupadd --system frankenphp + fi + if ! getent passwd frankenphp >/dev/null; then + useradd --system \ + --gid frankenphp \ + --create-home \ + --home-dir /var/lib/frankenphp \ + --shell /usr/sbin/nologin \ + --comment "FrankenPHP web server" \ + frankenphp + fi + if getent group www-data >/dev/null; then + usermod -aG www-data frankenphp + fi + + # handle cases where package was installed and then purged; + # user and group will still exist but with no home dir + if [ ! -d /var/lib/frankenphp ]; then + mkdir -p /var/lib/frankenphp + chown frankenphp:frankenphp /var/lib/frankenphp + fi + + # Add log directory with correct permissions + if [ ! -d /var/log/frankenphp ]; then + mkdir -p /var/log/frankenphp + chown frankenphp:frankenphp /var/log/frankenphp + fi +fi + +if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then + # This will only remove masks created by d-s-h on package removal. + deb-systemd-helper unmask frankenphp.service >/dev/null || true + + # was-enabled defaults to true, so new installations run enable. + if deb-systemd-helper --quiet was-enabled frankenphp.service; then + # Enables the unit on first installation, creates new + # symlinks on upgrades if the unit file has changed. + deb-systemd-helper enable frankenphp.service >/dev/null || true + deb-systemd-invoke start frankenphp.service >/dev/null || true + else + # Update the statefile to add new symlinks (if any), which need to be + # cleaned up on purge. Also remove old symlinks. + deb-systemd-helper update-state frankenphp.service >/dev/null || true + fi + + # Restart only if it was already started + if [ -d /run/systemd/system ]; then + systemctl --system daemon-reload >/dev/null || true + if [ -n "$2" ]; then + deb-systemd-invoke try-restart frankenphp.service >/dev/null || true + fi + fi +fi diff --git a/package/debian/postrm.sh b/package/debian/postrm.sh new file mode 100644 index 0000000000..db62c1987a --- /dev/null +++ b/package/debian/postrm.sh @@ -0,0 +1,20 @@ +#!/bin/sh +set -e + +if [ -d /run/systemd/system ]; then + systemctl --system daemon-reload >/dev/null || true +fi + +if [ "$1" = "remove" ]; then + if [ -x "/usr/bin/deb-systemd-helper" ]; then + deb-systemd-helper mask frankenphp.service >/dev/null || true + fi +fi + +if [ "$1" = "purge" ]; then + if [ -x "/usr/bin/deb-systemd-helper" ]; then + deb-systemd-helper purge frankenphp.service >/dev/null || true + deb-systemd-helper unmask frankenphp.service >/dev/null || true + fi + rm -rf /var/lib/frankenphp /var/log/frankenphp /etc/frankenphp +fi diff --git a/package/debian/prerm.sh b/package/debian/prerm.sh new file mode 100644 index 0000000000..36436efcd4 --- /dev/null +++ b/package/debian/prerm.sh @@ -0,0 +1,7 @@ +#!/bin/sh +set -e + +if [ -d /run/systemd/system ] && [ "$1" = remove ]; then + deb-systemd-invoke stop frankenphp.service >/dev/null || true + deb-systemd-invoke stop frankenphp-api.service >/dev/null || true +fi diff --git a/package/frankenphp.service b/package/rhel/frankenphp.service similarity index 93% rename from package/frankenphp.service rename to package/rhel/frankenphp.service index 955cfa8184..1f6b7b5117 100644 --- a/package/frankenphp.service +++ b/package/rhel/frankenphp.service @@ -4,8 +4,8 @@ After=network.target [Service] Type=notify -User=caddy -Group=caddy +User=frankenphp +Group=frankenphp ExecStartPre=/usr/bin/frankenphp validate --config /etc/frankenphp/Caddyfile ExecStart=/usr/bin/frankenphp run --environ --config /etc/frankenphp/Caddyfile ExecReload=/usr/bin/frankenphp reload --config /etc/frankenphp/Caddyfile diff --git a/package/rhel/postinstall.sh b/package/rhel/postinstall.sh new file mode 100644 index 0000000000..0f0d99cef8 --- /dev/null +++ b/package/rhel/postinstall.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +if command -v setcap >/dev/null 2>&1; then + setcap 'cap_net_bind_service=+ep' /usr/bin/frankenphp || echo "Warning: failed to set capabilities on frankenphp" + echo "Users without root privileges will not be to run 'frankenphp php-server' on ports 80/443." +else + echo "Warning: setcap not found. Install it with: sudo dnf install libcap" + echo "Users without root privileges will not be to run 'frankenphp php-server' on ports 80/443." +fi + +if [ "$1" -eq 1 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then + # Initial installation + /usr/lib/systemd/systemd-update-helper install-system-units frankenphp.service || : +fi + +if [ -x /usr/sbin/getsebool ]; then + # connect to ACME endpoint to request certificates + setsebool -P httpd_can_network_connect on +fi +if [ -x /usr/sbin/semanage -a -x /usr/sbin/restorecon ]; then + # file contexts + semanage fcontext --add --type httpd_exec_t '/usr/bin/frankenphp' 2> /dev/null || : + semanage fcontext --add --type httpd_sys_content_t '/usr/share/frankenphp(/.*)?' 2> /dev/null || : + semanage fcontext --add --type httpd_config_t '/etc/frankenphp(/.*)?' 2> /dev/null || : + semanage fcontext --add --type httpd_var_lib_t '/var/lib/frankenphp(/.*)?' 2> /dev/null || : + restorecon -r /usr/bin/frankenphp /usr/share/frankenphp /etc/frankenphp /var/lib/frankenphp || : +fi +if [ -x /usr/sbin/semanage ]; then + # QUIC + semanage port --add --type http_port_t --proto udp 80 2> /dev/null || : + semanage port --add --type http_port_t --proto udp 443 2> /dev/null || : + # admin endpoint + semanage port --add --type http_port_t --proto tcp 2019 2> /dev/null || : +fi diff --git a/package/rhel/postuninstall.sh b/package/rhel/postuninstall.sh new file mode 100644 index 0000000000..f3c5f63bbc --- /dev/null +++ b/package/rhel/postuninstall.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +if [ "$1" -ge 1 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then + # Package upgrade, not uninstall + /usr/lib/systemd/systemd-update-helper mark-restart-system-units frankenphp.service || : +fi + + +if [ "$1" -eq 0 ]; then + if [ -x /usr/sbin/getsebool ]; then + # connect to ACME endpoint to request certificates + setsebool -P httpd_can_network_connect off + fi + if [ -x /usr/sbin/semanage ]; then + # file contexts + semanage fcontext --delete --type httpd_exec_t '/usr/bin/frankenphp' 2> /dev/null || : + semanage fcontext --delete --type httpd_sys_content_t '/usr/share/frankenphp(/.*)?' 2> /dev/null || : + semanage fcontext --delete --type httpd_config_t '/etc/frankenphp(/.*)?' 2> /dev/null || : + semanage fcontext --delete --type httpd_var_lib_t '/var/lib/frankenphp(/.*)?' 2> /dev/null || : + # QUIC + semanage port --delete --type http_port_t --proto udp 80 2> /dev/null || : + semanage port --delete --type http_port_t --proto udp 443 2> /dev/null || : + # admin endpoint + semanage port --delete --type http_port_t --proto tcp 2019 2> /dev/null || : + fi +fi diff --git a/package/rhel/preinstall.sh b/package/rhel/preinstall.sh new file mode 100644 index 0000000000..03ca3feab8 --- /dev/null +++ b/package/rhel/preinstall.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +getent group frankenphp &> /dev/null || \ +groupadd -r frankenphp &> /dev/null +getent passwd frankenphp &> /dev/null || \ +useradd -r -g frankenphp -d /var/lib/frankenphp -s /sbin/nologin -c 'FrankenPHP web server' frankenphp &> /dev/null +exit 0 diff --git a/package/rhel/preuninstall.sh b/package/rhel/preuninstall.sh new file mode 100644 index 0000000000..49a53a76c0 --- /dev/null +++ b/package/rhel/preuninstall.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +if [ "$1" -eq 0 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then + # Package removal, not upgrade + /usr/lib/systemd/systemd-update-helper remove-system-units frankenphp.service || : +fi From e952a9f81068ab15c21efec445d9bc048069bcd3 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Fri, 18 Apr 2025 20:47:11 +0700 Subject: [PATCH 40/75] bombombom --- build-packages.sh | 1 - package/Caddyfile | 2 +- package/content/example.php | 2 +- package/content/public/index.php | 2 +- package/debian/frankenphp.service | 2 +- package/debian/postinst.sh | 10 +--------- package/debian/postrm.sh | 2 +- package/rhel/frankenphp.service | 2 +- package/rhel/postinstall.sh | 12 ++---------- package/rhel/postuninstall.sh | 2 +- package/rhel/preinstall.sh | 2 +- package/rhel/preuninstall.sh | 2 +- 12 files changed, 12 insertions(+), 29 deletions(-) diff --git a/build-packages.sh b/build-packages.sh index a81da1f4f1..34e83d27b6 100755 --- a/build-packages.sh +++ b/build-packages.sh @@ -92,7 +92,6 @@ fpm -s dir -t deb -n frankenphp -v "${FRANKENPHP_VERSION}" \ --config-files /etc/frankenphp/php.ini \ --depends "libc6 (>= ${glibc_version})" \ --depends "libstdc++6 (>= ${cxxabi_version})" \ - --deb-suggests libcap2-bin \ --after-install ../package/debian/postinst.sh \ --before-remove ../package/debian/prerm.sh \ --after-remove ../package/debian/postrm.sh \ diff --git a/package/Caddyfile b/package/Caddyfile index 2a987dfc6d..abb4c0f5d4 100644 --- a/package/Caddyfile +++ b/package/Caddyfile @@ -1,4 +1,4 @@ -# The Caddyfile is an easy way to configure your Caddy web server. +# The Caddyfile is an easy way to configure your Caddy web server. # # https://caddyserver.com/docs/caddyfile # https://frankenphp.dev/docs/config diff --git a/package/content/example.php b/package/content/example.php index 757fce67fe..d7beda57ca 100644 --- a/package/content/example.php +++ b/package/content/example.php @@ -1,4 +1,4 @@ - diff --git a/package/content/public/index.php b/package/content/public/index.php index 44b2b60ac3..4118cd6b4f 100644 --- a/package/content/public/index.php +++ b/package/content/public/index.php @@ -1,4 +1,4 @@ -/dev/null 2>&1; then - setcap 'cap_net_bind_service=+ep' /usr/bin/frankenphp || echo "Warning: failed to set capabilities on frankenphp" - echo "Users without root privileges will not be to run 'frankenphp php-server' on ports 80/443." -else - echo "Warning: setcap not found. Install it with: sudo apt install libcap2-bin" - echo "Users without root privileges will not be to run 'frankenphp php-server' on ports 80/443." -fi - if [ "$1" = "configure" ]; then # Add user and group if ! getent group frankenphp >/dev/null; then diff --git a/package/debian/postrm.sh b/package/debian/postrm.sh index db62c1987a..95a0546cfc 100644 --- a/package/debian/postrm.sh +++ b/package/debian/postrm.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/sh set -e if [ -d /run/systemd/system ]; then diff --git a/package/rhel/frankenphp.service b/package/rhel/frankenphp.service index 1f6b7b5117..0497278a8e 100644 --- a/package/rhel/frankenphp.service +++ b/package/rhel/frankenphp.service @@ -1,4 +1,4 @@ -[Unit] +[Unit] Description=FrankenPHP server After=network.target diff --git a/package/rhel/postinstall.sh b/package/rhel/postinstall.sh index 0f0d99cef8..be227d9992 100644 --- a/package/rhel/postinstall.sh +++ b/package/rhel/postinstall.sh @@ -1,12 +1,4 @@ -#!/bin/bash - -if command -v setcap >/dev/null 2>&1; then - setcap 'cap_net_bind_service=+ep' /usr/bin/frankenphp || echo "Warning: failed to set capabilities on frankenphp" - echo "Users without root privileges will not be to run 'frankenphp php-server' on ports 80/443." -else - echo "Warning: setcap not found. Install it with: sudo dnf install libcap" - echo "Users without root privileges will not be to run 'frankenphp php-server' on ports 80/443." -fi +#!/bin/bash if [ "$1" -eq 1 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then # Initial installation @@ -17,7 +9,7 @@ if [ -x /usr/sbin/getsebool ]; then # connect to ACME endpoint to request certificates setsebool -P httpd_can_network_connect on fi -if [ -x /usr/sbin/semanage -a -x /usr/sbin/restorecon ]; then +if [ -x /usr/sbin/semanage ] && [ -x /usr/sbin/restorecon ]; then # file contexts semanage fcontext --add --type httpd_exec_t '/usr/bin/frankenphp' 2> /dev/null || : semanage fcontext --add --type httpd_sys_content_t '/usr/share/frankenphp(/.*)?' 2> /dev/null || : diff --git a/package/rhel/postuninstall.sh b/package/rhel/postuninstall.sh index f3c5f63bbc..e67a0e95ce 100644 --- a/package/rhel/postuninstall.sh +++ b/package/rhel/postuninstall.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash if [ "$1" -ge 1 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then # Package upgrade, not uninstall diff --git a/package/rhel/preinstall.sh b/package/rhel/preinstall.sh index 03ca3feab8..67b26d3686 100644 --- a/package/rhel/preinstall.sh +++ b/package/rhel/preinstall.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash getent group frankenphp &> /dev/null || \ groupadd -r frankenphp &> /dev/null diff --git a/package/rhel/preuninstall.sh b/package/rhel/preuninstall.sh index 49a53a76c0..387d2e0b08 100644 --- a/package/rhel/preuninstall.sh +++ b/package/rhel/preuninstall.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash if [ "$1" -eq 0 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then # Package removal, not upgrade From 733f8904a1b93a3dc1c6dfaedd6cf278bedc4d47 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Fri, 18 Apr 2025 20:49:45 +0700 Subject: [PATCH 41/75] make files executable --- package/debian/postinst.sh | 0 package/debian/postrm.sh | 0 package/debian/prerm.sh | 0 package/rhel/postinstall.sh | 0 package/rhel/postuninstall.sh | 0 package/rhel/preinstall.sh | 0 package/rhel/preuninstall.sh | 0 7 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 package/debian/postinst.sh mode change 100644 => 100755 package/debian/postrm.sh mode change 100644 => 100755 package/debian/prerm.sh mode change 100644 => 100755 package/rhel/postinstall.sh mode change 100644 => 100755 package/rhel/postuninstall.sh mode change 100644 => 100755 package/rhel/preinstall.sh mode change 100644 => 100755 package/rhel/preuninstall.sh diff --git a/package/debian/postinst.sh b/package/debian/postinst.sh old mode 100644 new mode 100755 diff --git a/package/debian/postrm.sh b/package/debian/postrm.sh old mode 100644 new mode 100755 diff --git a/package/debian/prerm.sh b/package/debian/prerm.sh old mode 100644 new mode 100755 diff --git a/package/rhel/postinstall.sh b/package/rhel/postinstall.sh old mode 100644 new mode 100755 diff --git a/package/rhel/postuninstall.sh b/package/rhel/postuninstall.sh old mode 100644 new mode 100755 diff --git a/package/rhel/preinstall.sh b/package/rhel/preinstall.sh old mode 100644 new mode 100755 diff --git a/package/rhel/preuninstall.sh b/package/rhel/preuninstall.sh old mode 100644 new mode 100755 From 29049b18727d21e040042c345c624d9ef777c8b5 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Fri, 18 Apr 2025 20:59:41 +0700 Subject: [PATCH 42/75] tabs --- caddy/frankenphp/Caddyfile | 4 ++ package/Caddyfile | 4 +- package/debian/postinst.sh | 94 +++++++++++++++++------------------ package/debian/postrm.sh | 18 +++---- package/debian/prerm.sh | 4 +- package/rhel/postinstall.sh | 30 +++++------ package/rhel/postuninstall.sh | 36 +++++++------- package/rhel/preuninstall.sh | 4 +- 8 files changed, 99 insertions(+), 95 deletions(-) diff --git a/caddy/frankenphp/Caddyfile b/caddy/frankenphp/Caddyfile index 5b69428043..825c887871 100644 --- a/caddy/frankenphp/Caddyfile +++ b/caddy/frankenphp/Caddyfile @@ -1,3 +1,7 @@ +# The Caddyfile is an easy way to configure your Caddy web server. +# +# https://caddyserver.com/docs/caddyfile +# https://frankenphp.dev/docs/config { {$CADDY_GLOBAL_OPTIONS} diff --git a/package/Caddyfile b/package/Caddyfile index abb4c0f5d4..d4506d94ca 100644 --- a/package/Caddyfile +++ b/package/Caddyfile @@ -31,8 +31,8 @@ #mercure { # # Transport to use (default to Bolt) # transport bolt { - # mercure.db - # } + # mercure.db + # } # # Publisher JWT key # publisher_jwt {env.MERCURE_PUBLISHER_JWT_KEY} {env.MERCURE_PUBLISHER_JWT_ALG} # # Subscriber JWT key diff --git a/package/debian/postinst.sh b/package/debian/postinst.sh index 19713cd8b3..22256cdc25 100755 --- a/package/debian/postinst.sh +++ b/package/debian/postinst.sh @@ -2,58 +2,58 @@ set -e if [ "$1" = "configure" ]; then - # Add user and group - if ! getent group frankenphp >/dev/null; then - groupadd --system frankenphp - fi - if ! getent passwd frankenphp >/dev/null; then - useradd --system \ - --gid frankenphp \ - --create-home \ - --home-dir /var/lib/frankenphp \ - --shell /usr/sbin/nologin \ - --comment "FrankenPHP web server" \ - frankenphp - fi - if getent group www-data >/dev/null; then - usermod -aG www-data frankenphp - fi + # Add user and group + if ! getent group frankenphp >/dev/null; then + groupadd --system frankenphp + fi + if ! getent passwd frankenphp >/dev/null; then + useradd --system \ + --gid frankenphp \ + --create-home \ + --home-dir /var/lib/frankenphp \ + --shell /usr/sbin/nologin \ + --comment "FrankenPHP web server" \ + frankenphp + fi + if getent group www-data >/dev/null; then + usermod -aG www-data frankenphp + fi - # handle cases where package was installed and then purged; - # user and group will still exist but with no home dir - if [ ! -d /var/lib/frankenphp ]; then - mkdir -p /var/lib/frankenphp - chown frankenphp:frankenphp /var/lib/frankenphp - fi + # handle cases where package was installed and then purged; + # user and group will still exist but with no home dir + if [ ! -d /var/lib/frankenphp ]; then + mkdir -p /var/lib/frankenphp + chown frankenphp:frankenphp /var/lib/frankenphp + fi - # Add log directory with correct permissions - if [ ! -d /var/log/frankenphp ]; then - mkdir -p /var/log/frankenphp - chown frankenphp:frankenphp /var/log/frankenphp - fi + # Add log directory with correct permissions + if [ ! -d /var/log/frankenphp ]; then + mkdir -p /var/log/frankenphp + chown frankenphp:frankenphp /var/log/frankenphp + fi fi if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then - # This will only remove masks created by d-s-h on package removal. - deb-systemd-helper unmask frankenphp.service >/dev/null || true + # This will only remove masks created by d-s-h on package removal. + deb-systemd-helper unmask frankenphp.service >/dev/null || true - # was-enabled defaults to true, so new installations run enable. - if deb-systemd-helper --quiet was-enabled frankenphp.service; then - # Enables the unit on first installation, creates new - # symlinks on upgrades if the unit file has changed. - deb-systemd-helper enable frankenphp.service >/dev/null || true - deb-systemd-invoke start frankenphp.service >/dev/null || true - else - # Update the statefile to add new symlinks (if any), which need to be - # cleaned up on purge. Also remove old symlinks. - deb-systemd-helper update-state frankenphp.service >/dev/null || true - fi + # was-enabled defaults to true, so new installations run enable. + if deb-systemd-helper --quiet was-enabled frankenphp.service; then + # Enables the unit on first installation, creates new + # symlinks on upgrades if the unit file has changed. + deb-systemd-helper enable frankenphp.service >/dev/null || true + deb-systemd-invoke start frankenphp.service >/dev/null || true + else + # Update the statefile to add new symlinks (if any), which need to be + # cleaned up on purge. Also remove old symlinks. + deb-systemd-helper update-state frankenphp.service >/dev/null || true + fi - # Restart only if it was already started - if [ -d /run/systemd/system ]; then - systemctl --system daemon-reload >/dev/null || true - if [ -n "$2" ]; then - deb-systemd-invoke try-restart frankenphp.service >/dev/null || true - fi - fi + # Restart only if it was already started + if [ -d /run/systemd/system ]; then + systemctl --system daemon-reload >/dev/null || true + if [ -n "$2" ]; then + deb-systemd-invoke try-restart frankenphp.service >/dev/null || true + fi + fi fi diff --git a/package/debian/postrm.sh b/package/debian/postrm.sh index 95a0546cfc..bd6d7781d3 100755 --- a/package/debian/postrm.sh +++ b/package/debian/postrm.sh @@ -2,19 +2,19 @@ set -e if [ -d /run/systemd/system ]; then - systemctl --system daemon-reload >/dev/null || true + systemctl --system daemon-reload >/dev/null || true fi if [ "$1" = "remove" ]; then - if [ -x "/usr/bin/deb-systemd-helper" ]; then - deb-systemd-helper mask frankenphp.service >/dev/null || true - fi + if [ -x "/usr/bin/deb-systemd-helper" ]; then + deb-systemd-helper mask frankenphp.service >/dev/null || true + fi fi if [ "$1" = "purge" ]; then - if [ -x "/usr/bin/deb-systemd-helper" ]; then - deb-systemd-helper purge frankenphp.service >/dev/null || true - deb-systemd-helper unmask frankenphp.service >/dev/null || true - fi - rm -rf /var/lib/frankenphp /var/log/frankenphp /etc/frankenphp + if [ -x "/usr/bin/deb-systemd-helper" ]; then + deb-systemd-helper purge frankenphp.service >/dev/null || true + deb-systemd-helper unmask frankenphp.service >/dev/null || true + fi + rm -rf /var/lib/frankenphp /var/log/frankenphp /etc/frankenphp fi diff --git a/package/debian/prerm.sh b/package/debian/prerm.sh index 36436efcd4..df7ed8a549 100755 --- a/package/debian/prerm.sh +++ b/package/debian/prerm.sh @@ -2,6 +2,6 @@ set -e if [ -d /run/systemd/system ] && [ "$1" = remove ]; then - deb-systemd-invoke stop frankenphp.service >/dev/null || true - deb-systemd-invoke stop frankenphp-api.service >/dev/null || true + deb-systemd-invoke stop frankenphp.service >/dev/null || true + deb-systemd-invoke stop frankenphp-api.service >/dev/null || true fi diff --git a/package/rhel/postinstall.sh b/package/rhel/postinstall.sh index be227d9992..3bab87c9fd 100755 --- a/package/rhel/postinstall.sh +++ b/package/rhel/postinstall.sh @@ -1,26 +1,26 @@ #!/bin/bash if [ "$1" -eq 1 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then - # Initial installation - /usr/lib/systemd/systemd-update-helper install-system-units frankenphp.service || : + # Initial installation + /usr/lib/systemd/systemd-update-helper install-system-units frankenphp.service || : fi if [ -x /usr/sbin/getsebool ]; then - # connect to ACME endpoint to request certificates - setsebool -P httpd_can_network_connect on + # connect to ACME endpoint to request certificates + setsebool -P httpd_can_network_connect on fi if [ -x /usr/sbin/semanage ] && [ -x /usr/sbin/restorecon ]; then - # file contexts - semanage fcontext --add --type httpd_exec_t '/usr/bin/frankenphp' 2> /dev/null || : - semanage fcontext --add --type httpd_sys_content_t '/usr/share/frankenphp(/.*)?' 2> /dev/null || : - semanage fcontext --add --type httpd_config_t '/etc/frankenphp(/.*)?' 2> /dev/null || : - semanage fcontext --add --type httpd_var_lib_t '/var/lib/frankenphp(/.*)?' 2> /dev/null || : - restorecon -r /usr/bin/frankenphp /usr/share/frankenphp /etc/frankenphp /var/lib/frankenphp || : + # file contexts + semanage fcontext --add --type httpd_exec_t '/usr/bin/frankenphp' 2> /dev/null || : + semanage fcontext --add --type httpd_sys_content_t '/usr/share/frankenphp(/.*)?' 2> /dev/null || : + semanage fcontext --add --type httpd_config_t '/etc/frankenphp(/.*)?' 2> /dev/null || : + semanage fcontext --add --type httpd_var_lib_t '/var/lib/frankenphp(/.*)?' 2> /dev/null || : + restorecon -r /usr/bin/frankenphp /usr/share/frankenphp /etc/frankenphp /var/lib/frankenphp || : fi if [ -x /usr/sbin/semanage ]; then - # QUIC - semanage port --add --type http_port_t --proto udp 80 2> /dev/null || : - semanage port --add --type http_port_t --proto udp 443 2> /dev/null || : - # admin endpoint - semanage port --add --type http_port_t --proto tcp 2019 2> /dev/null || : + # QUIC + semanage port --add --type http_port_t --proto udp 80 2> /dev/null || : + semanage port --add --type http_port_t --proto udp 443 2> /dev/null || : + # admin endpoint + semanage port --add --type http_port_t --proto tcp 2019 2> /dev/null || : fi diff --git a/package/rhel/postuninstall.sh b/package/rhel/postuninstall.sh index e67a0e95ce..da5aa4ea16 100755 --- a/package/rhel/postuninstall.sh +++ b/package/rhel/postuninstall.sh @@ -1,26 +1,26 @@ #!/bin/bash if [ "$1" -ge 1 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then - # Package upgrade, not uninstall - /usr/lib/systemd/systemd-update-helper mark-restart-system-units frankenphp.service || : + # Package upgrade, not uninstall + /usr/lib/systemd/systemd-update-helper mark-restart-system-units frankenphp.service || : fi if [ "$1" -eq 0 ]; then - if [ -x /usr/sbin/getsebool ]; then - # connect to ACME endpoint to request certificates - setsebool -P httpd_can_network_connect off - fi - if [ -x /usr/sbin/semanage ]; then - # file contexts - semanage fcontext --delete --type httpd_exec_t '/usr/bin/frankenphp' 2> /dev/null || : - semanage fcontext --delete --type httpd_sys_content_t '/usr/share/frankenphp(/.*)?' 2> /dev/null || : - semanage fcontext --delete --type httpd_config_t '/etc/frankenphp(/.*)?' 2> /dev/null || : - semanage fcontext --delete --type httpd_var_lib_t '/var/lib/frankenphp(/.*)?' 2> /dev/null || : - # QUIC - semanage port --delete --type http_port_t --proto udp 80 2> /dev/null || : - semanage port --delete --type http_port_t --proto udp 443 2> /dev/null || : - # admin endpoint - semanage port --delete --type http_port_t --proto tcp 2019 2> /dev/null || : - fi + if [ -x /usr/sbin/getsebool ]; then + # connect to ACME endpoint to request certificates + setsebool -P httpd_can_network_connect off + fi + if [ -x /usr/sbin/semanage ]; then + # file contexts + semanage fcontext --delete --type httpd_exec_t '/usr/bin/frankenphp' 2> /dev/null || : + semanage fcontext --delete --type httpd_sys_content_t '/usr/share/frankenphp(/.*)?' 2> /dev/null || : + semanage fcontext --delete --type httpd_config_t '/etc/frankenphp(/.*)?' 2> /dev/null || : + semanage fcontext --delete --type httpd_var_lib_t '/var/lib/frankenphp(/.*)?' 2> /dev/null || : + # QUIC + semanage port --delete --type http_port_t --proto udp 80 2> /dev/null || : + semanage port --delete --type http_port_t --proto udp 443 2> /dev/null || : + # admin endpoint + semanage port --delete --type http_port_t --proto tcp 2019 2> /dev/null || : + fi fi diff --git a/package/rhel/preuninstall.sh b/package/rhel/preuninstall.sh index 387d2e0b08..f45f781ef9 100755 --- a/package/rhel/preuninstall.sh +++ b/package/rhel/preuninstall.sh @@ -1,6 +1,6 @@ #!/bin/bash if [ "$1" -eq 0 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then - # Package removal, not upgrade - /usr/lib/systemd/systemd-update-helper remove-system-units frankenphp.service || : + # Package removal, not upgrade + /usr/lib/systemd/systemd-update-helper remove-system-units frankenphp.service || : fi From ea0b7c4721e2bfd1186df8ce3a130434e1084b95 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Fri, 18 Apr 2025 21:08:16 +0700 Subject: [PATCH 43/75] linter --- package/debian/postinst.sh | 2 +- package/rhel/postinstall.sh | 14 +++++++------- package/rhel/postuninstall.sh | 14 +++++++------- package/rhel/preinstall.sh | 8 ++++---- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/package/debian/postinst.sh b/package/debian/postinst.sh index 22256cdc25..39567c67cd 100755 --- a/package/debian/postinst.sh +++ b/package/debian/postinst.sh @@ -33,7 +33,7 @@ if [ "$1" = "configure" ]; then fi fi -if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then +if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ]; then # This will only remove masks created by d-s-h on package removal. deb-systemd-helper unmask frankenphp.service >/dev/null || true diff --git a/package/rhel/postinstall.sh b/package/rhel/postinstall.sh index 3bab87c9fd..a4b019eb50 100755 --- a/package/rhel/postinstall.sh +++ b/package/rhel/postinstall.sh @@ -11,16 +11,16 @@ if [ -x /usr/sbin/getsebool ]; then fi if [ -x /usr/sbin/semanage ] && [ -x /usr/sbin/restorecon ]; then # file contexts - semanage fcontext --add --type httpd_exec_t '/usr/bin/frankenphp' 2> /dev/null || : - semanage fcontext --add --type httpd_sys_content_t '/usr/share/frankenphp(/.*)?' 2> /dev/null || : - semanage fcontext --add --type httpd_config_t '/etc/frankenphp(/.*)?' 2> /dev/null || : - semanage fcontext --add --type httpd_var_lib_t '/var/lib/frankenphp(/.*)?' 2> /dev/null || : + semanage fcontext --add --type httpd_exec_t '/usr/bin/frankenphp' 2>/dev/null || : + semanage fcontext --add --type httpd_sys_content_t '/usr/share/frankenphp(/.*)?' 2>/dev/null || : + semanage fcontext --add --type httpd_config_t '/etc/frankenphp(/.*)?' 2>/dev/null || : + semanage fcontext --add --type httpd_var_lib_t '/var/lib/frankenphp(/.*)?' 2>/dev/null || : restorecon -r /usr/bin/frankenphp /usr/share/frankenphp /etc/frankenphp /var/lib/frankenphp || : fi if [ -x /usr/sbin/semanage ]; then # QUIC - semanage port --add --type http_port_t --proto udp 80 2> /dev/null || : - semanage port --add --type http_port_t --proto udp 443 2> /dev/null || : + semanage port --add --type http_port_t --proto udp 80 2>/dev/null || : + semanage port --add --type http_port_t --proto udp 443 2>/dev/null || : # admin endpoint - semanage port --add --type http_port_t --proto tcp 2019 2> /dev/null || : + semanage port --add --type http_port_t --proto tcp 2019 2>/dev/null || : fi diff --git a/package/rhel/postuninstall.sh b/package/rhel/postuninstall.sh index da5aa4ea16..ec3288292f 100755 --- a/package/rhel/postuninstall.sh +++ b/package/rhel/postuninstall.sh @@ -13,14 +13,14 @@ if [ "$1" -eq 0 ]; then fi if [ -x /usr/sbin/semanage ]; then # file contexts - semanage fcontext --delete --type httpd_exec_t '/usr/bin/frankenphp' 2> /dev/null || : - semanage fcontext --delete --type httpd_sys_content_t '/usr/share/frankenphp(/.*)?' 2> /dev/null || : - semanage fcontext --delete --type httpd_config_t '/etc/frankenphp(/.*)?' 2> /dev/null || : - semanage fcontext --delete --type httpd_var_lib_t '/var/lib/frankenphp(/.*)?' 2> /dev/null || : + semanage fcontext --delete --type httpd_exec_t '/usr/bin/frankenphp' 2>/dev/null || : + semanage fcontext --delete --type httpd_sys_content_t '/usr/share/frankenphp(/.*)?' 2>/dev/null || : + semanage fcontext --delete --type httpd_config_t '/etc/frankenphp(/.*)?' 2>/dev/null || : + semanage fcontext --delete --type httpd_var_lib_t '/var/lib/frankenphp(/.*)?' 2>/dev/null || : # QUIC - semanage port --delete --type http_port_t --proto udp 80 2> /dev/null || : - semanage port --delete --type http_port_t --proto udp 443 2> /dev/null || : + semanage port --delete --type http_port_t --proto udp 80 2>/dev/null || : + semanage port --delete --type http_port_t --proto udp 443 2>/dev/null || : # admin endpoint - semanage port --delete --type http_port_t --proto tcp 2019 2> /dev/null || : + semanage port --delete --type http_port_t --proto tcp 2019 2>/dev/null || : fi fi diff --git a/package/rhel/preinstall.sh b/package/rhel/preinstall.sh index 67b26d3686..569b8d57f5 100755 --- a/package/rhel/preinstall.sh +++ b/package/rhel/preinstall.sh @@ -1,7 +1,7 @@ #!/bin/bash -getent group frankenphp &> /dev/null || \ -groupadd -r frankenphp &> /dev/null -getent passwd frankenphp &> /dev/null || \ -useradd -r -g frankenphp -d /var/lib/frankenphp -s /sbin/nologin -c 'FrankenPHP web server' frankenphp &> /dev/null +getent group frankenphp &>/dev/null || \ + groupadd -r frankenphp &>/dev/null +getent passwd frankenphp &>/dev/null || \ + useradd -r -g frankenphp -d /var/lib/frankenphp -s /sbin/nologin -c 'FrankenPHP web server' frankenphp &>/dev/null exit 0 From a12ba62d689922af7b1dab61446b0d223549ee8e Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Fri, 18 Apr 2025 21:12:31 +0700 Subject: [PATCH 44/75] linter again --- package/rhel/postuninstall.sh | 1 - package/rhel/preinstall.sh | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/package/rhel/postuninstall.sh b/package/rhel/postuninstall.sh index ec3288292f..c75da45c9e 100755 --- a/package/rhel/postuninstall.sh +++ b/package/rhel/postuninstall.sh @@ -5,7 +5,6 @@ if [ "$1" -ge 1 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then /usr/lib/systemd/systemd-update-helper mark-restart-system-units frankenphp.service || : fi - if [ "$1" -eq 0 ]; then if [ -x /usr/sbin/getsebool ]; then # connect to ACME endpoint to request certificates diff --git a/package/rhel/preinstall.sh b/package/rhel/preinstall.sh index 569b8d57f5..c81e2bcd28 100755 --- a/package/rhel/preinstall.sh +++ b/package/rhel/preinstall.sh @@ -1,7 +1,7 @@ #!/bin/bash -getent group frankenphp &>/dev/null || \ +getent group frankenphp &>/dev/null || groupadd -r frankenphp &>/dev/null -getent passwd frankenphp &>/dev/null || \ +getent passwd frankenphp &>/dev/null || useradd -r -g frankenphp -d /var/lib/frankenphp -s /sbin/nologin -c 'FrankenPHP web server' frankenphp &>/dev/null exit 0 From c1bcd7c4f7c35353970a696c18c59b1f77bf7b0b Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Sun, 20 Apr 2025 18:49:25 +0700 Subject: [PATCH 45/75] use empty directory for three different destinations instead of keeping three empty local directories --- build-packages.sh | 19 +++++++++++-------- package/Caddyfile | 1 - package/debian/postinst.sh | 2 ++ package/debian/prerm.sh | 1 - 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/build-packages.sh b/build-packages.sh index 34e83d27b6..6ac71df65c 100755 --- a/build-packages.sh +++ b/build-packages.sh @@ -57,8 +57,7 @@ if [[ ! "${FRANKENPHP_VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then FRANKENPHP_VERSION=0.0.0 fi -mkdir -p package/etc/php.d -mkdir -p package/modules +mkdir -p package/empty [ -f ./dist/static-php-cli/source/php-src/php.ini-production ] && cp -f ./dist/static-php-cli/source/php-src/php.ini-production ./package/etc/php.ini cd dist @@ -76,13 +75,15 @@ fpm -s dir -t rpm -n frankenphp -v "${FRANKENPHP_VERSION}" \ --before-remove ../package/rhel/preuninstall.sh \ --after-remove ../package/rhel/postuninstall.sh \ --iteration "${iteration}" \ + --rpm-user frankenphp --rpm-group frankenphp \ "${bin}=/usr/bin/frankenphp" \ "../package/rhel/frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ "../package/Caddyfile=/etc/frankenphp/Caddyfile" \ - "../package/etc/php.ini=/etc/frankenphp/php.ini" \ - "../package/etc/php.d/=/etc/frankenphp/php.d" \ "../package/content/=/usr/share/frankenphp" \ - "../package/modules/=/usr/lib/frankenphp/modules" + "../package/etc/php.ini=/etc/frankenphp/php.ini" \ + "../package/empty/=/etc/frankenphp/php.d" \ + "../package/empty/=/usr/lib/frankenphp/modules" \ + "../package/empty/=/var/lib/frankenphp" glibc_version=$(ldd -v "$bin" | awk '/GLIBC_/ {gsub(/[()]/, "", $2); print $2}' | grep -v GLIBC_PRIVATE | sed 's/GLIBC_//' | sort -V | tail -n1) cxxabi_version=$(strings "$bin" | grep -oP 'CXXABI_\d+\.\d+(\.\d+)?' | sed 's/CXXABI_//' | sort -V | tail -n1) @@ -96,12 +97,14 @@ fpm -s dir -t deb -n frankenphp -v "${FRANKENPHP_VERSION}" \ --before-remove ../package/debian/prerm.sh \ --after-remove ../package/debian/postrm.sh \ --iteration "${iteration}" \ + --deb-user frankenphp --deb-group frankenphp \ "${bin}=/usr/bin/frankenphp" \ "../package/debian/frankenphp.service=/usr/lib/systemd/system/frankenphp.service" \ "../package/Caddyfile=/etc/frankenphp/Caddyfile" \ - "../package/etc/php.ini=/etc/frankenphp/php.ini" \ - "../package/etc/php.d/=/etc/frankenphp/php.d" \ "../package/content/=/usr/share/frankenphp" \ - "../package/modules/=/usr/lib/frankenphp/modules" + "../package/etc/php.ini=/etc/frankenphp/php.ini" \ + "../package/empty/=/etc/frankenphp/php.d" \ + "../package/empty/=/usr/lib/frankenphp/modules" \ + "../package/empty/=/var/lib/frankenphp" cd .. diff --git a/package/Caddyfile b/package/Caddyfile index d4506d94ca..931d9bc6a3 100644 --- a/package/Caddyfile +++ b/package/Caddyfile @@ -2,7 +2,6 @@ # # https://caddyserver.com/docs/caddyfile # https://frankenphp.dev/docs/config - { {$CADDY_GLOBAL_OPTIONS} diff --git a/package/debian/postinst.sh b/package/debian/postinst.sh index 39567c67cd..fdf3d44e21 100755 --- a/package/debian/postinst.sh +++ b/package/debian/postinst.sh @@ -57,3 +57,5 @@ if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-decon fi fi fi + +HOME=~frankenphp frankenphp trust diff --git a/package/debian/prerm.sh b/package/debian/prerm.sh index df7ed8a549..d762813327 100755 --- a/package/debian/prerm.sh +++ b/package/debian/prerm.sh @@ -3,5 +3,4 @@ set -e if [ -d /run/systemd/system ] && [ "$1" = remove ]; then deb-systemd-invoke stop frankenphp.service >/dev/null || true - deb-systemd-invoke stop frankenphp-api.service >/dev/null || true fi From ae8fc1096a98951026527bce61cd7ab166b8491e Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Sun, 20 Apr 2025 19:05:20 +0700 Subject: [PATCH 46/75] caddy says the file is incorrectly formatted without these spaces --- package/Caddyfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/Caddyfile b/package/Caddyfile index 931d9bc6a3..bc29e1743a 100644 --- a/package/Caddyfile +++ b/package/Caddyfile @@ -6,12 +6,12 @@ {$CADDY_GLOBAL_OPTIONS} frankenphp { - worker /usr/share/frankenphp/public/index.php + worker /usr/share/frankenphp/public/index.php {$FRANKENPHP_CONFIG} } } -{$CADDY_EXTRA_CONFIG} +{$CADDY_EXTRA_CONFIG} {$SERVER_NAME:localhost} { #log { From 9de7bb3dfcd11be46bba40ef780da7d109b34783 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Mon, 21 Apr 2025 20:23:58 +0700 Subject: [PATCH 47/75] remove wildcard matcher from root directive --- package/Caddyfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/Caddyfile b/package/Caddyfile index bc29e1743a..6623486f1e 100644 --- a/package/Caddyfile +++ b/package/Caddyfile @@ -23,7 +23,7 @@ # } #} - root * /usr/share/frankenphp/public/ + root /usr/share/frankenphp/public/ encode zstd br gzip # Uncomment the following lines to enable Mercure and Vulcain modules From 3f9388efec44e484a9f925ff3af93ae791fc6ef2 Mon Sep 17 00:00:00 2001 From: Marc Date: Thu, 24 Apr 2025 11:39:00 +0700 Subject: [PATCH 48/75] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit suggested changes to preinstall/postinstall scripts Co-authored-by: Kévin Dunglas --- dev-alpine.Dockerfile | 12 ++++++------ dev.Dockerfile | 8 ++++---- docs/ru/config.md | 2 +- package/debian/postinst.sh | 2 +- package/rhel/postinstall.sh | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/dev-alpine.Dockerfile b/dev-alpine.Dockerfile index 371898ed42..95fef3ddf0 100644 --- a/dev-alpine.Dockerfile +++ b/dev-alpine.Dockerfile @@ -55,16 +55,16 @@ RUN git clone --branch=PHP-8.4 https://github.com/php/php-src.git . && \ --enable-zts \ --disable-zend-signals \ --enable-zend-max-execution-timers \ - --with-config-file-path=/etc/frankenphp/php.ini \ - --with-config-file-scan-dir=/etc/frankenphp/php.d \ + --with-config-file-path=/etc/frankenphp/php.ini \ + --with-config-file-scan-dir=/etc/frankenphp/php.d \ --enable-debug && \ make -j"$(nproc)" && \ make install && \ ldconfig /etc/ld.so.conf.d && \ - mkdir -p /etc/frankenphp/php.d && \ - cp php.ini-development /etc/frankenphp/php.ini && \ - echo "zend_extension=opcache.so" >> /etc/frankenphp/php.ini && \ - echo "opcache.enable=1" >> /etcfrankenphp/php.ini && \ + mkdir -p /etc/frankenphp/php.d && \ + cp php.ini-development /etc/frankenphp/php.ini && \ + echo "zend_extension=opcache.so" >> /etc/frankenphp/php.ini && \ + echo "opcache.enable=1" >> /etcfrankenphp/php.ini && \ php --version # Install e-dant/watcher (necessary for file watching) diff --git a/dev.Dockerfile b/dev.Dockerfile index 1d0d292c79..dda90e5600 100644 --- a/dev.Dockerfile +++ b/dev.Dockerfile @@ -63,10 +63,10 @@ RUN git clone --branch=PHP-8.4 https://github.com/php/php-src.git . && \ make -j"$(nproc)" && \ make install && \ ldconfig && \ - mkdir -p /etc/frankenphp/php.d && \ - cp php.ini-development /etc/frankenphp/php.ini && \ - echo "zend_extension=opcache.so" >> /etc/frankenphp/php.ini && \ - echo "opcache.enable=1" >> /etcfrankenphp/php.ini && \ + mkdir -p /etc/frankenphp/php.d && \ + cp php.ini-development /etc/frankenphp/php.ini && \ + echo "zend_extension=opcache.so" >> /etc/frankenphp/php.ini && \ + echo "opcache.enable=1" >> /etcfrankenphp/php.ini && \ php --version # Install e-dant/watcher (necessary for file watching) diff --git a/docs/ru/config.md b/docs/ru/config.md index af35826cce..36ccb1a33c 100644 --- a/docs/ru/config.md +++ b/docs/ru/config.md @@ -2,7 +2,7 @@ FrankenPHP, Caddy, а также модули Mercure и Vulcain могут быть настроены с использованием [конфигурационных форматов, поддерживаемых Caddy](https://caddyserver.com/docs/getting-started#your-first-config). -В [Docker-образах](docker.md) файл `Caddyfile` находится по пути `/etc/frankenphp/Caddyfile`. +В [Docker-образах](docker.md) файл `Caddyfile` находится по пути `/etc/frankenphp/Caddyfile`. Статический бинарный файл будет искать `Caddyfile` в директории запуска. PHP можно настроить [с помощью файла `php.ini`](https://www.php.net/manual/en/configuration.file.php). diff --git a/package/debian/postinst.sh b/package/debian/postinst.sh index fdf3d44e21..0f23d867cd 100755 --- a/package/debian/postinst.sh +++ b/package/debian/postinst.sh @@ -19,7 +19,7 @@ if [ "$1" = "configure" ]; then usermod -aG www-data frankenphp fi - # handle cases where package was installed and then purged; + # Handle cases where package was installed and then purged; # user and group will still exist but with no home dir if [ ! -d /var/lib/frankenphp ]; then mkdir -p /var/lib/frankenphp diff --git a/package/rhel/postinstall.sh b/package/rhel/postinstall.sh index a4b019eb50..087b0cd56a 100755 --- a/package/rhel/postinstall.sh +++ b/package/rhel/postinstall.sh @@ -6,7 +6,7 @@ if [ "$1" -eq 1 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then fi if [ -x /usr/sbin/getsebool ]; then - # connect to ACME endpoint to request certificates + # Connect to ACME endpoint to request certificates setsebool -P httpd_can_network_connect on fi if [ -x /usr/sbin/semanage ] && [ -x /usr/sbin/restorecon ]; then From c752d7c58051e0a377d163b53faa6bae58a50f5c Mon Sep 17 00:00:00 2001 From: Marc Date: Thu, 24 Apr 2025 11:39:26 +0700 Subject: [PATCH 49/75] Update dev.Dockerfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kévin Dunglas --- dev.Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev.Dockerfile b/dev.Dockerfile index dda90e5600..d74cbd26e2 100644 --- a/dev.Dockerfile +++ b/dev.Dockerfile @@ -57,8 +57,8 @@ RUN git clone --branch=PHP-8.4 https://github.com/php/php-src.git . && \ --enable-zts \ --disable-zend-signals \ --enable-zend-max-execution-timers \ - --with-config-file-path=/etc/frankenphp/php.ini \ - --with-config-file-scan-dir=/etc/frankenphp/php.d \ + --with-config-file-path=/etc/frankenphp/php.ini \ + --with-config-file-scan-dir=/etc/frankenphp/php.d \ --enable-debug && \ make -j"$(nproc)" && \ make install && \ From e82a43cd181174d88a0fad472aca2322210d9065 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Thu, 24 Apr 2025 11:42:22 +0700 Subject: [PATCH 50/75] remove misleading comment --- package/debian/frankenphp.service | 6 ------ 1 file changed, 6 deletions(-) diff --git a/package/debian/frankenphp.service b/package/debian/frankenphp.service index 04b31d1fb3..ead2f7da6f 100644 --- a/package/debian/frankenphp.service +++ b/package/debian/frankenphp.service @@ -1,9 +1,3 @@ -# See https://caddyserver.com/docs/install for instructions. -# -# WARNING: This service does not use the --resume flag, so if you -# use the API to make changes, they will be overwritten by the -# Caddyfile next time the service is restarted. If you intend to - [Unit] Description=FrankenPHP Documentation=https://frankenphp.dev/docs/ From fd2c4c080dbf2ae31a8d436593cf3784407aa443 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Thu, 24 Apr 2025 13:37:48 +0700 Subject: [PATCH 51/75] update documentation for paths --- docs/cn/config.md | 18 +++++++++++++++--- docs/config.md | 20 +++++++++++++++----- docs/fr/config.md | 20 +++++++++++++++----- docs/ru/config.md | 20 +++++++++++++++----- docs/tr/config.md | 19 +++++++++++++++---- static-builder-gnu.Dockerfile | 3 +-- static-builder-musl.Dockerfile | 3 +++ 7 files changed, 79 insertions(+), 24 deletions(-) diff --git a/docs/cn/config.md b/docs/cn/config.md index 72496f4afc..125b56b211 100644 --- a/docs/cn/config.md +++ b/docs/cn/config.md @@ -5,9 +5,21 @@ FrankenPHP,Caddy 以及 Mercure 和 Vulcain 模块可以使用 [Caddy 支持 在[Docker 映像](docker.md) 中,`Caddyfile` 位于 `/etc/frankenphp/Caddyfile`。 静态二进制文件会在启动时所在的目录中查找 `Caddyfile`。 PHP 本身可以[使用 `php.ini` 文件](https://www.php.net/manual/zh/configuration.file.php)进行配置。 -默认情况下,随 Docker 映像提供的 PHP 和静态二进制文件中包含的 PHP 将在启动 FrankenPHP 的目录和 `/usr/local/etc/php/` 中查找`php.ini` 文件。它们还会从 `/usr/local/etc/php/conf.d/` 中加载所有以 `.ini` 结尾的文件。 -默认情况下没有 `php.ini` 文件,因此应复制 PHP 项目提供的官方模板。 -在 Docker 上,模板在镜像中提供: +PHP 解释器将在以下位置查找: +Docker: +- php.ini: `/usr/local/etc/php/` 默认情况下不提供 php.ini。 +- 附加配置文件: `/usr/local/etc/php/conf.d/` +- php 扩展: `/usr/local/lib/php/extensions/no-debug-zts-/` +FrankenPHP 安装 (.rpm 或 .deb),: +- php.ini: `/etc/frankenphp/` 默认情况下提供带有生产预设的 php.ini 文件。 +- 附加配置文件: `/etc/frankenphp/php.d/` +- php 扩展: `/usr/lib/frankenphp/modules/` +静态二进制: +- php.ini: 执行 `frankenphp run` 或 `frankenphp php-server` 的目录,然后是 `/etc/frankenphp/` +- 附加配置文件: `/etc/frankenphp/php.d/` +- php 扩展: `/usr/lib/frankenphp/modules/` + +在 Docker 中,您应该复制 PHP 项目提供的官方模板: ```dockerfile FROM dunglas/frankenphp diff --git a/docs/config.md b/docs/config.md index 79c7ca59c9..93862a00ed 100644 --- a/docs/config.md +++ b/docs/config.md @@ -8,11 +8,21 @@ You can specify a custom path with the `-c` or `--config` option. PHP itself can be configured [using a `php.ini` file](https://www.php.net/manual/en/configuration.file.php). -By default, PHP supplied with Docker images and the one included in the static binary will look for a `php.ini` file in the directory where FrankenPHP is started and in `/usr/local/etc/php/`. They will also load all files ending in `.ini` from `/usr/local/etc/php/conf.d/`. - -No `php.ini` file is present by default, you should copy an official template provided by the PHP project. - -On Docker, the templates are provided in the images: +The PHP interpreter will look in the following locations: +Docker: +- php.ini: `/usr/local/etc/php/` No php.ini is provided by default. +- additional configuration files: `/usr/local/etc/php/conf.d/` +- php extensions: `/usr/local/lib/php/extensions/no-debug-zts-/` +FrankenPHP installation (.rpm or .deb): +- php.ini: `/etc/frankenphp/` A php.ini file with production presets is provided by default. +- additional configuration files: `/etc/frankenphp/php.d/` +- php extensions: `/usr/lib/frankenphp/modules/` +Static binary: +- php.ini: The directory in which `frankenphp run` or `frankenphp php-server` is executed, then `/etc/frankenphp/` +- additional configuration files: `/etc/frankenphp/php.d/` +- php extensions: `/usr/lib/frankenphp/modules/` + +In Docker, you should copy an official template provided by the PHP project: ```dockerfile FROM dunglas/frankenphp diff --git a/docs/fr/config.md b/docs/fr/config.md index f400acf301..b39403c99a 100644 --- a/docs/fr/config.md +++ b/docs/fr/config.md @@ -7,11 +7,21 @@ Le binaire statique cherchera le `Caddyfile` dans le répertoire dans lequel il PHP lui-même peut être configuré [en utilisant un fichier `php.ini`](https://www.php.net/manual/fr/configuration.file.php). -Par défaut, le PHP fourni avec les images Docker et celui inclus dans le binaire statique cherchera un fichier `php.ini` dans le répertoire dans lequel FrankenPHP est démarré et dans `/usr/local/etc/php/`. Ils chargeront également tous les fichiers se terminant par `.ini` dans `/usr/local/etc/php/conf.d/`. - -Aucun fichier `php.ini` n'est présent par défaut, vous devriez copier un modèle officiel fourni par le projet PHP. - -Sur Docker, les modèles sont fournis dans les images : +L'interpréteur PHP cherchera dans les emplacements suivants : +Docker : +- php.ini : `/usr/local/etc/php/` Aucun php.ini n'est fourni par défaut. +- fichiers de configuration supplémentaires : `/usr/local/etc/php/conf.d/` +- extensions php : `/usr/local/lib/php/extensions/no-debug-zts-/` +Installation de FrankenPHP (.rpm ou .deb) : +- php.ini : `/etc/frankenphp/` Un fichier php.ini avec des préréglages de production est fourni par défaut. +- fichiers de configuration supplémentaires : `/etc/frankenphp/php.d/` +- extensions php : `/usr/lib/frankenphp/modules/` +Binaire statique : +- php.ini : Le répertoire dans lequel `frankenphp run` ou `frankenphp php-server` est exécuté, puis `/etc/frankenphp/` +- fichiers de configuration supplémentaires : `/etc/frankenphp/php.d/` +- extensions php : `/usr/lib/frankenphp/modules/` + +Dans Docker, vous devriez copier un modèle officiel fourni par le projet PHP : ```dockerfile FROM dunglas/frankenphp diff --git a/docs/ru/config.md b/docs/ru/config.md index 36ccb1a33c..be43e2532d 100644 --- a/docs/ru/config.md +++ b/docs/ru/config.md @@ -7,11 +7,21 @@ FrankenPHP, Caddy, а также модули Mercure и Vulcain могут бы PHP можно настроить [с помощью файла `php.ini`](https://www.php.net/manual/en/configuration.file.php). -PHP из Docker-образов и статического бинарного файла по умолчанию будет искать файл `php.ini` в директории, где был запущен FrankenPHP, а также в `/usr/local/etc/php/`. Кроме того, будут загружены все файлы с расширением `.ini` из директории `/usr/local/etc/php/conf.d/`. - -Файл `php.ini` по умолчанию отсутствует. Вы можете скопировать официальный шаблон, предоставляемый проектом PHP. - -В Docker-шаблоны включены в образы: +PHP-интерпретатор будет искать в следующих местах: +Docker: +- php.ini: `/usr/local/etc/php/` По умолчанию php.ini не предоставляется. +- дополнительные файлы конфигурации: `/usr/local/etc/php/conf.d/` +- расширения php: `/usr/local/lib/php/extensions/no-debug-zts-/` +Установка FrankenPHP (.rpm или .deb): +- php.ini: `/etc/frankenphp/` По умолчанию предоставляется файл php.ini с производственными настройками. +- дополнительные файлы конфигурации: `/etc/frankenphp/php.d/` +- расширения php: `/usr/lib/frankenphp/modules/` +Статический бинарный файл: +- php.ini: Директория, в которой выполняется `frankenphp run` или `frankenphp php-server`, затем `/etc/frankenphp/` +- дополнительные файлы конфигурации: `/etc/frankenphp/php.d/` +- расширения php: `/usr/lib/frankenphp/modules/` + +В Docker вы должны скопировать официальный шаблон, предоставляемый проектом PHP: ```dockerfile FROM dunglas/frankenphp diff --git a/docs/tr/config.md b/docs/tr/config.md index 084c52167d..59104111a6 100644 --- a/docs/tr/config.md +++ b/docs/tr/config.md @@ -7,10 +7,21 @@ Statik ikili, başlatıldığı dizinde `Caddyfile` dosyasını arayacaktır. PHP'nin kendisi [bir `php.ini` dosyası kullanılarak yapılandırılabilir](https://www.php.net/manual/tr/configuration.file.php). -Varsayılan olarak, Docker imajlarıyla birlikte verilen PHP ve statik ikili dosyada bulunan PHP, FrankenPHP'nin başlatıldığı dizinde ve `/usr/local/etc/php/` içinde bir `php.ini` dosyası arayacaktır. Ayrıca `.ini` ile biten tüm dosyaları `/usr/local/etc/php/conf.d/` dizininden yükleyecektir. - -Öntanımlı olarak `php.ini` dosyası yoktur, PHP projesi tarafından sağlanan resmi bir şablonu kopyalamanız gerekir. -Docker'da şablonlar imajlar içinde sağlanır: +PHP yorumlayıcısı aşağıdaki konumlarda arama yapacaktır: +Docker: +- php.ini: `/usr/local/etc/php/` Varsayılan olarak php.ini sağlanmaz. +- ek yapılandırma dosyaları: `/usr/local/etc/php/conf.d/` +- php uzantıları: `/usr/local/lib/php/extensions/no-debug-zts-/` +FrankenPHP kurulumu (.rpm veya .deb): +- php.ini: `/etc/frankenphp/` Varsayılan olarak üretim ön ayarlarına sahip bir php.ini dosyası sağlanır. +- ek yapılandırma dosyaları: `/etc/frankenphp/php.d/` +- php uzantıları: `/usr/lib/frankenphp/modules/` +Statik ikili: +- php.ini: `frankenphp run` veya `frankenphp php-server` komutunun çalıştırıldığı dizin, ardından `/etc/frankenphp/` +- ek yapılandırma dosyaları: `/etc/frankenphp/php.d/` +- php uzantıları: `/usr/lib/frankenphp/modules/` + +Docker'da, PHP projesi tarafından sağlanan resmi bir şablonu kopyalamalısınız: ```dockerfile FROM dunglas/frankenphp diff --git a/static-builder-gnu.Dockerfile b/static-builder-gnu.Dockerfile index f818b77e72..87a42111d3 100644 --- a/static-builder-gnu.Dockerfile +++ b/static-builder-gnu.Dockerfile @@ -116,8 +116,7 @@ ENV SPC_DEFAULT_C_FLAGS='-fPIE -fPIC -O3' ENV SPC_LIBC='glibc' ENV SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS_PROGRAM='-Wl,-O3 -pie' ENV SPC_CMD_VAR_PHP_MAKE_EXTRA_LIBS='-ldl -lpthread -lm -lresolv -lutil -lrt' -ENV SPC_OPT_DOWNLOAD_ARGS='--ignore-cache-sources=php-src' -ENV SPC_OPT_BUILD_ARGS='--with-config-file-path=/etc/frankenphp/php.ini --with-config-file-scan-dir=/etc/frankenphp/php.d' +ENV SPC_OPT_BUILD_ARGS='--with-config-file-path=/etc/frankenphp --with-config-file-scan-dir=/etc/frankenphp/php.d' ENV SPC_REL_TYPE='binary' ENV EXTENSION_DIR='/usr/lib/frankenphp/modules' diff --git a/static-builder-musl.Dockerfile b/static-builder-musl.Dockerfile index 3f7ab48327..e8ab429c54 100644 --- a/static-builder-musl.Dockerfile +++ b/static-builder-musl.Dockerfile @@ -93,6 +93,9 @@ COPY --link . ./ ENV SPC_DEFAULT_C_FLAGS='-fPIE -fPIC -O3' ENV SPC_LIBC='musl' ENV SPC_CMD_VAR_PHP_MAKE_EXTRA_LDFLAGS_PROGRAM='-Wl,-O3 -pie' +ENV SPC_OPT_BUILD_ARGS='--with-config-file-path=/etc/frankenphp --with-config-file-scan-dir=/etc/frankenphp/php.d' +ENV SPC_REL_TYPE='binary' +ENV EXTENSION_DIR='/usr/lib/frankenphp/modules' RUN --mount=type=secret,id=github-token GITHUB_TOKEN=$(cat /run/secrets/github-token) ./build-static.sh && \ rm -Rf dist/static-php-cli/source/* From 115d4a6d166642582e321aed69a64676a574c9b7 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Thu, 24 Apr 2025 13:55:44 +0700 Subject: [PATCH 52/75] update documentation for paths some more --- dev-alpine.Dockerfile | 2 +- dev.Dockerfile | 2 +- docs/cn/config.md | 33 +++++++++++++++++++-------------- docs/config.md | 32 +++++++++++++++++++------------- docs/fr/config.md | 33 +++++++++++++++++++-------------- docs/ru/config.md | 33 +++++++++++++++++++-------------- docs/tr/config.md | 33 +++++++++++++++++++-------------- 7 files changed, 97 insertions(+), 71 deletions(-) diff --git a/dev-alpine.Dockerfile b/dev-alpine.Dockerfile index 95fef3ddf0..03bc2f5d35 100644 --- a/dev-alpine.Dockerfile +++ b/dev-alpine.Dockerfile @@ -50,7 +50,7 @@ WORKDIR /usr/local/src/php RUN git clone --branch=PHP-8.4 https://github.com/php/php-src.git . && \ # --enable-embed is only necessary to generate libphp.so, we don't use this SAPI directly ./buildconf --force && \ - ./configure \ + EXTENSION_DIR=/usr/lib/frankenphp/modules ./configure \ --enable-embed \ --enable-zts \ --disable-zend-signals \ diff --git a/dev.Dockerfile b/dev.Dockerfile index d74cbd26e2..a3b9f57e67 100644 --- a/dev.Dockerfile +++ b/dev.Dockerfile @@ -52,7 +52,7 @@ WORKDIR /usr/local/src/php RUN git clone --branch=PHP-8.4 https://github.com/php/php-src.git . && \ # --enable-embed is only necessary to generate libphp.so, we don't use this SAPI directly ./buildconf --force && \ - ./configure \ + EXTENSION_DIR=/usr/lib/frankenphp/modules ./configure \ --enable-embed \ --enable-zts \ --disable-zend-signals \ diff --git a/docs/cn/config.md b/docs/cn/config.md index 125b56b211..b2366f885c 100644 --- a/docs/cn/config.md +++ b/docs/cn/config.md @@ -6,21 +6,12 @@ FrankenPHP,Caddy 以及 Mercure 和 Vulcain 模块可以使用 [Caddy 支持 静态二进制文件会在启动时所在的目录中查找 `Caddyfile`。 PHP 本身可以[使用 `php.ini` 文件](https://www.php.net/manual/zh/configuration.file.php)进行配置。 PHP 解释器将在以下位置查找: + Docker: -- php.ini: `/usr/local/etc/php/` 默认情况下不提供 php.ini。 -- 附加配置文件: `/usr/local/etc/php/conf.d/` +- php.ini: `/usr/local/etc/php/php.ini` 默认情况下不提供 php.ini。 +- 附加配置文件: `/usr/local/etc/php/conf.d/*.ini` - php 扩展: `/usr/local/lib/php/extensions/no-debug-zts-/` -FrankenPHP 安装 (.rpm 或 .deb),: -- php.ini: `/etc/frankenphp/` 默认情况下提供带有生产预设的 php.ini 文件。 -- 附加配置文件: `/etc/frankenphp/php.d/` -- php 扩展: `/usr/lib/frankenphp/modules/` -静态二进制: -- php.ini: 执行 `frankenphp run` 或 `frankenphp php-server` 的目录,然后是 `/etc/frankenphp/` -- 附加配置文件: `/etc/frankenphp/php.d/` -- php 扩展: `/usr/lib/frankenphp/modules/` - -在 Docker 中,您应该复制 PHP 项目提供的官方模板: - +- 您应该复制 PHP 项目提供的官方模板: ```dockerfile FROM dunglas/frankenphp @@ -31,7 +22,21 @@ RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini ``` -如果不使用 Docker,请复制[PHP 源代码](https://github.com/php/php-src/)中提供的`php.ini-production`或`php.ini-development`中的一个。 +dev.Dockerfile: +- php.ini: `/etc/frankenphp/php.ini` 默认情况下提供带有开发预设的 php.ini 文件。 +- 附加配置文件: `/etc/frankenphp/php.d/*.ini` +- php 扩展: `/usr/lib/frankenphp/modules/` + +FrankenPHP 安装 (.rpm 或 .deb): +- php.ini: `/etc/frankenphp/php.ini` 默认情况下提供带有生产预设的 php.ini 文件。 +- 附加配置文件: `/etc/frankenphp/php.d/*.ini` +- php 扩展: `/usr/lib/frankenphp/modules/` + +静态二进制: +- php.ini: 执行 `frankenphp run` 或 `frankenphp php-server` 的目录,然后是 `/etc/frankenphp/php.ini` +- 附加配置文件: `/etc/frankenphp/php.d/*.ini` +- php 扩展: 无法加载 +- 复制[PHP 源代码](https://github.com/php/php-src/)中提供的`php.ini-production`或`php.ini-development`中的一个。 ## Caddyfile 配置 diff --git a/docs/config.md b/docs/config.md index 93862a00ed..71cd2b81c3 100644 --- a/docs/config.md +++ b/docs/config.md @@ -9,20 +9,12 @@ You can specify a custom path with the `-c` or `--config` option. PHP itself can be configured [using a `php.ini` file](https://www.php.net/manual/en/configuration.file.php). The PHP interpreter will look in the following locations: + Docker: -- php.ini: `/usr/local/etc/php/` No php.ini is provided by default. -- additional configuration files: `/usr/local/etc/php/conf.d/` +- php.ini: `/usr/local/etc/php/php.ini` No php.ini is provided by default. +- additional configuration files: `/usr/local/etc/php/conf.d/*.ini` - php extensions: `/usr/local/lib/php/extensions/no-debug-zts-/` -FrankenPHP installation (.rpm or .deb): -- php.ini: `/etc/frankenphp/` A php.ini file with production presets is provided by default. -- additional configuration files: `/etc/frankenphp/php.d/` -- php extensions: `/usr/lib/frankenphp/modules/` -Static binary: -- php.ini: The directory in which `frankenphp run` or `frankenphp php-server` is executed, then `/etc/frankenphp/` -- additional configuration files: `/etc/frankenphp/php.d/` -- php extensions: `/usr/lib/frankenphp/modules/` - -In Docker, you should copy an official template provided by the PHP project: +- You should copy an official template provided by the PHP project: ```dockerfile FROM dunglas/frankenphp @@ -34,7 +26,21 @@ RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini ``` -If you don't use Docker, copy one of `php.ini-production` or `php.ini-development` provided [in the PHP sources](https://github.com/php/php-src/). +dev.Dockerfile: +- php.ini: `/etc/frankenphp/php.ini` A php.ini file with development presets is provided by default. +- additional configuration files: `/etc/frankenphp/php.d/*.ini` +- php extensions: `/usr/lib/frankenphp/modules/` + +FrankenPHP installation (.rpm or .deb): +- php.ini: `/etc/frankenphp/php.ini` A php.ini file with production presets is provided by default. +- additional configuration files: `/etc/frankenphp/php.d/*.ini` +- php extensions: `/usr/lib/frankenphp/modules/` + +Static binary: +- php.ini: The directory in which `frankenphp run` or `frankenphp php-server` is executed, then `/etc/frankenphp/php.ini` +- additional configuration files: `/etc/frankenphp/php.d/*.ini` +- php extensions: cannot be loaded +- copy one of `php.ini-production` or `php.ini-development` provided [in the PHP sources](https://github.com/php/php-src/). ## Caddyfile Config diff --git a/docs/fr/config.md b/docs/fr/config.md index b39403c99a..595ddf1c3a 100644 --- a/docs/fr/config.md +++ b/docs/fr/config.md @@ -8,21 +8,12 @@ Le binaire statique cherchera le `Caddyfile` dans le répertoire dans lequel il PHP lui-même peut être configuré [en utilisant un fichier `php.ini`](https://www.php.net/manual/fr/configuration.file.php). L'interpréteur PHP cherchera dans les emplacements suivants : + Docker : -- php.ini : `/usr/local/etc/php/` Aucun php.ini n'est fourni par défaut. -- fichiers de configuration supplémentaires : `/usr/local/etc/php/conf.d/` +- php.ini : `/usr/local/etc/php/php.ini` Aucun php.ini n'est fourni par défaut. +- fichiers de configuration supplémentaires : `/usr/local/etc/php/conf.d/*.ini` - extensions php : `/usr/local/lib/php/extensions/no-debug-zts-/` -Installation de FrankenPHP (.rpm ou .deb) : -- php.ini : `/etc/frankenphp/` Un fichier php.ini avec des préréglages de production est fourni par défaut. -- fichiers de configuration supplémentaires : `/etc/frankenphp/php.d/` -- extensions php : `/usr/lib/frankenphp/modules/` -Binaire statique : -- php.ini : Le répertoire dans lequel `frankenphp run` ou `frankenphp php-server` est exécuté, puis `/etc/frankenphp/` -- fichiers de configuration supplémentaires : `/etc/frankenphp/php.d/` -- extensions php : `/usr/lib/frankenphp/modules/` - -Dans Docker, vous devriez copier un modèle officiel fourni par le projet PHP : - +- Vous devriez copier un modèle officiel fourni par le projet PHP : ```dockerfile FROM dunglas/frankenphp @@ -33,7 +24,21 @@ RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini ``` -Si vous n'utilisez pas Docker, copiez l'un des fichiers `php.ini-production` ou `php.ini-development` fournis [dans les sources de PHP](https://github.com/php/php-src/). +dev.Dockerfile : +- php.ini : `/etc/frankenphp/php.ini` Un fichier php.ini avec des préréglages de développement est fourni par défaut. +- fichiers de configuration supplémentaires : `/etc/frankenphp/php.d/*.ini` +- extensions php : `/usr/lib/frankenphp/modules/` + +Installation de FrankenPHP (.rpm ou .deb) : +- php.ini : `/etc/frankenphp/php.ini` Un fichier php.ini avec des préréglages de production est fourni par défaut. +- fichiers de configuration supplémentaires : `/etc/frankenphp/php.d/*.ini` +- extensions php : `/usr/lib/frankenphp/modules/` + +Binaire statique : +- php.ini : Le répertoire dans lequel `frankenphp run` ou `frankenphp php-server` est exécuté, puis `/etc/frankenphp/php.ini` +- fichiers de configuration supplémentaires : `/etc/frankenphp/php.d/*.ini` +- extensions php : ne peuvent pas être chargées +- copiez l'un des fichiers `php.ini-production` ou `php.ini-development` fournis [dans les sources de PHP](https://github.com/php/php-src/). ## Configuration du Caddyfile diff --git a/docs/ru/config.md b/docs/ru/config.md index be43e2532d..b0333a776b 100644 --- a/docs/ru/config.md +++ b/docs/ru/config.md @@ -8,21 +8,12 @@ FrankenPHP, Caddy, а также модули Mercure и Vulcain могут бы PHP можно настроить [с помощью файла `php.ini`](https://www.php.net/manual/en/configuration.file.php). PHP-интерпретатор будет искать в следующих местах: + Docker: -- php.ini: `/usr/local/etc/php/` По умолчанию php.ini не предоставляется. -- дополнительные файлы конфигурации: `/usr/local/etc/php/conf.d/` +- php.ini: `/usr/local/etc/php/php.ini` По умолчанию php.ini не предоставляется. +- дополнительные файлы конфигурации: `/usr/local/etc/php/conf.d/*.ini` - расширения php: `/usr/local/lib/php/extensions/no-debug-zts-/` -Установка FrankenPHP (.rpm или .deb): -- php.ini: `/etc/frankenphp/` По умолчанию предоставляется файл php.ini с производственными настройками. -- дополнительные файлы конфигурации: `/etc/frankenphp/php.d/` -- расширения php: `/usr/lib/frankenphp/modules/` -Статический бинарный файл: -- php.ini: Директория, в которой выполняется `frankenphp run` или `frankenphp php-server`, затем `/etc/frankenphp/` -- дополнительные файлы конфигурации: `/etc/frankenphp/php.d/` -- расширения php: `/usr/lib/frankenphp/modules/` - -В Docker вы должны скопировать официальный шаблон, предоставляемый проектом PHP: - +- Вы должны скопировать официальный шаблон, предоставляемый проектом PHP: ```dockerfile FROM dunglas/frankenphp @@ -33,7 +24,21 @@ RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini ``` -Если вы не используете Docker, скопируйте один из шаблонов `php.ini-production` или `php.ini-development`, предоставленных [в исходниках PHP](https://github.com/php/php-src/). +dev.Dockerfile: +- php.ini: `/etc/frankenphp/php.ini` По умолчанию предоставляется файл php.ini с настройками для разработки. +- дополнительные файлы конфигурации: `/etc/frankenphp/php.d/*.ini` +- расширения php: `/usr/lib/frankenphp/modules/` + +Установка FrankenPHP (.rpm или .deb): +- php.ini: `/etc/frankenphp/php.ini` По умолчанию предоставляется файл php.ini с производственными настройками. +- дополнительные файлы конфигурации: `/etc/frankenphp/php.d/*.ini` +- расширения php: `/usr/lib/frankenphp/modules/` + +Статический бинарный файл: +- php.ini: Директория, в которой выполняется `frankenphp run` или `frankenphp php-server`, затем `/etc/frankenphp/php.ini` +- дополнительные файлы конфигурации: `/etc/frankenphp/php.d/*.ini` +- расширения php: не могут быть загружены +- скопируйте один из шаблонов `php.ini-production` или `php.ini-development`, предоставленных [в исходниках PHP](https://github.com/php/php-src/). ## Конфигурация Caddyfile diff --git a/docs/tr/config.md b/docs/tr/config.md index 59104111a6..ebf0b2b5aa 100644 --- a/docs/tr/config.md +++ b/docs/tr/config.md @@ -8,21 +8,12 @@ Statik ikili, başlatıldığı dizinde `Caddyfile` dosyasını arayacaktır. PHP'nin kendisi [bir `php.ini` dosyası kullanılarak yapılandırılabilir](https://www.php.net/manual/tr/configuration.file.php). PHP yorumlayıcısı aşağıdaki konumlarda arama yapacaktır: + Docker: -- php.ini: `/usr/local/etc/php/` Varsayılan olarak php.ini sağlanmaz. -- ek yapılandırma dosyaları: `/usr/local/etc/php/conf.d/` +- php.ini: `/usr/local/etc/php/php.ini` Varsayılan olarak php.ini sağlanmaz. +- ek yapılandırma dosyaları: `/usr/local/etc/php/conf.d/*.ini` - php uzantıları: `/usr/local/lib/php/extensions/no-debug-zts-/` -FrankenPHP kurulumu (.rpm veya .deb): -- php.ini: `/etc/frankenphp/` Varsayılan olarak üretim ön ayarlarına sahip bir php.ini dosyası sağlanır. -- ek yapılandırma dosyaları: `/etc/frankenphp/php.d/` -- php uzantıları: `/usr/lib/frankenphp/modules/` -Statik ikili: -- php.ini: `frankenphp run` veya `frankenphp php-server` komutunun çalıştırıldığı dizin, ardından `/etc/frankenphp/` -- ek yapılandırma dosyaları: `/etc/frankenphp/php.d/` -- php uzantıları: `/usr/lib/frankenphp/modules/` - -Docker'da, PHP projesi tarafından sağlanan resmi bir şablonu kopyalamalısınız: - +- PHP projesi tarafından sağlanan resmi bir şablonu kopyalamalısınız: ```dockerfile FROM dunglas/frankenphp @@ -33,7 +24,21 @@ RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini ``` -Docker kullanmıyorsanız, [PHP kaynak kodu](https://github.com/php/php-src/) ile birlikte verilen `php.ini-production` veya `php.ini-development` dosyalarından birini kopyalayın. +dev.Dockerfile: +- php.ini: `/etc/frankenphp/php.ini` Varsayılan olarak geliştirme ön ayarlarına sahip bir php.ini dosyası sağlanır. +- ek yapılandırma dosyaları: `/etc/frankenphp/php.d/*.ini` +- php uzantıları: `/usr/lib/frankenphp/modules/` + +FrankenPHP kurulumu (.rpm veya .deb): +- php.ini: `/etc/frankenphp/php.ini` Varsayılan olarak üretim ön ayarlarına sahip bir php.ini dosyası sağlanır. +- ek yapılandırma dosyaları: `/etc/frankenphp/php.d/*.ini` +- php uzantıları: `/usr/lib/frankenphp/modules/` + +Statik ikili: +- php.ini: `frankenphp run` veya `frankenphp php-server` komutunun çalıştırıldığı dizin, ardından `/etc/frankenphp/php.ini` +- ek yapılandırma dosyaları: `/etc/frankenphp/php.d/*.ini` +- php uzantıları: yüklenemez +- [PHP kaynak kodu](https://github.com/php/php-src/) ile birlikte verilen `php.ini-production` veya `php.ini-development` dosyalarından birini kopyalayın. ## Caddyfile Konfigürasyonu From d663244c1ffaf1cf5a804e3461b87f8c911108f1 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Thu, 24 Apr 2025 14:52:57 +0700 Subject: [PATCH 53/75] fix musl opcache-jit issue --- build-static.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build-static.sh b/build-static.sh index 4de0255275..e8fc692d01 100755 --- a/build-static.sh +++ b/build-static.sh @@ -40,9 +40,9 @@ fi # init spc build additional args if [ -z "${SPC_OPT_BUILD_ARGS}" ]; then SPC_OPT_BUILD_ARGS="" - if [ "${SPC_LIBC}" = "musl" ]; then - SPC_OPT_BUILD_ARGS="${SPC_OPT_BUILD_ARGS} --disable-opcache-jit" - fi +fi +if [ "${SPC_LIBC}" = "musl" ] && [[ "${SPC_OPT_BUILD_ARGS}" != *"--disable-opcache-jit"* ]]; then + SPC_OPT_BUILD_ARGS="${SPC_OPT_BUILD_ARGS} --disable-opcache-jit" fi # init spc download additional args if [ -z "${SPC_OPT_DOWNLOAD_ARGS}" ]; then From 5e7c217dc2a47b7d49055c2d4dde31d1e6108d70 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Thu, 24 Apr 2025 14:56:57 +0700 Subject: [PATCH 54/75] markdown linter --- docs/cn/config.md | 11 ++++++++--- docs/config.md | 6 +++++- docs/fr/config.md | 5 +++++ docs/ru/config.md | 5 +++++ docs/tr/config.md | 5 +++++ 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/docs/cn/config.md b/docs/cn/config.md index b2366f885c..bfe8169afb 100644 --- a/docs/cn/config.md +++ b/docs/cn/config.md @@ -8,10 +8,12 @@ PHP 本身可以[使用 `php.ini` 文件](https://www.php.net/manual/zh/configur PHP 解释器将在以下位置查找: Docker: + - php.ini: `/usr/local/etc/php/php.ini` 默认情况下不提供 php.ini。 - 附加配置文件: `/usr/local/etc/php/conf.d/*.ini` - php 扩展: `/usr/local/lib/php/extensions/no-debug-zts-/` - 您应该复制 PHP 项目提供的官方模板: + ```dockerfile FROM dunglas/frankenphp @@ -23,16 +25,19 @@ RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini ``` dev.Dockerfile: + - php.ini: `/etc/frankenphp/php.ini` 默认情况下提供带有开发预设的 php.ini 文件。 - 附加配置文件: `/etc/frankenphp/php.d/*.ini` - php 扩展: `/usr/lib/frankenphp/modules/` FrankenPHP 安装 (.rpm 或 .deb): + - php.ini: `/etc/frankenphp/php.ini` 默认情况下提供带有生产预设的 php.ini 文件。 - 附加配置文件: `/etc/frankenphp/php.d/*.ini` - php 扩展: `/usr/lib/frankenphp/modules/` 静态二进制: + - php.ini: 执行 `frankenphp run` 或 `frankenphp php-server` 的目录,然后是 `/etc/frankenphp/php.ini` - 附加配置文件: `/etc/frankenphp/php.d/*.ini` - php 扩展: 无法加载 @@ -150,9 +155,9 @@ php_server [] { 以下环境变量可用于在 `Caddyfile` 中注入 Caddy 指令,而无需对其进行修改: -* `SERVER_NAME`: 更改 [要监听的地址](https://caddyserver.com/docs/caddyfile/concepts#addresses),提供的主机名也将用于生成的 TLS 证书 -* `CADDY_GLOBAL_OPTIONS`: 注入 [全局选项](https://caddyserver.com/docs/caddyfile/options) -* `FRANKENPHP_CONFIG`: 在 `frankenphp` 指令下注入配置 +- `SERVER_NAME`: 更改 [要监听的地址](https://caddyserver.com/docs/caddyfile/concepts#addresses),提供的主机名也将用于生成的 TLS 证书 +- `CADDY_GLOBAL_OPTIONS`: 注入 [全局选项](https://caddyserver.com/docs/caddyfile/options) +- `FRANKENPHP_CONFIG`: 在 `frankenphp` 指令下注入配置 ## PHP 配置 diff --git a/docs/config.md b/docs/config.md index 71cd2b81c3..1f6bf573b6 100644 --- a/docs/config.md +++ b/docs/config.md @@ -10,7 +10,8 @@ PHP itself can be configured [using a `php.ini` file](https://www.php.net/manual The PHP interpreter will look in the following locations: -Docker: +Docker: + - php.ini: `/usr/local/etc/php/php.ini` No php.ini is provided by default. - additional configuration files: `/usr/local/etc/php/conf.d/*.ini` - php extensions: `/usr/local/lib/php/extensions/no-debug-zts-/` @@ -27,16 +28,19 @@ RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini ``` dev.Dockerfile: + - php.ini: `/etc/frankenphp/php.ini` A php.ini file with development presets is provided by default. - additional configuration files: `/etc/frankenphp/php.d/*.ini` - php extensions: `/usr/lib/frankenphp/modules/` FrankenPHP installation (.rpm or .deb): + - php.ini: `/etc/frankenphp/php.ini` A php.ini file with production presets is provided by default. - additional configuration files: `/etc/frankenphp/php.d/*.ini` - php extensions: `/usr/lib/frankenphp/modules/` Static binary: + - php.ini: The directory in which `frankenphp run` or `frankenphp php-server` is executed, then `/etc/frankenphp/php.ini` - additional configuration files: `/etc/frankenphp/php.d/*.ini` - php extensions: cannot be loaded diff --git a/docs/fr/config.md b/docs/fr/config.md index 595ddf1c3a..7f61d42854 100644 --- a/docs/fr/config.md +++ b/docs/fr/config.md @@ -10,10 +10,12 @@ PHP lui-même peut être configuré [en utilisant un fichier `php.ini`](https:// L'interpréteur PHP cherchera dans les emplacements suivants : Docker : + - php.ini : `/usr/local/etc/php/php.ini` Aucun php.ini n'est fourni par défaut. - fichiers de configuration supplémentaires : `/usr/local/etc/php/conf.d/*.ini` - extensions php : `/usr/local/lib/php/extensions/no-debug-zts-/` - Vous devriez copier un modèle officiel fourni par le projet PHP : + ```dockerfile FROM dunglas/frankenphp @@ -25,16 +27,19 @@ RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini ``` dev.Dockerfile : + - php.ini : `/etc/frankenphp/php.ini` Un fichier php.ini avec des préréglages de développement est fourni par défaut. - fichiers de configuration supplémentaires : `/etc/frankenphp/php.d/*.ini` - extensions php : `/usr/lib/frankenphp/modules/` Installation de FrankenPHP (.rpm ou .deb) : + - php.ini : `/etc/frankenphp/php.ini` Un fichier php.ini avec des préréglages de production est fourni par défaut. - fichiers de configuration supplémentaires : `/etc/frankenphp/php.d/*.ini` - extensions php : `/usr/lib/frankenphp/modules/` Binaire statique : + - php.ini : Le répertoire dans lequel `frankenphp run` ou `frankenphp php-server` est exécuté, puis `/etc/frankenphp/php.ini` - fichiers de configuration supplémentaires : `/etc/frankenphp/php.d/*.ini` - extensions php : ne peuvent pas être chargées diff --git a/docs/ru/config.md b/docs/ru/config.md index b0333a776b..fdff9c1202 100644 --- a/docs/ru/config.md +++ b/docs/ru/config.md @@ -10,10 +10,12 @@ PHP можно настроить [с помощью файла `php.ini`](https PHP-интерпретатор будет искать в следующих местах: Docker: + - php.ini: `/usr/local/etc/php/php.ini` По умолчанию php.ini не предоставляется. - дополнительные файлы конфигурации: `/usr/local/etc/php/conf.d/*.ini` - расширения php: `/usr/local/lib/php/extensions/no-debug-zts-/` - Вы должны скопировать официальный шаблон, предоставляемый проектом PHP: + ```dockerfile FROM dunglas/frankenphp @@ -25,16 +27,19 @@ RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini ``` dev.Dockerfile: + - php.ini: `/etc/frankenphp/php.ini` По умолчанию предоставляется файл php.ini с настройками для разработки. - дополнительные файлы конфигурации: `/etc/frankenphp/php.d/*.ini` - расширения php: `/usr/lib/frankenphp/modules/` Установка FrankenPHP (.rpm или .deb): + - php.ini: `/etc/frankenphp/php.ini` По умолчанию предоставляется файл php.ini с производственными настройками. - дополнительные файлы конфигурации: `/etc/frankenphp/php.d/*.ini` - расширения php: `/usr/lib/frankenphp/modules/` Статический бинарный файл: + - php.ini: Директория, в которой выполняется `frankenphp run` или `frankenphp php-server`, затем `/etc/frankenphp/php.ini` - дополнительные файлы конфигурации: `/etc/frankenphp/php.d/*.ini` - расширения php: не могут быть загружены diff --git a/docs/tr/config.md b/docs/tr/config.md index ebf0b2b5aa..13e806c908 100644 --- a/docs/tr/config.md +++ b/docs/tr/config.md @@ -10,10 +10,12 @@ PHP'nin kendisi [bir `php.ini` dosyası kullanılarak yapılandırılabilir](htt PHP yorumlayıcısı aşağıdaki konumlarda arama yapacaktır: Docker: + - php.ini: `/usr/local/etc/php/php.ini` Varsayılan olarak php.ini sağlanmaz. - ek yapılandırma dosyaları: `/usr/local/etc/php/conf.d/*.ini` - php uzantıları: `/usr/local/lib/php/extensions/no-debug-zts-/` - PHP projesi tarafından sağlanan resmi bir şablonu kopyalamalısınız: + ```dockerfile FROM dunglas/frankenphp @@ -25,16 +27,19 @@ RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini ``` dev.Dockerfile: + - php.ini: `/etc/frankenphp/php.ini` Varsayılan olarak geliştirme ön ayarlarına sahip bir php.ini dosyası sağlanır. - ek yapılandırma dosyaları: `/etc/frankenphp/php.d/*.ini` - php uzantıları: `/usr/lib/frankenphp/modules/` FrankenPHP kurulumu (.rpm veya .deb): + - php.ini: `/etc/frankenphp/php.ini` Varsayılan olarak üretim ön ayarlarına sahip bir php.ini dosyası sağlanır. - ek yapılandırma dosyaları: `/etc/frankenphp/php.d/*.ini` - php uzantıları: `/usr/lib/frankenphp/modules/` Statik ikili: + - php.ini: `frankenphp run` veya `frankenphp php-server` komutunun çalıştırıldığı dizin, ardından `/etc/frankenphp/php.ini` - ek yapılandırma dosyaları: `/etc/frankenphp/php.d/*.ini` - php uzantıları: yüklenemez From d0b8338ff33c2fa2b386ab3e00c9c8a2ae621d7f Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Thu, 24 Apr 2025 15:01:39 +0700 Subject: [PATCH 55/75] the damn tab --- build-static.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-static.sh b/build-static.sh index e8fc692d01..d1db5d7208 100755 --- a/build-static.sh +++ b/build-static.sh @@ -42,7 +42,7 @@ if [ -z "${SPC_OPT_BUILD_ARGS}" ]; then SPC_OPT_BUILD_ARGS="" fi if [ "${SPC_LIBC}" = "musl" ] && [[ "${SPC_OPT_BUILD_ARGS}" != *"--disable-opcache-jit"* ]]; then - SPC_OPT_BUILD_ARGS="${SPC_OPT_BUILD_ARGS} --disable-opcache-jit" + SPC_OPT_BUILD_ARGS="${SPC_OPT_BUILD_ARGS} --disable-opcache-jit" fi # init spc download additional args if [ -z "${SPC_OPT_DOWNLOAD_ARGS}" ]; then From 7b7a63f67f6271f0984ddcb296a1101c335d494f Mon Sep 17 00:00:00 2001 From: Marc Date: Tue, 29 Apr 2025 17:04:07 +0700 Subject: [PATCH 56/75] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kévin Dunglas --- caddy/frankenphp/Caddyfile | 4 ++-- docs/config.md | 20 ++++++++++---------- package/Caddyfile | 4 ++-- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/caddy/frankenphp/Caddyfile b/caddy/frankenphp/Caddyfile index 825c887871..0e18196e49 100644 --- a/caddy/frankenphp/Caddyfile +++ b/caddy/frankenphp/Caddyfile @@ -1,7 +1,7 @@ -# The Caddyfile is an easy way to configure your Caddy web server. +# The Caddyfile is an easy way to configure FrankenPHP and the Caddy web server. # -# https://caddyserver.com/docs/caddyfile # https://frankenphp.dev/docs/config +# https://caddyserver.com/docs/caddyfile { {$CADDY_GLOBAL_OPTIONS} diff --git a/docs/config.md b/docs/config.md index 1f6bf573b6..fc7e57db7d 100644 --- a/docs/config.md +++ b/docs/config.md @@ -8,13 +8,13 @@ You can specify a custom path with the `-c` or `--config` option. PHP itself can be configured [using a `php.ini` file](https://www.php.net/manual/en/configuration.file.php). -The PHP interpreter will look in the following locations: +Depending on your installation method, the PHP interpreter will look for configuration files in locations described above. -Docker: +## Docker -- php.ini: `/usr/local/etc/php/php.ini` No php.ini is provided by default. +- `php.ini`: `/usr/local/etc/php/php.ini` (no `php.ini` is provided by default) - additional configuration files: `/usr/local/etc/php/conf.d/*.ini` -- php extensions: `/usr/local/lib/php/extensions/no-debug-zts-/` +- PHP extensions: `/usr/local/lib/php/extensions/no-debug-zts-/` - You should copy an official template provided by the PHP project: ```dockerfile @@ -33,17 +33,17 @@ dev.Dockerfile: - additional configuration files: `/etc/frankenphp/php.d/*.ini` - php extensions: `/usr/lib/frankenphp/modules/` -FrankenPHP installation (.rpm or .deb): +## RPM and Debian packages -- php.ini: `/etc/frankenphp/php.ini` A php.ini file with production presets is provided by default. +- `php.ini`: `/etc/frankenphp/php.ini` (a `php.ini` file with production presets is provided by default) - additional configuration files: `/etc/frankenphp/php.d/*.ini` -- php extensions: `/usr/lib/frankenphp/modules/` +- PHP extensions: `/usr/lib/frankenphp/modules/` -Static binary: +## Static binary -- php.ini: The directory in which `frankenphp run` or `frankenphp php-server` is executed, then `/etc/frankenphp/php.ini` +- `php.ini`: The directory in which `frankenphp run` or `frankenphp php-server` is executed, then `/etc/frankenphp/php.ini` - additional configuration files: `/etc/frankenphp/php.d/*.ini` -- php extensions: cannot be loaded +- PHP extensions: cannot be loaded, bundle them in the binary itself - copy one of `php.ini-production` or `php.ini-development` provided [in the PHP sources](https://github.com/php/php-src/). ## Caddyfile Config diff --git a/package/Caddyfile b/package/Caddyfile index 6623486f1e..92acfc1db8 100644 --- a/package/Caddyfile +++ b/package/Caddyfile @@ -1,7 +1,7 @@ -# The Caddyfile is an easy way to configure your Caddy web server. +# The Caddyfile is an easy way to configure FrankenPHP and the Caddy web server. # -# https://caddyserver.com/docs/caddyfile # https://frankenphp.dev/docs/config +# https://caddyserver.com/docs/caddyfile { {$CADDY_GLOBAL_OPTIONS} From e1de7b46f81206c2fdb6070a6fc30cf81cc8b908 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 29 Apr 2025 17:41:53 +0700 Subject: [PATCH 57/75] drop dev.Dockerfile php location from config.md --- docs/cn/config.md | 6 ------ docs/config.md | 6 ------ docs/fr/config.md | 6 ------ docs/ru/config.md | 6 ------ docs/tr/config.md | 6 ------ 5 files changed, 30 deletions(-) diff --git a/docs/cn/config.md b/docs/cn/config.md index bfe8169afb..18949c95d6 100644 --- a/docs/cn/config.md +++ b/docs/cn/config.md @@ -24,12 +24,6 @@ RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini ``` -dev.Dockerfile: - -- php.ini: `/etc/frankenphp/php.ini` 默认情况下提供带有开发预设的 php.ini 文件。 -- 附加配置文件: `/etc/frankenphp/php.d/*.ini` -- php 扩展: `/usr/lib/frankenphp/modules/` - FrankenPHP 安装 (.rpm 或 .deb): - php.ini: `/etc/frankenphp/php.ini` 默认情况下提供带有生产预设的 php.ini 文件。 diff --git a/docs/config.md b/docs/config.md index fc7e57db7d..09a225e6d4 100644 --- a/docs/config.md +++ b/docs/config.md @@ -27,12 +27,6 @@ RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini ``` -dev.Dockerfile: - -- php.ini: `/etc/frankenphp/php.ini` A php.ini file with development presets is provided by default. -- additional configuration files: `/etc/frankenphp/php.d/*.ini` -- php extensions: `/usr/lib/frankenphp/modules/` - ## RPM and Debian packages - `php.ini`: `/etc/frankenphp/php.ini` (a `php.ini` file with production presets is provided by default) diff --git a/docs/fr/config.md b/docs/fr/config.md index 7f61d42854..417b31a68e 100644 --- a/docs/fr/config.md +++ b/docs/fr/config.md @@ -26,12 +26,6 @@ RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini ``` -dev.Dockerfile : - -- php.ini : `/etc/frankenphp/php.ini` Un fichier php.ini avec des préréglages de développement est fourni par défaut. -- fichiers de configuration supplémentaires : `/etc/frankenphp/php.d/*.ini` -- extensions php : `/usr/lib/frankenphp/modules/` - Installation de FrankenPHP (.rpm ou .deb) : - php.ini : `/etc/frankenphp/php.ini` Un fichier php.ini avec des préréglages de production est fourni par défaut. diff --git a/docs/ru/config.md b/docs/ru/config.md index fdff9c1202..b9820d0231 100644 --- a/docs/ru/config.md +++ b/docs/ru/config.md @@ -26,12 +26,6 @@ RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini ``` -dev.Dockerfile: - -- php.ini: `/etc/frankenphp/php.ini` По умолчанию предоставляется файл php.ini с настройками для разработки. -- дополнительные файлы конфигурации: `/etc/frankenphp/php.d/*.ini` -- расширения php: `/usr/lib/frankenphp/modules/` - Установка FrankenPHP (.rpm или .deb): - php.ini: `/etc/frankenphp/php.ini` По умолчанию предоставляется файл php.ini с производственными настройками. diff --git a/docs/tr/config.md b/docs/tr/config.md index 13e806c908..18c7b1b0ed 100644 --- a/docs/tr/config.md +++ b/docs/tr/config.md @@ -26,12 +26,6 @@ RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini ``` -dev.Dockerfile: - -- php.ini: `/etc/frankenphp/php.ini` Varsayılan olarak geliştirme ön ayarlarına sahip bir php.ini dosyası sağlanır. -- ek yapılandırma dosyaları: `/etc/frankenphp/php.d/*.ini` -- php uzantıları: `/usr/lib/frankenphp/modules/` - FrankenPHP kurulumu (.rpm veya .deb): - php.ini: `/etc/frankenphp/php.ini` Varsayılan olarak üretim ön ayarlarına sahip bir php.ini dosyası sağlanır. From 19daf6401335325d0e6c48f02d2d16a839e3a7df Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 29 Apr 2025 17:46:16 +0700 Subject: [PATCH 58/75] add php config note to CONTRIBUTING.md --- CONTRIBUTING.md | 8 ++++++-- docs/cn/CONTRIBUTING.md | 8 ++++++-- docs/fr/CONTRIBUTING.md | 8 ++++++-- docs/ru/CONTRIBUTING.md | 8 ++++++-- docs/tr/CONTRIBUTING.md | 8 ++++++-- 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bf3ef696ff..4217589c50 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,9 +11,13 @@ docker build -t frankenphp-dev -f dev.Dockerfile . docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -p 8080:8080 -p 443:443 -p 443:443/udp -v $PWD:/go/src/app -it frankenphp-dev ``` -The image contains the usual development tools (Go, GDB, Valgrind, Neovim...). +The image contains the usual development tools (Go, GDB, Valgrind, Neovim...) and uses the following php setting locations -If docker version is lower than 23.0, build is failed by dockerignore [pattern issue](https://github.com/moby/moby/pull/42676). Add directories to `.dockerignore`. +- php.ini: `/etc/frankenphp/php.ini` A php.ini file with development presets is provided by default. +- additional configuration files: `/etc/frankenphp/php.d/*.ini` +- php extensions: `/usr/lib/frankenphp/modules/` + +If your docker version is lower than 23.0, the build will fail due to dockerignore [pattern issue](https://github.com/moby/moby/pull/42676). Add directories to `.dockerignore`. ```patch !testdata/*.php diff --git a/docs/cn/CONTRIBUTING.md b/docs/cn/CONTRIBUTING.md index 957fd99176..ad44e20cee 100644 --- a/docs/cn/CONTRIBUTING.md +++ b/docs/cn/CONTRIBUTING.md @@ -11,9 +11,13 @@ docker build -t frankenphp-dev -f dev.Dockerfile . docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -p 8080:8080 -p 443:443 -p 443:443/udp -v $PWD:/go/src/app -it frankenphp-dev ``` -该镜像包含常用的开发工具(Go、GDB、Valgrind、Neovim等)。 +该镜像包含常用的开发工具(Go、GDB、Valgrind、Neovim等)并使用以下 php 设置位置 -如果 docker 版本低于 23.0,则会因为 dockerignore [pattern issue](https://github.com/moby/moby/pull/42676) 而导致构建失败。将目录添加到 `.dockerignore`。 +- php.ini: `/etc/frankenphp/php.ini` 默认提供了一个带有开发预设的 php.ini 文件。 +- 附加配置文件: `/etc/frankenphp/php.d/*.ini` +- php 扩展: `/usr/lib/frankenphp/modules/` + +如果您的 docker 版本低于 23.0,则会因为 dockerignore [pattern issue](https://github.com/moby/moby/pull/42676) 而导致构建失败。将目录添加到 `.dockerignore`。 ```patch !testdata/*.php diff --git a/docs/fr/CONTRIBUTING.md b/docs/fr/CONTRIBUTING.md index f49a3e60f1..1017c4ca6b 100644 --- a/docs/fr/CONTRIBUTING.md +++ b/docs/fr/CONTRIBUTING.md @@ -11,9 +11,13 @@ docker build -t frankenphp-dev -f dev.Dockerfile . docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -p 8080:8080 -p 443:443 -p 443:443/udp -v $PWD:/go/src/app -it frankenphp-dev ``` -L'image contient les outils de développement habituels (Go, GDB, Valgrind, Neovim...). +L'image contient les outils de développement habituels (Go, GDB, Valgrind, Neovim...) et utilise les emplacements de configuration PHP suivants -Si la version de Docker est inférieure à 23.0, la construction échoue à cause d'un [problème de pattern](https://github.com/moby/moby/pull/42676) dans `.dockerignore`. Ajoutez les répertoires à `.dockerignore`. +- php.ini: `/etc/frankenphp/php.ini` Un fichier php.ini avec des préréglages de développement est fourni par défaut. +- fichiers de configuration supplémentaires: `/etc/frankenphp/php.d/*.ini` +- extensions php: `/usr/lib/frankenphp/modules/` + +Si votre version de Docker est inférieure à 23.0, la construction échouera à cause d'un [problème de pattern](https://github.com/moby/moby/pull/42676) dans `.dockerignore`. Ajoutez les répertoires à `.dockerignore`. ```patch !testdata/*.php diff --git a/docs/ru/CONTRIBUTING.md b/docs/ru/CONTRIBUTING.md index 8c7c08d6dc..55d39d66e2 100644 --- a/docs/ru/CONTRIBUTING.md +++ b/docs/ru/CONTRIBUTING.md @@ -11,9 +11,13 @@ docker build -t frankenphp-dev -f dev.Dockerfile . docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -p 8080:8080 -p 443:443 -p 443:443/udp -v $PWD:/go/src/app -it frankenphp-dev ``` -Образ содержит стандартные инструменты для разработки (Go, GDB, Valgrind, Neovim и др.). +Образ содержит стандартные инструменты для разработки (Go, GDB, Valgrind, Neovim и др.) и использует следующие пути для настроек PHP -Если версия Docker ниже 23.0, сборка может завершиться ошибкой из-за [проблемы с шаблонами dockerignore](https://github.com/moby/moby/pull/42676). Добавьте в `.dockerignore` следующие директории: +- php.ini: `/etc/frankenphp/php.ini` По умолчанию предоставляется файл php.ini с настройками для разработки. +- дополнительные файлы конфигурации: `/etc/frankenphp/php.d/*.ini` +- расширения php: `/usr/lib/frankenphp/modules/` + +Если ваша версия Docker ниже 23.0, сборка может завершиться ошибкой из-за [проблемы с шаблонами dockerignore](https://github.com/moby/moby/pull/42676). Добавьте в `.dockerignore` следующие директории: ```patch !testdata/*.php diff --git a/docs/tr/CONTRIBUTING.md b/docs/tr/CONTRIBUTING.md index fa4b76f93a..08551a1961 100644 --- a/docs/tr/CONTRIBUTING.md +++ b/docs/tr/CONTRIBUTING.md @@ -11,9 +11,13 @@ docker build -t frankenphp-dev -f dev.Dockerfile . docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -p 8080:8080 -p 443:443 -p 443:443/udp -v $PWD:/go/src/app -it frankenphp-dev ``` -İmaj genel geliştirme araçlarını (Go, GDB, Valgrind, Neovim...) içerir. +İmaj genel geliştirme araçlarını (Go, GDB, Valgrind, Neovim...) içerir ve aşağıdaki php ayar konumlarını kullanır -Docker sürümü 23.0'dan düşükse, derleme dockerignore [pattern issue](https://github.com/moby/moby/pull/42676) tarafından başarısız olur. Dizinleri `.dockerignore` dosyasına ekleyin. +- php.ini: `/etc/frankenphp/php.ini` Varsayılan olarak geliştirme ön ayarlarına sahip bir php.ini dosyası sağlanır. +- ek yapılandırma dosyaları: `/etc/frankenphp/php.d/*.ini` +- php uzantıları: `/usr/lib/frankenphp/modules/` + +Docker sürümünüz 23.0'dan düşükse, derleme dockerignore [pattern issue](https://github.com/moby/moby/pull/42676) nedeniyle başarısız olacaktır. Dizinleri `.dockerignore` dosyasına ekleyin. ```patch !testdata/*.php From 807bc0a8fabe9682077b1fa49bfb49cc506d3af1 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 29 Apr 2025 17:52:26 +0700 Subject: [PATCH 59/75] dashes instead of asterisks in chinese docs --- docs/cn/CONTRIBUTING.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/cn/CONTRIBUTING.md b/docs/cn/CONTRIBUTING.md index ad44e20cee..4f126023bc 100644 --- a/docs/cn/CONTRIBUTING.md +++ b/docs/cn/CONTRIBUTING.md @@ -183,20 +183,20 @@ docker buildx bake -f docker-bake.hcl --pull --no-cache --push ## 其他开发资源 -* [PHP 嵌入 uWSGI](https://github.com/unbit/uwsgi/blob/master/plugins/php/php_plugin.c) -* [PHP 嵌入 NGINX Unit](https://github.com/nginx/unit/blob/master/src/nxt_php_sapi.c) -* [PHP 嵌入 Go (go-php)](https://github.com/deuill/go-php) -* [PHP 嵌入 Go (GoEmPHP)](https://github.com/mikespook/goemphp) -* [PHP 嵌入 C++](https://gist.github.com/paresy/3cbd4c6a469511ac7479aa0e7c42fea7) -* [扩展和嵌入 PHP 作者:Sara Golemon](https://books.google.fr/books?id=zMbGvK17_tYC&pg=PA254&lpg=PA254#v=onepage&q&f=false) -* [TSRMLS_CC到底是什么?](http://blog.golemon.com/2006/06/what-heck-is-tsrmlscc-anyway.html) -* [Mac 上的 PHP 嵌入](https://gist.github.com/jonnywang/61427ffc0e8dde74fff40f479d147db4) -* [SDL 绑定](https://pkg.go.dev/github.com/veandco/go-sdl2@v0.4.21/sdl#Main) +- [PHP 嵌入 uWSGI](https://github.com/unbit/uwsgi/blob/master/plugins/php/php_plugin.c) +- [PHP 嵌入 NGINX Unit](https://github.com/nginx/unit/blob/master/src/nxt_php_sapi.c) +- [PHP 嵌入 Go (go-php)](https://github.com/deuill/go-php) +- [PHP 嵌入 Go (GoEmPHP)](https://github.com/mikespook/goemphp) +- [PHP 嵌入 C++](https://gist.github.com/paresy/3cbd4c6a469511ac7479aa0e7c42fea7) +- [扩展和嵌入 PHP 作者:Sara Golemon](https://books.google.fr/books?id=zMbGvK17_tYC&pg=PA254&lpg=PA254#v=onepage&q&f=false) +- [TSRMLS_CC到底是什么?](http://blog.golemon.com/2006/06/what-heck-is-tsrmlscc-anyway.html) +- [Mac 上的 PHP 嵌入](https://gist.github.com/jonnywang/61427ffc0e8dde74fff40f479d147db4) +- [SDL 绑定](https://pkg.go.dev/github.com/veandco/go-sdl2@v0.4.21/sdl#Main) ## Docker 相关资源 -* [Bake 文件定义](https://docs.docker.com/build/customize/bake/file-definition/) -* [docker buildx 构建](https://docs.docker.com/engine/reference/commandline/buildx_build/) +- [Bake 文件定义](https://docs.docker.com/build/customize/bake/file-definition/) +- [docker buildx 构建](https://docs.docker.com/engine/reference/commandline/buildx_build/) ## 有用的命令 From c3f432c0cfb6464ba6774946fa84dc8497644ef7 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 29 Apr 2025 18:10:48 +0700 Subject: [PATCH 60/75] fix package building --- build-packages.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build-packages.sh b/build-packages.sh index 6ac71df65c..74439ce06e 100755 --- a/build-packages.sh +++ b/build-packages.sh @@ -58,6 +58,7 @@ if [[ ! "${FRANKENPHP_VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then fi mkdir -p package/empty +mkdir -p package/etc [ -f ./dist/static-php-cli/source/php-src/php.ini-production ] && cp -f ./dist/static-php-cli/source/php-src/php.ini-production ./package/etc/php.ini cd dist From 38182897297c47b29230b25f0e8808df944b49ba Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 29 Apr 2025 20:08:08 +0700 Subject: [PATCH 61/75] create frankenphp user in case it doesn't exist for deb packages --- build-packages.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build-packages.sh b/build-packages.sh index 74439ce06e..25eb24a79b 100755 --- a/build-packages.sh +++ b/build-packages.sh @@ -89,6 +89,9 @@ fpm -s dir -t rpm -n frankenphp -v "${FRANKENPHP_VERSION}" \ glibc_version=$(ldd -v "$bin" | awk '/GLIBC_/ {gsub(/[()]/, "", $2); print $2}' | grep -v GLIBC_PRIVATE | sed 's/GLIBC_//' | sort -V | tail -n1) cxxabi_version=$(strings "$bin" | grep -oP 'CXXABI_\d+\.\d+(\.\d+)?' | sed 's/CXXABI_//' | sort -V | tail -n1) +getent group frankenphp || groupadd -r frankenphp +getent passwd frankenphp || useradd -r -g frankenphp frankenphp + fpm -s dir -t deb -n frankenphp -v "${FRANKENPHP_VERSION}" \ --config-files /etc/frankenphp/Caddyfile \ --config-files /etc/frankenphp/php.ini \ From ad59c261e069d974ce57a393d47aac7937271201 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 29 Apr 2025 20:11:46 +0700 Subject: [PATCH 62/75] create users if they don't exist, delete them again if they didn't exist --- build-packages.sh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/build-packages.sh b/build-packages.sh index 25eb24a79b..5291a673e0 100755 --- a/build-packages.sh +++ b/build-packages.sh @@ -57,6 +57,12 @@ if [[ ! "${FRANKENPHP_VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then FRANKENPHP_VERSION=0.0.0 fi +group_preexists=0 +user_preexists=0 + +getent group frankenphp && group_preexists=1 || groupadd -r frankenphp +getent passwd frankenphp && user_preexists=1 || useradd -r -g frankenphp frankenphp + mkdir -p package/empty mkdir -p package/etc [ -f ./dist/static-php-cli/source/php-src/php.ini-production ] && cp -f ./dist/static-php-cli/source/php-src/php.ini-production ./package/etc/php.ini @@ -89,9 +95,6 @@ fpm -s dir -t rpm -n frankenphp -v "${FRANKENPHP_VERSION}" \ glibc_version=$(ldd -v "$bin" | awk '/GLIBC_/ {gsub(/[()]/, "", $2); print $2}' | grep -v GLIBC_PRIVATE | sed 's/GLIBC_//' | sort -V | tail -n1) cxxabi_version=$(strings "$bin" | grep -oP 'CXXABI_\d+\.\d+(\.\d+)?' | sed 's/CXXABI_//' | sort -V | tail -n1) -getent group frankenphp || groupadd -r frankenphp -getent passwd frankenphp || useradd -r -g frankenphp frankenphp - fpm -s dir -t deb -n frankenphp -v "${FRANKENPHP_VERSION}" \ --config-files /etc/frankenphp/Caddyfile \ --config-files /etc/frankenphp/php.ini \ @@ -111,4 +114,7 @@ fpm -s dir -t deb -n frankenphp -v "${FRANKENPHP_VERSION}" \ "../package/empty/=/usr/lib/frankenphp/modules" \ "../package/empty/=/var/lib/frankenphp" +[ "$user_preexists" -eq 0 ] && userdel frankenphp +[ "$group_preexists" -eq 0 ] && groupdel frankenphp + cd .. From a41b9d48aa0e6d1119e443f48be60ed637d53a66 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 29 Apr 2025 20:18:08 +0700 Subject: [PATCH 63/75] satisfy linter --- build-packages.sh | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/build-packages.sh b/build-packages.sh index 5291a673e0..9d81ca5d2a 100755 --- a/build-packages.sh +++ b/build-packages.sh @@ -60,8 +60,17 @@ fi group_preexists=0 user_preexists=0 -getent group frankenphp && group_preexists=1 || groupadd -r frankenphp -getent passwd frankenphp && user_preexists=1 || useradd -r -g frankenphp frankenphp +if getent group frankenphp; then + group_preexists=1 +else + groupadd -r frankenphp +fi + +if getent passwd frankenphp; then + user_preexists=1 +else + useradd -r -g frankenphp frankenphp +fi mkdir -p package/empty mkdir -p package/etc From 1b6ac7f8f3a29ee5d74a51abd2199ec51e29f5fd Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Tue, 29 Apr 2025 20:26:20 +0700 Subject: [PATCH 64/75] create the user with the same commands as the postinst/preinstall scripts --- build-packages.sh | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/build-packages.sh b/build-packages.sh index 9d81ca5d2a..943acf1fba 100755 --- a/build-packages.sh +++ b/build-packages.sh @@ -60,16 +60,22 @@ fi group_preexists=0 user_preexists=0 -if getent group frankenphp; then +if getent group frankenphp >/dev/null; then group_preexists=1 else - groupadd -r frankenphp + groupadd --system frankenphp fi -if getent passwd frankenphp; then +if getent passwd frankenphp >/dev/null; then user_preexists=1 else - useradd -r -g frankenphp frankenphp + useradd --system \ + --gid frankenphp \ + --create-home \ + --home-dir /var/lib/frankenphp \ + --shell /usr/sbin/nologin \ + --comment "FrankenPHP web server" \ + frankenphp fi mkdir -p package/empty From a08911a01fe88e44dd2349a1f9831a89b8c2e359 Mon Sep 17 00:00:00 2001 From: Alliballibaba Date: Wed, 7 May 2025 22:33:43 +0200 Subject: [PATCH 65/75] Removes toolchain requirements. --- go.mod | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.mod b/go.mod index 41d3c5540f..77bf57cab6 100644 --- a/go.mod +++ b/go.mod @@ -2,8 +2,6 @@ module github.com/dunglas/frankenphp go 1.24 -toolchain go1.24.2 - retract v1.0.0-rc.1 // Human error require ( From e68fceac1c576e95987fce6242e66525cd27ba3c Mon Sep 17 00:00:00 2001 From: Alliballibaba Date: Wed, 7 May 2025 22:36:35 +0200 Subject: [PATCH 66/75] trigger From 599c5f814e1b7335d5fce0c4a682aa346967ff40 Mon Sep 17 00:00:00 2001 From: Alliballibaba Date: Wed, 7 May 2025 22:49:57 +0200 Subject: [PATCH 67/75] Removes explicit calls to go get --- Dockerfile | 2 -- alpine.Dockerfile | 2 -- static-builder-gnu.Dockerfile | 2 -- static-builder-musl.Dockerfile | 2 -- 4 files changed, 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index a1e804153f..34b1e5cea0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -93,11 +93,9 @@ RUN curl -s https://api.github.com/repos/e-dant/watcher/releases/latest | \ WORKDIR /go/src/app COPY --link go.mod go.sum ./ -RUN go mod graph | awk '{if ($1 !~ "@") print $2}' | xargs go get WORKDIR /go/src/app/caddy COPY --link caddy/go.mod caddy/go.sum ./ -RUN go mod graph | awk '{if ($1 !~ "@") print $2}' | xargs go get WORKDIR /go/src/app COPY --link . ./ diff --git a/alpine.Dockerfile b/alpine.Dockerfile index 7089ce93a6..dbbe754464 100644 --- a/alpine.Dockerfile +++ b/alpine.Dockerfile @@ -98,11 +98,9 @@ RUN curl -s https://api.github.com/repos/e-dant/watcher/releases/latest | \ WORKDIR /go/src/app COPY --link go.mod go.sum ./ -RUN go mod graph | awk '{if ($1 !~ "@") print $2}' | xargs go get WORKDIR /go/src/app/caddy COPY caddy/go.mod caddy/go.sum ./ -RUN go mod graph | awk '{if ($1 !~ "@") print $2}' | xargs go get WORKDIR /go/src/app COPY --link . ./ diff --git a/static-builder-gnu.Dockerfile b/static-builder-gnu.Dockerfile index f7224114d7..29ced20908 100644 --- a/static-builder-gnu.Dockerfile +++ b/static-builder-gnu.Dockerfile @@ -123,11 +123,9 @@ ENV COMPOSER_ALLOW_SUPERUSER=1 WORKDIR /go/src/app COPY go.mod go.sum ./ -RUN go mod graph | awk '{if ($1 !~ "@") print $2}' | xargs go get WORKDIR /go/src/app/caddy COPY caddy/go.mod caddy/go.sum ./ -RUN go mod graph | awk '{if ($1 !~ "@") print $2}' | xargs go get WORKDIR /go/src/app COPY --link *.* ./ diff --git a/static-builder-musl.Dockerfile b/static-builder-musl.Dockerfile index 3f7ab48327..631a6230bb 100644 --- a/static-builder-musl.Dockerfile +++ b/static-builder-musl.Dockerfile @@ -81,11 +81,9 @@ COPY --from=composer/composer:2-bin /composer /usr/bin/composer WORKDIR /go/src/app COPY go.mod go.sum ./ -RUN go mod graph | awk '{if ($1 !~ "@") print $2}' | xargs go get WORKDIR /go/src/app/caddy COPY caddy/go.mod caddy/go.sum ./ -RUN go mod graph | awk '{if ($1 !~ "@") print $2}' | xargs go get WORKDIR /go/src/app COPY --link . ./ From b840aa14ec79397fcd1e9716a85fa57b6e75e301 Mon Sep 17 00:00:00 2001 From: Alliballibaba Date: Wed, 7 May 2025 22:50:26 +0200 Subject: [PATCH 68/75] trigger From fe951ed25a34e61eb8287b25a4d29ae1c6f0e073 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Thu, 8 May 2025 10:28:32 +0700 Subject: [PATCH 69/75] setcap by default --- package/debian/postinst.sh | 8 +++++++- package/rhel/postinstall.sh | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/package/debian/postinst.sh b/package/debian/postinst.sh index 0f23d867cd..f0c7cabbd1 100755 --- a/package/debian/postinst.sh +++ b/package/debian/postinst.sh @@ -58,4 +58,10 @@ if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-decon fi fi -HOME=~frankenphp frankenphp trust +if command -v setcap >/dev/null 2>&1; then + setcap cap_net_bind_service=+ep /usr/bin/frankenphp || true +fi + +if [ -x /usr/bin/frankenphp ]; then + HOME=/var/lib/frankenphp /usr/bin/frankenphp trust || true +fi diff --git a/package/rhel/postinstall.sh b/package/rhel/postinstall.sh index 087b0cd56a..63c81ee1b9 100755 --- a/package/rhel/postinstall.sh +++ b/package/rhel/postinstall.sh @@ -24,3 +24,6 @@ if [ -x /usr/sbin/semanage ]; then # admin endpoint semanage port --add --type http_port_t --proto tcp 2019 2>/dev/null || : fi +if command -v setcap >/dev/null 2>&1; then + setcap cap_net_bind_service=+ep /usr/bin/frankenphp || : +fi From ee90bca33efc5355a0075543bc312803d64f04f8 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Thu, 8 May 2025 11:10:40 +0700 Subject: [PATCH 70/75] simplify example project --- package/Caddyfile | 48 +++--------------- package/content/{public => }/assets/caddy.png | Bin package/content/assets/frankenphp.svg | 1 + package/content/{example.php => index.php} | 15 +----- package/content/public/assets/frankenphp.png | Bin 180566 -> 0 bytes package/content/public/index.php | 14 ----- 6 files changed, 11 insertions(+), 67 deletions(-) rename package/content/{public => }/assets/caddy.png (100%) create mode 100644 package/content/assets/frankenphp.svg rename package/content/{example.php => index.php} (88%) delete mode 100644 package/content/public/assets/frankenphp.png delete mode 100644 package/content/public/index.php diff --git a/package/Caddyfile b/package/Caddyfile index 92acfc1db8..0a38e26b3e 100644 --- a/package/Caddyfile +++ b/package/Caddyfile @@ -3,49 +3,17 @@ # https://frankenphp.dev/docs/config # https://caddyserver.com/docs/caddyfile { - {$CADDY_GLOBAL_OPTIONS} - - frankenphp { - worker /usr/share/frankenphp/public/index.php - {$FRANKENPHP_CONFIG} - } + frankenphp } -{$CADDY_EXTRA_CONFIG} - -{$SERVER_NAME:localhost} { - #log { - # # Redact the authorization query parameter that can be set by Mercure - # format filter { - # request>uri query { - # replace authorization REDACTED - # } - # } - #} - - root /usr/share/frankenphp/public/ +localhost { + root /usr/share/frankenphp/ encode zstd br gzip - # Uncomment the following lines to enable Mercure and Vulcain modules - #mercure { - # # Transport to use (default to Bolt) - # transport bolt { - # mercure.db - # } - # # Publisher JWT key - # publisher_jwt {env.MERCURE_PUBLISHER_JWT_KEY} {env.MERCURE_PUBLISHER_JWT_ALG} - # # Subscriber JWT key - # subscriber_jwt {env.MERCURE_SUBSCRIBER_JWT_KEY} {env.MERCURE_SUBSCRIBER_JWT_ALG} - # # Allow anonymous subscribers (double-check that it's what you want) - # anonymous - # # Enable the subscription API (double-check that it's what you want) - # subscriptions - # # Extra directives - # {$MERCURE_EXTRA_DIRECTIVES} - #} - #vulcain - - {$CADDY_SERVER_EXTRA_DIRECTIVES} - php_server } + +# As an alternative to editing the above site block, you can add your own site +# block files in the Caddyfile.d directory, and they will be included as long +# as they use the .caddyfile extension. +import Caddyfile.d/*.caddyfile diff --git a/package/content/public/assets/caddy.png b/package/content/assets/caddy.png similarity index 100% rename from package/content/public/assets/caddy.png rename to package/content/assets/caddy.png diff --git a/package/content/assets/frankenphp.svg b/package/content/assets/frankenphp.svg new file mode 100644 index 0000000000..afbd5cba5b --- /dev/null +++ b/package/content/assets/frankenphp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/package/content/example.php b/package/content/index.php similarity index 88% rename from package/content/example.php rename to package/content/index.php index d7beda57ca..0221739a2f 100644 --- a/package/content/example.php +++ b/package/content/index.php @@ -1,8 +1,3 @@ - - @@ -93,11 +88,6 @@

FrankenPHP Test Page

-
-

This page confirms that the HTTP server powered by FrankenPHP (via the Caddy web server) is operating correctly on this system.

-
-
-

If you are a visitor:

@@ -122,12 +112,11 @@

Configuration is handled in your Caddyfile. Make sure your root and php_server directives are properly set for your site.

- Requests handled:
- Last request time: microseconds + Served by PHP SAPI:
- [ Powered by FrankenPHP ] + [ Powered by FrankenPHP ] [ Powered by Caddy ]
diff --git a/package/content/public/assets/frankenphp.png b/package/content/public/assets/frankenphp.png deleted file mode 100644 index fa527b8f0df40449684637273375fdeb1963d0d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180566 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 KKuF!@&i?@S-8p3d diff --git a/package/content/public/index.php b/package/content/public/index.php deleted file mode 100644 index 4118cd6b4f..0000000000 --- a/package/content/public/index.php +++ /dev/null @@ -1,14 +0,0 @@ - Date: Thu, 8 May 2025 11:50:36 +0700 Subject: [PATCH 71/75] bring page more in line with the caddy / apache / nginx default page --- package/Caddyfile | 2 +- package/content/index.php | 20 ++++++++++++-------- package/rhel/postinstall.sh | 7 +++++++ 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/package/Caddyfile b/package/Caddyfile index 0a38e26b3e..a2e410114d 100644 --- a/package/Caddyfile +++ b/package/Caddyfile @@ -6,7 +6,7 @@ frankenphp } -localhost { +http://, https:// { root /usr/share/frankenphp/ encode zstd br gzip diff --git a/package/content/index.php b/package/content/index.php index 0221739a2f..8eaebb667c 100644 --- a/package/content/index.php +++ b/package/content/index.php @@ -90,26 +90,29 @@ diff --git a/package/rhel/postinstall.sh b/package/rhel/postinstall.sh index 63c81ee1b9..1d227c7491 100755 --- a/package/rhel/postinstall.sh +++ b/package/rhel/postinstall.sh @@ -9,6 +9,7 @@ if [ -x /usr/sbin/getsebool ]; then # Connect to ACME endpoint to request certificates setsebool -P httpd_can_network_connect on fi + if [ -x /usr/sbin/semanage ] && [ -x /usr/sbin/restorecon ]; then # file contexts semanage fcontext --add --type httpd_exec_t '/usr/bin/frankenphp' 2>/dev/null || : @@ -17,6 +18,7 @@ if [ -x /usr/sbin/semanage ] && [ -x /usr/sbin/restorecon ]; then semanage fcontext --add --type httpd_var_lib_t '/var/lib/frankenphp(/.*)?' 2>/dev/null || : restorecon -r /usr/bin/frankenphp /usr/share/frankenphp /etc/frankenphp /var/lib/frankenphp || : fi + if [ -x /usr/sbin/semanage ]; then # QUIC semanage port --add --type http_port_t --proto udp 80 2>/dev/null || : @@ -24,6 +26,11 @@ if [ -x /usr/sbin/semanage ]; then # admin endpoint semanage port --add --type http_port_t --proto tcp 2019 2>/dev/null || : fi + if command -v setcap >/dev/null 2>&1; then setcap cap_net_bind_service=+ep /usr/bin/frankenphp || : fi + +if [ -x /usr/bin/frankenphp ]; then + HOME=/var/lib/frankenphp /usr/bin/frankenphp trust || : +fi From 6e20fa4b78a6d2202d365f62010317336a90360e Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Thu, 8 May 2025 15:47:36 +0700 Subject: [PATCH 72/75] update to html 5 --- package/content/index.php | 103 +++++++++++++++++++++++--------------- 1 file changed, 62 insertions(+), 41 deletions(-) diff --git a/package/content/index.php b/package/content/index.php index 8eaebb667c..1a03b46826 100644 --- a/package/content/index.php +++ b/package/content/index.php @@ -1,23 +1,26 @@ - - - + + - Test Page for FrankenPHP on AlmaLinux - - -

FrankenPHP Test Page

+
+

FrankenPHP Test Page

+
-
+
-
+

If you are a member of the general public:

The fact that you are seeing this page indicates that the website you just visited is either experiencing problems, or is undergoing routine maintenance.

@@ -99,35 +121,34 @@ In general, mail sent to the name "webmaster" and directed to the website's domain should reach the appropriate person.

-

For example, try contacting webmaster@.

+

For example, try contacting webmaster@.

Learn more about FrankenPHP at the official website.

-
-
+ -
+

If you are the website administrator:

Your server is running and serving requests using FrankenPHP, powered by Caddy

To replace this page, deploy your application files to .

-

Configuration is handled in your Caddyfile. +

Configuration is handled in your Caddyfile.

Served by PHP SAPI:
- [ Powered by FrankenPHP ] - [ Powered by Caddy ] + Powered by FrankenPHP + Powered by Caddy
-
-
+
-
- + + +
+

FrankenPHP is an open-source web server for PHP built on top of Caddy.

+
- + \ No newline at end of file From 6a809395715896f9187710c60a6efd627bacf54b Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Thu, 8 May 2025 15:52:10 +0700 Subject: [PATCH 73/75] oopsies --- package/content/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/content/index.php b/package/content/index.php index 1a03b46826..0279d4ef23 100644 --- a/package/content/index.php +++ b/package/content/index.php @@ -136,7 +136,7 @@

Configuration is handled in your Caddyfile.

- Served by PHP SAPI:
+ Served by PHP SAPI:
From 6a6f31d329c71c4b54280e7cad10f82672d36791 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Thu, 8 May 2025 15:58:54 +0700 Subject: [PATCH 74/75] revert style to original --- package/content/index.php | 57 +++++++++++++-------------------------- 1 file changed, 18 insertions(+), 39 deletions(-) diff --git a/package/content/index.php b/package/content/index.php index 0279d4ef23..3f59ffac9f 100644 --- a/package/content/index.php +++ b/package/content/index.php @@ -2,25 +2,21 @@ - Test Page for FrankenPHP From 5161021a1d3a076fb3e04543918428b359208da8 Mon Sep 17 00:00:00 2001 From: DubbleClick Date: Fri, 9 May 2025 08:42:25 +0700 Subject: [PATCH 75/75] remove https:// (caddy uses http:// on RHEL, :80 on Debian) --- package/Caddyfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/Caddyfile b/package/Caddyfile index a2e410114d..506a6c19bb 100644 --- a/package/Caddyfile +++ b/package/Caddyfile @@ -6,7 +6,7 @@ frankenphp } -http://, https:// { +http:// { root /usr/share/frankenphp/ encode zstd br gzip
-

If you are the administrator:

+

If you are the website administrator:

-

Your server is running and serving requests using FrankenPHP, integrated as a module within Caddy.

+

Your server is running and serving requests using FrankenPHP, powered by Caddy

-

To replace this page, simply deploy your application files to the configured web root directory in your Caddy setup. If you’re using PHP, FrankenPHP will handle it natively.

+

To replace this page, deploy your application files to .

-

Configuration is handled in your Caddyfile. Make sure your root and php_server directives are properly set for your site.

+

Configuration is handled in your Caddyfile.

Served by PHP SAPI:
@@ -119,6 +122,7 @@ [ Powered by FrankenPHP ] [ Powered by Caddy ]
+