diff --git a/.circleci/.env_8.0-shared.ci b/.circleci/.env_8.0-shared.ci
index f31cdae6b..804586d37 100644
--- a/.circleci/.env_8.0-shared.ci
+++ b/.circleci/.env_8.0-shared.ci
@@ -1,9 +1,10 @@
#!/usr/bin/env make
PHP_VERSION=8.0
+WITH_SOURCEMAPS=0
+ASSERTIONS=0
OPTIMIZE=2
-BROTLI=0
-GZIP=0
+SYMBOLS=0
WITH_BCMATH=1
WITH_CALENDAR=1
@@ -14,10 +15,13 @@ WITH_TOKENIZER=1
WITH_PHAR=static
-WITH_LIBXML=static
-WITH_DOM=static
-WITH_XML=static
-WITH_SIMPLEXML=static
+WITH_LIBXML=shared
+WITH_DOM=dynamic
+WITH_XML=dynamic
+WITH_SIMPLEXML=dynamic
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
+WITH_TIDY=shared
WITH_LIBZIP=shared
WITH_ICONV=shared
@@ -28,13 +32,14 @@ WITH_ZLIB=shared
WITH_LIBPNG=shared
WITH_FREETYPE=shared
WITH_LIBJPEG=shared
+WITH_LIBWEBP=shared
WITH_YAML=shared
-WITH_TIDY=shared
WITH_MBSTRING=static
WITH_ONIGURUMA=shared
WITH_OPENSSL=shared
WITH_INTL=shared
+WITH_WAITLINE=1
WITH_PDO_PGLITE=0
-WITH_VRZNO=0
+WITH_VRZNO=1
diff --git a/.circleci/.env_8.1-shared.ci b/.circleci/.env_8.1-shared.ci
index e4a0629f9..5b0a19522 100644
--- a/.circleci/.env_8.1-shared.ci
+++ b/.circleci/.env_8.1-shared.ci
@@ -1,9 +1,10 @@
#!/usr/bin/env make
PHP_VERSION=8.1
+WITH_SOURCEMAPS=0
+ASSERTIONS=0
OPTIMIZE=2
-BROTLI=0
-GZIP=0
+SYMBOLS=0
WITH_BCMATH=1
WITH_CALENDAR=1
@@ -14,10 +15,13 @@ WITH_TOKENIZER=1
WITH_PHAR=static
-WITH_LIBXML=static
-WITH_DOM=static
-WITH_XML=static
-WITH_SIMPLEXML=static
+WITH_LIBXML=shared
+WITH_DOM=dynamic
+WITH_XML=dynamic
+WITH_SIMPLEXML=dynamic
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
+WITH_TIDY=shared
WITH_LIBZIP=shared
WITH_ICONV=shared
@@ -28,10 +32,12 @@ WITH_ZLIB=shared
WITH_LIBPNG=shared
WITH_FREETYPE=shared
WITH_LIBJPEG=shared
+WITH_LIBWEBP=shared
WITH_YAML=shared
-WITH_TIDY=shared
WITH_MBSTRING=static
WITH_ONIGURUMA=shared
WITH_OPENSSL=shared
WITH_INTL=shared
+
+WITH_WAITLINE=1
diff --git a/.circleci/.env_8.2-shared.ci b/.circleci/.env_8.2-shared.ci
index 039f1f6a8..cc0ce1806 100644
--- a/.circleci/.env_8.2-shared.ci
+++ b/.circleci/.env_8.2-shared.ci
@@ -1,9 +1,10 @@
#!/usr/bin/env make
PHP_VERSION=8.2
+WITH_SOURCEMAPS=0
+ASSERTIONS=0
OPTIMIZE=2
-BROTLI=0
-GZIP=0
+SYMBOLS=0
WITH_BCMATH=1
WITH_CALENDAR=1
@@ -14,10 +15,13 @@ WITH_TOKENIZER=1
WITH_PHAR=static
-WITH_LIBXML=static
-WITH_DOM=static
-WITH_XML=static
-WITH_SIMPLEXML=static
+WITH_LIBXML=shared
+WITH_DOM=dynamic
+WITH_XML=dynamic
+WITH_SIMPLEXML=dynamic
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
+WITH_TIDY=shared
WITH_LIBZIP=shared
WITH_ICONV=shared
@@ -28,10 +32,12 @@ WITH_ZLIB=shared
WITH_LIBPNG=shared
WITH_FREETYPE=shared
WITH_LIBJPEG=shared
+WITH_LIBWEBP=shared
WITH_YAML=shared
-WITH_TIDY=shared
WITH_MBSTRING=static
WITH_ONIGURUMA=shared
WITH_OPENSSL=shared
WITH_INTL=shared
+
+WITH_WAITLINE=1
diff --git a/.circleci/.env_8.3-shared.ci b/.circleci/.env_8.3-shared.ci
index e8a79a8cf..1d11f27da 100644
--- a/.circleci/.env_8.3-shared.ci
+++ b/.circleci/.env_8.3-shared.ci
@@ -1,9 +1,10 @@
#!/usr/bin/env make
PHP_VERSION=8.3
+WITH_SOURCEMAPS=0
+ASSERTIONS=0
OPTIMIZE=2
-BROTLI=0
-GZIP=0
+SYMBOLS=0
WITH_BCMATH=1
WITH_CALENDAR=1
@@ -14,10 +15,13 @@ WITH_TOKENIZER=1
WITH_PHAR=static
-WITH_LIBXML=static
-WITH_DOM=static
-WITH_XML=static
-WITH_SIMPLEXML=static
+WITH_LIBXML=shared
+WITH_DOM=dynamic
+WITH_XML=dynamic
+WITH_SIMPLEXML=dynamic
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
+WITH_TIDY=shared
WITH_LIBZIP=shared
WITH_ICONV=shared
@@ -28,10 +32,12 @@ WITH_ZLIB=shared
WITH_LIBPNG=shared
WITH_FREETYPE=shared
WITH_LIBJPEG=shared
+WITH_LIBWEBP=shared
WITH_YAML=shared
-WITH_TIDY=shared
WITH_MBSTRING=static
WITH_ONIGURUMA=shared
WITH_OPENSSL=shared
WITH_INTL=shared
+
+WITH_WAITLINE=1
diff --git a/.circleci/.env_8.4-shared.ci b/.circleci/.env_8.4-shared.ci
index 8654e379f..db238f9b9 100644
--- a/.circleci/.env_8.4-shared.ci
+++ b/.circleci/.env_8.4-shared.ci
@@ -1,9 +1,10 @@
#!/usr/bin/env make
PHP_VERSION=8.4
+WITH_SOURCEMAPS=0
+ASSERTIONS=0
OPTIMIZE=2
-BROTLI=0
-GZIP=0
+SYMBOLS=0
WITH_BCMATH=1
WITH_CALENDAR=1
@@ -14,10 +15,13 @@ WITH_TOKENIZER=1
WITH_PHAR=static
-WITH_LIBXML=static
-WITH_DOM=static
-WITH_XML=static
-WITH_SIMPLEXML=static
+WITH_LIBXML=shared
+WITH_DOM=dynamic
+WITH_XML=dynamic
+WITH_SIMPLEXML=dynamic
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
+WITH_TIDY=shared
WITH_LIBZIP=shared
WITH_ICONV=shared
@@ -28,10 +32,12 @@ WITH_ZLIB=shared
WITH_LIBPNG=shared
WITH_FREETYPE=shared
WITH_LIBJPEG=shared
+WITH_LIBWEBP=shared
WITH_YAML=shared
-WITH_TIDY=shared
WITH_MBSTRING=static
WITH_ONIGURUMA=shared
WITH_OPENSSL=shared
WITH_INTL=shared
+
+WITH_WAITLINE=1
diff --git a/.circleci/.env_8.5-dynamic.ci b/.circleci/.env_8.5-dynamic.ci
new file mode 100644
index 000000000..f7ad41dd6
--- /dev/null
+++ b/.circleci/.env_8.5-dynamic.ci
@@ -0,0 +1,37 @@
+#!/usr/bin/env make
+PHP_VERSION=8.5
+
+OPTIMIZE=2
+BROTLI=0
+GZIP=0
+
+WITH_BCMATH=1
+WITH_CALENDAR=1
+WITH_CTYPE=1
+WITH_EXIF=1
+WITH_FILTER=1
+WITH_TOKENIZER=1
+
+WITH_PHAR=dynamic
+
+WITH_LIBXML=dynamic
+WITH_DOM=dynamic
+WITH_XML=dynamic
+WITH_SIMPLEXML=dynamic
+
+WITH_LIBZIP=dynamic
+WITH_ICONV=dynamic
+WITH_SQLITE=dynamic
+
+WITH_GD=dynamic
+WITH_ZLIB=dynamic
+WITH_LIBPNG=shared
+WITH_FREETYPE=shared
+WITH_LIBJPEG=shared
+
+WITH_YAML=dynamic
+WITH_TIDY=dynamic
+WITH_MBSTRING=dynamic
+WITH_ONIGURUMA=dynamic
+WITH_OPENSSL=dynamic
+WITH_INTL=dynamic
diff --git a/.circleci/.env_8.5-shared.ci b/.circleci/.env_8.5-shared.ci
new file mode 100644
index 000000000..79a8c8e8e
--- /dev/null
+++ b/.circleci/.env_8.5-shared.ci
@@ -0,0 +1,43 @@
+#!/usr/bin/env make
+PHP_VERSION=8.5
+
+WITH_SOURCEMAPS=0
+ASSERTIONS=0
+OPTIMIZE=2
+SYMBOLS=0
+
+WITH_BCMATH=1
+WITH_CALENDAR=1
+WITH_CTYPE=1
+WITH_EXIF=1
+WITH_FILTER=1
+WITH_TOKENIZER=1
+
+WITH_PHAR=static
+
+WITH_LIBXML=shared
+WITH_DOM=dynamic
+WITH_XML=dynamic
+WITH_SIMPLEXML=dynamic
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
+WITH_TIDY=shared
+
+WITH_LIBZIP=shared
+WITH_ICONV=shared
+WITH_SQLITE=shared
+
+WITH_GD=static
+WITH_ZLIB=shared
+WITH_LIBPNG=shared
+WITH_FREETYPE=shared
+WITH_LIBJPEG=shared
+WITH_LIBWEBP=shared
+
+WITH_YAML=shared
+WITH_MBSTRING=static
+WITH_ONIGURUMA=shared
+WITH_OPENSSL=shared
+WITH_INTL=shared
+
+WITH_WAITLINE=1
diff --git a/.circleci/.env_8.5.ci b/.circleci/.env_8.5.ci
new file mode 100644
index 000000000..afe70f94c
--- /dev/null
+++ b/.circleci/.env_8.5.ci
@@ -0,0 +1,38 @@
+#!/usr/bin/env make
+PHP_VERSION=8.5
+
+OPTIMIZE=2
+BROTLI=0
+GZIP=0
+
+WITH_BCMATH=1
+WITH_CALENDAR=1
+WITH_CTYPE=1
+WITH_EXIF=1
+WITH_FILTER=1
+WITH_MBSTRING=1
+WITH_PHAR=1
+WITH_TOKENIZER=1
+
+WITH_LIBXML=1
+WITH_DOM=1
+WITH_XML=1
+WITH_SIMPLEXML=1
+
+WITH_LIBZIP=1
+WITH_ICONV=1
+WITH_SQLITE=1
+WITH_VRZNO=1
+
+WITH_EXIF=1
+WITH_GD=1
+WITH_ZLIB=1
+WITH_LIBPNG=1
+WITH_FREETYPE=1
+WITH_LIBJPEG=1
+
+WITH_YAML=1
+WITH_TIDY=1
+WITH_ONIGURUMA=1
+WITH_OPENSSL=1
+WITH_INTL=1
diff --git a/.cloudflare/pages/functions/[[path]].js b/.cloudflare/pages/functions/[[path]].js
index 10aaf1538..7bcde13ce 100644
--- a/.cloudflare/pages/functions/[[path]].js
+++ b/.cloudflare/pages/functions/[[path]].js
@@ -31,12 +31,43 @@ export const onRequest = async (context) => {
return new Response("Not found", { status: 404 });
}
- // return new Response(JSON.stringify({key, exists: !isMissing(obj), obj}));
-
- return new Response(obj.body, {
- headers: {
- "Content-Type": obj.httpMetadata?.contentType || "application/octet-stream",
- "Access-Control-Allow-Origin": "*",
- },
- });
+ // Preserve original content-type for use after negotiating compression
+ const originalContentType = obj.httpMetadata?.contentType || "application/octet-stream";
+
+ // Negotiate pre-compressed variants: Brotli preferred, then gzip
+ const acceptEncoding = context.request.headers.get("Accept-Encoding") || "";
+ let encoding;
+
+ if (acceptEncoding.includes("br")) {
+ const brKey = key + ".br";
+ const brObj = await context.env.NIGHTLY_BUILDS.get(brKey);
+ if (!isMissing(brObj)) {
+ obj = brObj;
+ encoding = "br";
+ }
+ }
+
+ // Fallback to gzip if supported
+ if (!encoding && acceptEncoding.includes("gzip")) {
+ const gzKey = key + ".gz";
+ const gzObj = await context.env.NIGHTLY_BUILDS.get(gzKey);
+ if (!isMissing(gzObj)) {
+ obj = gzObj;
+ encoding = "gzip";
+ }
+ }
+
+ console.log({originalContentType, encoding});
+
+ const headers = {
+ "Content-Type": originalContentType,
+ "Access-Control-Allow-Origin": "*",
+ };
+ if (encoding) {
+ headers["Content-Encoding"] = encoding;
+ headers["Cache-Control"] = "no-transform";
+ headers["Vary"] = "Accept-Encoding";
+ }
+
+ return new Response(obj.body, { headers, encodeBody: "manual" });
};
diff --git a/.editorconfig b/.editorconfig
index f3f9e9904..5d7e727c9 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -29,3 +29,6 @@ indent_style = space
[*.json]
indent_size = 2
indent_style = space
+
+[test/browser/browser.spec.mjs-snapshots/*.json]
+insert_final_newline = false
diff --git a/.github/.env_8.0.dynamic.ci b/.github/.env_8.0.dynamic.ci
index 6427443b1..341738cdc 100644
--- a/.github/.env_8.0.dynamic.ci
+++ b/.github/.env_8.0.dynamic.ci
@@ -6,5 +6,8 @@ ASSERTIONS=0
OPTIMIZE=3
SYMBOLS=0
+WITH_WAITLINE=1
WITH_PDO_PGLITE=0
-WITH_VRZNO=0
+WITH_VRZNO=1
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
diff --git a/.github/.env_8.0.shared.ci b/.github/.env_8.0.shared.ci
index e18d699ca..cc59cd409 100644
--- a/.github/.env_8.0.shared.ci
+++ b/.github/.env_8.0.shared.ci
@@ -19,6 +19,8 @@ WITH_LIBXML=shared
WITH_DOM=dynamic
WITH_XML=dynamic
WITH_SIMPLEXML=dynamic
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
WITH_TIDY=shared
WITH_LIBZIP=shared
@@ -38,5 +40,6 @@ WITH_ONIGURUMA=shared
WITH_OPENSSL=shared
WITH_INTL=shared
+WITH_WAITLINE=1
WITH_PDO_PGLITE=0
-WITH_VRZNO=0
+WITH_VRZNO=1
diff --git a/.github/.env_8.0.static.ci b/.github/.env_8.0.static.ci
index 0b70ab7ab..2303d0ad0 100644
--- a/.github/.env_8.0.static.ci
+++ b/.github/.env_8.0.static.ci
@@ -19,6 +19,8 @@ WITH_LIBXML=static
WITH_DOM=static
WITH_XML=static
WITH_SIMPLEXML=static
+WITH_XMLREADER=static
+WITH_XMLWRITER=static
WITH_TIDY=static
WITH_LIBZIP=static
@@ -35,8 +37,9 @@ WITH_LIBWEBP=static
WITH_YAML=static
WITH_MBSTRING=static
WITH_ONIGURUMA=static
-WITH_OPENSSL=1
+WITH_OPENSSL=static
WITH_INTL=static
+WITH_WAITLINE=1
WITH_PDO_PGLITE=0
-WITH_VRZNO=0
+WITH_VRZNO=1
diff --git a/.github/.env_8.1.dynamic.ci b/.github/.env_8.1.dynamic.ci
index 22ad9aa90..189d1a105 100644
--- a/.github/.env_8.1.dynamic.ci
+++ b/.github/.env_8.1.dynamic.ci
@@ -5,3 +5,7 @@ WITH_SOURCEMAPS=0
ASSERTIONS=0
OPTIMIZE=3
SYMBOLS=0
+
+WITH_WAITLINE=1
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
diff --git a/.github/.env_8.1.shared.ci b/.github/.env_8.1.shared.ci
index 02ebb2388..b88819ca6 100644
--- a/.github/.env_8.1.shared.ci
+++ b/.github/.env_8.1.shared.ci
@@ -19,6 +19,8 @@ WITH_LIBXML=shared
WITH_DOM=dynamic
WITH_XML=dynamic
WITH_SIMPLEXML=dynamic
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
WITH_TIDY=shared
WITH_LIBZIP=shared
@@ -37,3 +39,5 @@ WITH_MBSTRING=static
WITH_ONIGURUMA=shared
WITH_OPENSSL=shared
WITH_INTL=shared
+
+WITH_WAITLINE=1
diff --git a/.github/.env_8.1.static.ci b/.github/.env_8.1.static.ci
index 1cb5d5d2d..1019e6cd2 100644
--- a/.github/.env_8.1.static.ci
+++ b/.github/.env_8.1.static.ci
@@ -19,6 +19,8 @@ WITH_LIBXML=static
WITH_DOM=static
WITH_XML=static
WITH_SIMPLEXML=static
+WITH_XMLREADER=static
+WITH_XMLWRITER=static
WITH_TIDY=static
WITH_LIBZIP=static
@@ -35,5 +37,7 @@ WITH_LIBWEBP=static
WITH_YAML=static
WITH_MBSTRING=static
WITH_ONIGURUMA=static
-WITH_OPENSSL=1
+WITH_OPENSSL=static
WITH_INTL=static
+
+WITH_WAITLINE=1
diff --git a/.github/.env_8.2.dynamic.ci b/.github/.env_8.2.dynamic.ci
index 23589edcb..94456f8d8 100644
--- a/.github/.env_8.2.dynamic.ci
+++ b/.github/.env_8.2.dynamic.ci
@@ -5,3 +5,7 @@ WITH_SOURCEMAPS=0
ASSERTIONS=0
OPTIMIZE=3
SYMBOLS=0
+
+WITH_WAITLINE=1
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
diff --git a/.github/.env_8.2.shared.ci b/.github/.env_8.2.shared.ci
index a98792071..e2aa53d5e 100644
--- a/.github/.env_8.2.shared.ci
+++ b/.github/.env_8.2.shared.ci
@@ -19,6 +19,8 @@ WITH_LIBXML=shared
WITH_DOM=dynamic
WITH_XML=dynamic
WITH_SIMPLEXML=dynamic
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
WITH_TIDY=shared
WITH_LIBZIP=shared
@@ -37,3 +39,5 @@ WITH_MBSTRING=static
WITH_ONIGURUMA=shared
WITH_OPENSSL=shared
WITH_INTL=shared
+
+WITH_WAITLINE=1
diff --git a/.github/.env_8.2.static.ci b/.github/.env_8.2.static.ci
index 9f936d7ab..53c027667 100644
--- a/.github/.env_8.2.static.ci
+++ b/.github/.env_8.2.static.ci
@@ -19,6 +19,8 @@ WITH_LIBXML=static
WITH_DOM=static
WITH_XML=static
WITH_SIMPLEXML=static
+WITH_XMLREADER=static
+WITH_XMLWRITER=static
WITH_TIDY=static
WITH_LIBZIP=static
@@ -35,5 +37,7 @@ WITH_LIBWEBP=static
WITH_YAML=static
WITH_MBSTRING=static
WITH_ONIGURUMA=static
-WITH_OPENSSL=1
+WITH_OPENSSL=static
WITH_INTL=static
+
+WITH_WAITLINE=1
diff --git a/.github/.env_8.3.dynamic.ci b/.github/.env_8.3.dynamic.ci
index 48a512900..dcb6a6b4b 100644
--- a/.github/.env_8.3.dynamic.ci
+++ b/.github/.env_8.3.dynamic.ci
@@ -5,3 +5,7 @@ WITH_SOURCEMAPS=0
ASSERTIONS=0
OPTIMIZE=3
SYMBOLS=0
+
+WITH_WAITLINE=1
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
diff --git a/.github/.env_8.3.shared.ci b/.github/.env_8.3.shared.ci
index 2d517356b..cba12935d 100644
--- a/.github/.env_8.3.shared.ci
+++ b/.github/.env_8.3.shared.ci
@@ -19,6 +19,8 @@ WITH_LIBXML=shared
WITH_DOM=dynamic
WITH_XML=dynamic
WITH_SIMPLEXML=dynamic
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
WITH_TIDY=shared
WITH_LIBZIP=shared
@@ -37,3 +39,5 @@ WITH_MBSTRING=static
WITH_ONIGURUMA=shared
WITH_OPENSSL=shared
WITH_INTL=shared
+
+WITH_WAITLINE=1
diff --git a/.github/.env_8.3.static.ci b/.github/.env_8.3.static.ci
index 1e41bd621..78144b7be 100644
--- a/.github/.env_8.3.static.ci
+++ b/.github/.env_8.3.static.ci
@@ -19,6 +19,8 @@ WITH_LIBXML=static
WITH_DOM=static
WITH_XML=static
WITH_SIMPLEXML=static
+WITH_XMLREADER=static
+WITH_XMLWRITER=static
WITH_TIDY=static
WITH_LIBZIP=static
@@ -35,7 +37,7 @@ WITH_LIBWEBP=static
WITH_YAML=static
WITH_MBSTRING=static
WITH_ONIGURUMA=static
-WITH_OPENSSL=1
+WITH_OPENSSL=static
WITH_INTL=static
-
+WITH_WAITLINE=1
diff --git a/.github/.env_8.4.dynamic.ci b/.github/.env_8.4.dynamic.ci
index 3566fed86..a8f6abf95 100644
--- a/.github/.env_8.4.dynamic.ci
+++ b/.github/.env_8.4.dynamic.ci
@@ -5,3 +5,7 @@ WITH_SOURCEMAPS=0
ASSERTIONS=0
OPTIMIZE=3
SYMBOLS=0
+
+WITH_WAITLINE=1
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
diff --git a/.github/.env_8.4.shared.ci b/.github/.env_8.4.shared.ci
index 12793d44e..562228c30 100644
--- a/.github/.env_8.4.shared.ci
+++ b/.github/.env_8.4.shared.ci
@@ -19,6 +19,8 @@ WITH_LIBXML=shared
WITH_DOM=dynamic
WITH_XML=dynamic
WITH_SIMPLEXML=dynamic
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
WITH_TIDY=shared
WITH_LIBZIP=shared
@@ -37,3 +39,5 @@ WITH_MBSTRING=static
WITH_ONIGURUMA=shared
WITH_OPENSSL=shared
WITH_INTL=shared
+
+WITH_WAITLINE=1
diff --git a/.github/.env_8.4.static.ci b/.github/.env_8.4.static.ci
index 2a55a8df5..71ac9a0bb 100644
--- a/.github/.env_8.4.static.ci
+++ b/.github/.env_8.4.static.ci
@@ -19,6 +19,8 @@ WITH_LIBXML=static
WITH_DOM=static
WITH_XML=static
WITH_SIMPLEXML=static
+WITH_XMLREADER=static
+WITH_XMLWRITER=static
WITH_TIDY=static
WITH_LIBZIP=static
@@ -35,5 +37,7 @@ WITH_LIBWEBP=static
WITH_YAML=static
WITH_MBSTRING=static
WITH_ONIGURUMA=static
-WITH_OPENSSL=1
+WITH_OPENSSL=static
WITH_INTL=static
+
+WITH_WAITLINE=1
diff --git a/.github/.env_8.5.dynamic.ci b/.github/.env_8.5.dynamic.ci
new file mode 100644
index 000000000..b15b02bb6
--- /dev/null
+++ b/.github/.env_8.5.dynamic.ci
@@ -0,0 +1,11 @@
+#!/usr/bin/env make
+PHP_VERSION=8.5
+
+WITH_SOURCEMAPS=0
+ASSERTIONS=0
+OPTIMIZE=3
+SYMBOLS=0
+
+WITH_WAITLINE=1
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
diff --git a/.github/.env_8.5.shared.ci b/.github/.env_8.5.shared.ci
new file mode 100644
index 000000000..239123385
--- /dev/null
+++ b/.github/.env_8.5.shared.ci
@@ -0,0 +1,43 @@
+#!/usr/bin/env make
+PHP_VERSION=8.5
+
+WITH_SOURCEMAPS=0
+ASSERTIONS=0
+OPTIMIZE=3
+SYMBOLS=0
+
+WITH_BCMATH=1
+WITH_CALENDAR=1
+WITH_CTYPE=1
+WITH_EXIF=1
+WITH_FILTER=1
+WITH_TOKENIZER=1
+
+WITH_PHAR=static
+
+WITH_LIBXML=shared
+WITH_DOM=dynamic
+WITH_XML=dynamic
+WITH_SIMPLEXML=dynamic
+WITH_XMLREADER=dynamic
+WITH_XMLWRITER=dynamic
+WITH_TIDY=shared
+
+WITH_LIBZIP=shared
+WITH_ICONV=shared
+WITH_SQLITE=shared
+
+WITH_GD=static
+WITH_ZLIB=shared
+WITH_LIBPNG=shared
+WITH_FREETYPE=shared
+WITH_LIBJPEG=shared
+WITH_LIBWEBP=shared
+
+WITH_YAML=shared
+WITH_MBSTRING=static
+WITH_ONIGURUMA=shared
+WITH_OPENSSL=shared
+WITH_INTL=shared
+
+WITH_WAITLINE=1
diff --git a/.github/.env_8.5.static.ci b/.github/.env_8.5.static.ci
new file mode 100644
index 000000000..85a80c69f
--- /dev/null
+++ b/.github/.env_8.5.static.ci
@@ -0,0 +1,43 @@
+#!/usr/bin/env make
+PHP_VERSION=8.5
+
+WITH_SOURCEMAPS=0
+ASSERTIONS=0
+OPTIMIZE=3
+SYMBOLS=0
+
+WITH_BCMATH=1
+WITH_CALENDAR=1
+WITH_CTYPE=1
+WITH_EXIF=1
+WITH_FILTER=1
+WITH_TOKENIZER=1
+
+WITH_PHAR=static
+
+WITH_LIBXML=static
+WITH_DOM=static
+WITH_XML=static
+WITH_SIMPLEXML=static
+WITH_XMLREADER=static
+WITH_XMLWRITER=static
+WITH_TIDY=static
+
+WITH_LIBZIP=static
+WITH_ICONV=static
+WITH_SQLITE=static
+
+WITH_GD=static
+WITH_ZLIB=static
+WITH_LIBPNG=static
+WITH_FREETYPE=static
+WITH_LIBJPEG=static
+WITH_LIBWEBP=static
+
+WITH_YAML=static
+WITH_MBSTRING=static
+WITH_ONIGURUMA=static
+WITH_OPENSSL=static
+WITH_INTL=static
+
+WITH_WAITLINE=1
diff --git a/.github/bin/index-dirs.sh b/.github/bin/index-dirs.sh
index 38c35b753..d22f38a78 100755
--- a/.github/bin/index-dirs.sh
+++ b/.github/bin/index-dirs.sh
@@ -9,10 +9,10 @@ TREE_FLAGS='-FCL 1'
cd ${PACKAGES_DIR};
find . -type d | while read DIR; do {
- [[ "${DIR::-1}" == "pdo-cfd1" ]] && continue;
- [[ "${DIR::-1}" == "pdo-pglite" ]] && continue;
- [[ "${DIR::-1}" == "vrzno" ]] && continue;
- [[ "${DIR::-1}" == "waitline" ]] && continue;
+ [[ "${DIR:2}" == "pdo-cfd1" ]] && continue;
+ [[ "${DIR:2}" == "pdo-pglite" ]] && continue;
+ [[ "${DIR:2}" == "vrzno" ]] && continue;
+ [[ "${DIR:2}" == "waitline" ]] && continue;
test -d ${DIR} || continue;
pushd ${DIR} > /dev/null;
@@ -21,6 +21,20 @@ find . -type d | while read DIR; do {
perl -pi -e "s#^##" index.html
perl -pi -e "s#^
#at $(date)#" index.html
perl -pi -e "s#\t#\t
php-wasm © 2021-$(date +%Y) Sean Morris#" index.html
+ shopt -s nullglob
+ for BINARY in *.wasm; do
+ brotli -kfZ "${BINARY}"
+ gzip -n -k9 "${BINARY}"
+ done;
+ for BINARY in *.so; do
+ brotli -kfZ "${BINARY}"
+ gzip -n -k9 "${BINARY}"
+ done;
+ for DAT in *.dat; do
+ brotli -kfZ "${DAT}"
+ gzip -n -k9 "${DAT}"
+ done;
+ shopt -u nullglob
popd > /dev/null;
}; done;
@@ -43,4 +57,3 @@ tree ${TREE_FLAGS} -H "./" -T 'php-wasm/' -I "index.html" > index.html;
perl -pi -e "s#^##" index.html
perl -pi -e "s#^#at $(date)#" index.html
perl -pi -e "s#\t#\t
php-wasm © 2021-$(date +%Y) Sean Morris#" index.html
-
diff --git a/.github/bin/verify-sdl-main-module.sh b/.github/bin/verify-sdl-main-module.sh
new file mode 100755
index 000000000..7700aaf69
--- /dev/null
+++ b/.github/bin/verify-sdl-main-module.sh
@@ -0,0 +1,60 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+PHP_VERSION="${1:?usage: verify-sdl-main-module.sh }"
+WRAPPER="packages/php-wasm/php${PHP_VERSION}_sdl-web.mjs"
+
+if [[ ! -f "${WRAPPER}" ]]; then
+ echo "missing SDL wrapper artifact: ${WRAPPER}" >&2
+ exit 1
+fi
+
+WASM_BASENAME="$(
+ perl -ne '
+ if (/new URL\("([^"]+\.wasm)", import\.meta\.url\)/) {
+ print "$1\n";
+ exit 0;
+ }
+ if (/var f="([^"]+\.wasm)"/) {
+ print "$1\n";
+ exit 0;
+ }
+ ' "${WRAPPER}"
+)"
+
+if [[ -z "${WASM_BASENAME}" ]]; then
+ echo "could not resolve wasm path from SDL wrapper: ${WRAPPER}" >&2
+ exit 1
+fi
+
+WASM="$(dirname "${WRAPPER}")/${WASM_BASENAME}"
+
+if [[ ! -f "${WASM}" ]]; then
+ echo "missing SDL wasm artifact: ${WASM}" >&2
+ exit 1
+fi
+
+if ! command -v wasm-objdump >/dev/null 2>&1; then
+ echo "wasm-objdump is required to validate ${WASM}" >&2
+ exit 1
+fi
+
+OBJDUMP_LOG="$(mktemp)"
+trap 'rm -f "${OBJDUMP_LOG}"' EXIT
+wasm-objdump -x "${WASM}" > "${OBJDUMP_LOG}"
+
+if grep -E -q 'GOT\.mem\.SDL_(HIDAPI|VIRTUAL|DUMMY)_JoystickDriver' "${OBJDUMP_LOG}"; then
+ echo "SDL main module still imports joystick driver globals: ${WASM}" >&2
+ exit 1
+fi
+
+if grep -E -q ' <- env\.emscripten_compute_dom_pk_code' "${OBJDUMP_LOG}"; then
+ echo "SDL main module still imports emscripten_compute_dom_pk_code: ${WASM}" >&2
+ exit 1
+fi
+
+if grep -E -q 'asyncifyStubs\["emscripten_compute_dom_pk_code"\]=undefined' "${WRAPPER}"; then
+ echo "SDL wrapper still leaves emscripten_compute_dom_pk_code unresolved: ${WRAPPER}" >&2
+ exit 1
+fi
diff --git a/.github/workflows/build-demo-step.yaml b/.github/workflows/build-demo-step.yaml
new file mode 100644
index 000000000..5d4515b91
--- /dev/null
+++ b/.github/workflows/build-demo-step.yaml
@@ -0,0 +1,62 @@
+name: Build Web Demo
+
+on:
+ workflow_call:
+ inputs:
+ libType:
+ required: true
+ type: string
+
+jobs:
+ test:
+ name: Build Web Demo w/${{ inputs.libType }} libs
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out repository code
+ uses: actions/checkout@v6
+
+ - name: Disable man-db auto-update
+ run: |
+ echo "set man-db/auto-update false" | sudo debconf-communicate
+ sudo dpkg-reconfigure man-db
+
+ - name: Download Artifact
+ uses: actions/download-artifact@v8
+ with:
+ pattern: php-compressed-${{ inputs.libType }}
+ merge-multiple: true
+ path: ./
+
+ - name: Extract Artifact
+ run: |
+ for TAR in php-compressed-*.tar.gz; do
+ tar -xzf ${TAR}
+ done;
+
+ - name: Ensure the demo uses local packages
+ run: cd demo-web; ./switch-packages.sh local; npm ci; cd ..;
+
+ - name: Build Web Demo
+ run: cd demo-web; ./switch-packages.sh local; npm run build; cd ..;
+ env:
+ LIB_TYPE: ${{ inputs.libType }}
+ CI: ''
+
+ - name: Take Snapshot
+ run: |
+ sudo chown -R ${USER}:${USER} .
+ sudo chmod -R u+rwX,go+rX .
+ tar --exclude=.git \
+ --format=posix \
+ --exclude='php-demo-web-${{ inputs.libType }}.tar.gz' \
+ --ignore-failed-read \
+ --warning=no-file-changed \
+ -czf 'php-demo-web-${{ inputs.libType }}.tar.gz' \
+ docs
+
+ - name: Upload artifact
+ uses: actions/upload-artifact@v6
+ with:
+ name: php-demo-web-${{ inputs.libType }}
+ path: php-demo-web-${{ inputs.libType }}.tar.gz
+ compression-level: 0
diff --git a/.github/workflows/build-step.yaml b/.github/workflows/build-step.yaml
index e19325a5b..c76e683ca 100644
--- a/.github/workflows/build-step.yaml
+++ b/.github/workflows/build-step.yaml
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Import `.env` file
run: |
@@ -33,7 +33,7 @@ jobs:
- name: Download Artifact
if: ${{ inputs.libType != 'static' }}
- uses: actions/download-artifact@v4
+ uses: actions/download-artifact@v8
with:
pattern: php-dependencies-*
merge-multiple: true
@@ -46,22 +46,27 @@ jobs:
tar -xzf ${TAR}
done;
+ - name: Re-flatten mtimes after extraction
+ if: ${{ inputs.libType != 'static' }}
+ run: find . \( -name node_modules -o -name .git \) -type d -prune -o -type f -print0 | xargs -0 touch -d '1970-01-01 00:00:00 UTC'
+
- name: Apply executable cache
if: ${{ inputs.libType != 'static' }}
run: |
- ls ./.cache/executables-* | while read -r CACHE; do
- cat ${CACHE} | xargs -I{} chmod +x {}
+ shopt -s nullglob
+ for CACHE in ./.cache/executables-*; do
+ xargs -r -a "${CACHE}" chmod +x
done
- name: Install NPM packages
run: npm ci
- - name: Install deps
- run: sudo apt update && sudo apt install coreutils docker-compose -y
+ - name: Verify Docker Compose
+ run: docker compose version
- name: Cache Docker image
id: cache-docker-image
- uses: actions/cache@v3
+ uses: actions/cache@v5
with:
path: /tmp/builder-image.tar
key: ${{ runner.os }}-docker-${{ hashFiles('emscripten-builder.dockerfile') }}
@@ -76,26 +81,37 @@ jobs:
time make --debug=basic image
docker save -o /tmp/builder-image.tar seanmorris/php-emscripten-builder:latest
- - name: Spin up docker-network
- run: docker network create phpwasm_default
-
- name: Build demo-node
run: npm install --prefix demo-node
- name: Build PHP For Node
- run: time make --debug=basic node-mjs
+ run: time make --debug=basic node-mjs node-js
+
+ - name: Build PHP for Web
+ run: time make --debug=basic web-mjs web-js
- - name: Build PHP for Web & PHP-CGI for Worker
- run: time make --debug=basic web-mjs worker-cgi-mjs
+ - name: Build PHP-CGI for Worker
+ run: time make --debug=basic worker-cgi-mjs worker-cgi-js
- - name: Build php${{ inputs.phpVersion }}-sdl.so
- run: time make --debug=basic packages/sdl/php${{ inputs.phpVersion }}-sdl.so packages/sdl/libGL.so PHP_VERSION=${{ inputs.phpVersion }}
+ - name: Build PHP CGI for Node
+ run: time make --debug=basic node-cgi-mjs node-cgi-js
- - name: Build PHP (sdl) for Web
- run: time make --debug=basic web-mjs WITH_SDL=1
+ - name: Build PHP CLI for Node
+ run: time make --debug=basic node-cli-mjs node-cli-js
- - name: Build PHP DBG & CLI Previews
- run: time make --debug=basic web-dbg-mjs web-cli-mjs
+ - name: Build PHP DBG for Node
+ run: time make --debug=basic node-dbg-mjs node-dbg-js
+
+ - name: Build PHP CLI for Web
+ run: time make --debug=basic web-cli-mjs web-cli-js
+
+ - name: Build PHP DBG for Web
+ run: time make --debug=basic web-dbg-mjs web-dbg-js
+
+ - name: Build PHP (sdl variant) for Web
+ run: |
+ sudo rm -f .cache/config-cache third_party/php${{ inputs.phpVersion }}-src/configured
+ time make --debug=basic web-mjs WITH_SDL=1
- name: Take Snapshot
run: |
@@ -113,7 +129,7 @@ jobs:
lib
- name: Upload Artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
name: php-uncompressed-${{ inputs.phpVersion }}-${{ inputs.libType }}
path: php-uncompressed-${{ inputs.phpVersion }}-${{ inputs.libType }}.tar.gz
@@ -127,7 +143,7 @@ jobs:
tar --exclude=.git --exclude='snapshot.tar.gz' --ignore-failed-read --warning=no-file-changed -czf snapshot.tar.gz .
- name: Upload Failure Artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
if: ${{ failure() }}
with:
name: failure-snapshot-${{ inputs.phpVersion }}-${{ inputs.libType }}
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index c0d03b2a3..883d38f13 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -1,6 +1,9 @@
name: Build Artifacts
-on: [push]
+on:
+ push:
+ paths-ignore:
+ - '.cloudflare/pages/functions/\[\[path\]\].js'
permissions:
contents: read
@@ -19,15 +22,15 @@ jobs:
matrix: ${{ steps.set-matrix.outputs.libgroups }}
steps:
- name: Checkout code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Disable man-db auto-update
run: |
echo "set man-db/auto-update false" | sudo debconf-communicate
sudo dpkg-reconfigure man-db
- - name: Install docker-compose
- run: sudo apt update && sudo apt install docker-compose -y
+ - name: Verify Docker Compose
+ run: docker compose version
- name: Install NPM packages
run: npm ci
@@ -41,7 +44,7 @@ jobs:
- name: Cache Docker image
id: cache-docker-image
- uses: actions/cache@v3
+ uses: actions/cache@v5
with:
path: /tmp/builder-image.tar
key: ${{ runner.os }}-docker-${{ hashFiles('emscripten-builder.dockerfile') }}
@@ -66,7 +69,7 @@ jobs:
libgroup: ${{ fromJSON(needs.generate-lib-group-matrix.outputs.matrix) }}
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Disable man-db auto-update
run: |
@@ -76,15 +79,15 @@ jobs:
- name: Install NPM packages
run: npm ci
- - name: Install docker-compose
- run: sudo apt update && sudo apt install docker-compose -y
+ - name: Verify Docker Compose
+ run: docker compose version
- name: Import configuration
run: cp -p .github/.env_8.4.dynamic.ci .env
- name: Cache Docker image
id: cache-docker-image
- uses: actions/cache@v3
+ uses: actions/cache@v5
with:
path: /tmp/builder-image.tar
key: ${{ runner.os }}-docker-${{ hashFiles('emscripten-builder.dockerfile') }}
@@ -99,9 +102,6 @@ jobs:
time make --debug=basic image
docker save -o /tmp/builder-image.tar seanmorris/php-emscripten-builder:latest
- - name: Spin up docker-network
- run: docker network create phpwasm_default
-
- name: Build shared libraries
run: time make --debug=basic ${{ matrix.libgroup }} WITH_SDL=dynamic
@@ -124,7 +124,7 @@ jobs:
lib
- name: Upload Artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
name: php-dependencies-${{ matrix.libgroup }}
path: php-dependencies-${{ matrix.libgroup }}.tar.gz
@@ -132,12 +132,11 @@ jobs:
-
build-php-dynamic:
needs: [build-libs]
strategy:
matrix:
- phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0']
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
uses: ./.github/workflows/build-step.yaml
with:
phpVersion: ${{ matrix.phpVersion }}
@@ -147,7 +146,7 @@ jobs:
needs: [build-libs]
strategy:
matrix:
- phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0']
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
uses: ./.github/workflows/build-step.yaml
with:
phpVersion: ${{ matrix.phpVersion }}
@@ -157,20 +156,63 @@ jobs:
needs: []
strategy:
matrix:
- phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0']
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
uses: ./.github/workflows/build-step.yaml
with:
phpVersion: ${{ matrix.phpVersion }}
libType: static
+ verify-sdl-dynamic:
+ name: Verify SDL ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs
+ needs: [build-php-dynamic]
+ strategy:
+ fail-fast: false
+ matrix:
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
+ libType: ['dynamic']
+ uses: ./.github/workflows/verify-sdl-step.yaml
+ with:
+ artifactPattern: php-uncompressed-${{ matrix.phpVersion }}-${{ matrix.libType }}
+ phpVersion: ${{ matrix.phpVersion }}
+ libType: ${{ matrix.libType }}
+
+ verify-sdl-shared:
+ name: Verify SDL ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs
+ needs: [build-php-shared]
+ strategy:
+ fail-fast: false
+ matrix:
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
+ libType: ['shared']
+ uses: ./.github/workflows/verify-sdl-step.yaml
+ with:
+ artifactPattern: php-uncompressed-${{ matrix.phpVersion }}-${{ matrix.libType }}
+ phpVersion: ${{ matrix.phpVersion }}
+ libType: ${{ matrix.libType }}
+
+ verify-sdl-static:
+ name: Verify SDL ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs
+ needs: [build-php-static]
+ strategy:
+ fail-fast: false
+ matrix:
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
+ libType: ['static']
+ uses: ./.github/workflows/verify-sdl-step.yaml
+ with:
+ artifactPattern: php-uncompressed-${{ matrix.phpVersion }}-${{ matrix.libType }}
+ phpVersion: ${{ matrix.phpVersion }}
+ libType: ${{ matrix.libType }}
+
test-node-dynamic:
name: Test ${{ matrix.testType }} ${{ matrix.phpVersion }} w/dynamic libs
needs: [build-php-dynamic]
strategy:
+ fail-fast: false
matrix:
- phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0']
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
testType: ['node', 'deno']
libType: ['dynamic']
uses: ./.github/workflows/test-node-step.yaml
@@ -184,8 +226,9 @@ jobs:
name: Test ${{ matrix.testType }} ${{ matrix.phpVersion }} w/shared libs
needs: [build-php-shared]
strategy:
+ fail-fast: false
matrix:
- phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0']
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
testType: ['node', 'deno']
libType: ['shared']
uses: ./.github/workflows/test-node-step.yaml
@@ -199,8 +242,9 @@ jobs:
name: Test ${{ matrix.testType }} ${{ matrix.phpVersion }} w/static libs
needs: [build-php-static]
strategy:
+ fail-fast: false
matrix:
- phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0']
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
testType: ['node', 'deno']
libType: ['static']
uses: ./.github/workflows/test-node-step.yaml
@@ -216,8 +260,9 @@ jobs:
name: Test Browser ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs
needs: [build-php-dynamic]
strategy:
+ fail-fast: false
matrix:
- phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0']
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
libType: ['dynamic']
uses: ./.github/workflows/test-browser-step.yaml
with:
@@ -229,8 +274,9 @@ jobs:
name: Test Browser ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs
needs: [build-php-shared]
strategy:
+ fail-fast: false
matrix:
- phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0']
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
libType: ['shared']
uses: ./.github/workflows/test-browser-step.yaml
with:
@@ -242,8 +288,9 @@ jobs:
name: Test Browser ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs
needs: [build-php-static]
strategy:
+ fail-fast: false
matrix:
- phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0']
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
libType: ['static']
uses: ./.github/workflows/test-browser-step.yaml
with:
@@ -253,18 +300,64 @@ jobs:
+ test-cgi-node-dynamic:
+ name: Test CGI Node ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs
+ needs: [build-php-dynamic]
+ strategy:
+ fail-fast: false
+ matrix:
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
+ libType: ['dynamic']
+ uses: ./.github/workflows/test-cgi-node-step.yaml
+ with:
+ artifactPattern: php-uncompressed-*-${{ matrix.libType }}
+ phpVersion: ${{ matrix.phpVersion }}
+ libType: ${{ matrix.libType }}
+
+ test-cgi-node-shared:
+ name: Test CGI Node ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs
+ needs: [build-php-shared]
+ strategy:
+ fail-fast: false
+ matrix:
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
+ libType: ['shared']
+ uses: ./.github/workflows/test-cgi-node-step.yaml
+ with:
+ artifactPattern: php-uncompressed-*-${{ matrix.libType }}
+ phpVersion: ${{ matrix.phpVersion }}
+ libType: ${{ matrix.libType }}
+
+ test-cgi-node-static:
+ name: Test CGI Node ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs
+ needs: [build-php-static]
+ strategy:
+ fail-fast: false
+ matrix:
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
+ libType: ['static']
+ uses: ./.github/workflows/test-cgi-node-step.yaml
+ with:
+ artifactPattern: php-uncompressed-*-${{ matrix.libType }}
+ phpVersion: ${{ matrix.phpVersion }}
+ libType: ${{ matrix.libType }}
+
+
+
compress-dynamic-packages:
name: Compress PHP w/${{ matrix.libType }} libs
runs-on: ubuntu-latest
needs:
+ - verify-sdl-dynamic
- test-node-dynamic
- test-browser-dynamic
+ - test-cgi-node-dynamic
strategy:
matrix:
libType: ['dynamic']
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Disable man-db auto-update
run: |
@@ -272,7 +365,7 @@ jobs:
sudo dpkg-reconfigure man-db
- name: Download Artifact
- uses: actions/download-artifact@v4
+ uses: actions/download-artifact@v8
with:
pattern: php-uncompressed-*-${{ matrix.libType }}
merge-multiple: true
@@ -312,7 +405,7 @@ jobs:
lib
- name: Upload Artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
name: php-compressed-${{ matrix.libType }}
path: php-compressed-${{ matrix.libType }}.tar.gz
@@ -322,14 +415,16 @@ jobs:
name: Compress PHP w/${{ matrix.libType }} libs
runs-on: ubuntu-latest
needs:
+ - verify-sdl-shared
- test-node-shared
- test-browser-shared
+ - test-cgi-node-shared
strategy:
matrix:
libType: ['shared']
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Disable man-db auto-update
run: |
@@ -337,7 +432,7 @@ jobs:
sudo dpkg-reconfigure man-db
- name: Download Artifact
- uses: actions/download-artifact@v4
+ uses: actions/download-artifact@v8
with:
pattern: php-uncompressed-*-${{ matrix.libType }}
merge-multiple: true
@@ -377,7 +472,7 @@ jobs:
lib
- name: Upload Artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
name: php-compressed-${{ matrix.libType }}
path: php-compressed-${{ matrix.libType }}.tar.gz
@@ -387,14 +482,16 @@ jobs:
name: Compress PHP w/${{ matrix.libType }} libs
runs-on: ubuntu-latest
needs:
+ - verify-sdl-static
- test-node-static
- test-browser-static
+ - test-cgi-node-static
strategy:
matrix:
libType: ['static']
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Disable man-db auto-update
run: |
@@ -402,7 +499,7 @@ jobs:
sudo dpkg-reconfigure man-db
- name: Download Artifact
- uses: actions/download-artifact@v4
+ uses: actions/download-artifact@v8
with:
pattern: php-uncompressed-*-${{ matrix.libType }}
merge-multiple: true
@@ -442,7 +539,7 @@ jobs:
lib
- name: Upload Artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
name: php-compressed-${{ matrix.libType }}
path: php-compressed-${{ matrix.libType }}.tar.gz
@@ -455,8 +552,9 @@ jobs:
name: Test ${{ matrix.testType }} ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed)
needs: [compress-dynamic-packages]
strategy:
+ fail-fast: false
matrix:
- phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0']
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
testType: ['node', 'deno']
libType: ['dynamic']
uses: ./.github/workflows/test-node-step.yaml
@@ -470,8 +568,9 @@ jobs:
name: Test ${{ matrix.testType }} ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed)
needs: [compress-shared-packages]
strategy:
+ fail-fast: false
matrix:
- phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0']
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
testType: ['node', 'deno']
libType: ['shared']
uses: ./.github/workflows/test-node-step.yaml
@@ -485,8 +584,9 @@ jobs:
name: Test ${{ matrix.testType }} ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed)
needs: [compress-static-packages]
strategy:
+ fail-fast: false
matrix:
- phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0']
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
testType: ['node', 'deno']
libType: ['static']
uses: ./.github/workflows/test-node-step.yaml
@@ -502,8 +602,9 @@ jobs:
name: Test Browser ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed)
needs: [compress-dynamic-packages]
strategy:
+ fail-fast: false
matrix:
- phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0']
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
libType: ['dynamic']
uses: ./.github/workflows/test-browser-step.yaml
with:
@@ -515,8 +616,9 @@ jobs:
name: Test Browser ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed)
needs: [compress-shared-packages]
strategy:
+ fail-fast: false
matrix:
- phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0']
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
libType: ['shared']
uses: ./.github/workflows/test-browser-step.yaml
with:
@@ -528,8 +630,9 @@ jobs:
name: Test Browser ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed)
needs: [compress-static-packages]
strategy:
+ fail-fast: false
matrix:
- phpVersion: ['8.4', '8.3', '8.2', '8.1', '8.0']
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
libType: ['static']
uses: ./.github/workflows/test-browser-step.yaml
with:
@@ -537,17 +640,80 @@ jobs:
phpVersion: ${{ matrix.phpVersion }}
libType: ${{ matrix.libType }}
+ test-browser-sdl-compressed:
+ name: Test Browser 8.4 _sdl w/${{ matrix.libType }} libs (compressed)
+ needs:
+ - compress-dynamic-packages
+ - compress-shared-packages
+ - compress-static-packages
+ strategy:
+ fail-fast: false
+ matrix:
+ libType: ['dynamic', 'shared', 'static']
+ uses: ./.github/workflows/test-browser-step.yaml
+ with:
+ artifactPattern: php-compressed-${{ matrix.libType }}
+ phpVersion: '8.4'
+ phpVariant: '_sdl'
+ libType: ${{ matrix.libType }}
+
+
+
+ test-cgi-node-dynamic-compressed:
+ name: Test CGI Node ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed)
+ needs: [compress-dynamic-packages]
+ strategy:
+ fail-fast: false
+ matrix:
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
+ libType: ['dynamic']
+ uses: ./.github/workflows/test-cgi-node-step.yaml
+ with:
+ artifactPattern: php-compressed-${{ matrix.libType }}
+ phpVersion: ${{ matrix.phpVersion }}
+ libType: ${{ matrix.libType }}
+
+ test-cgi-node-shared-compressed:
+ name: Test CGI Node ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed)
+ needs: [compress-shared-packages]
+ strategy:
+ fail-fast: false
+ matrix:
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
+ libType: ['shared']
+ uses: ./.github/workflows/test-cgi-node-step.yaml
+ with:
+ artifactPattern: php-compressed-${{ matrix.libType }}
+ phpVersion: ${{ matrix.phpVersion }}
+ libType: ${{ matrix.libType }}
+
+ test-cgi-node-static-compressed:
+ name: Test CGI Node ${{ matrix.phpVersion }} w/${{ matrix.libType }} libs (compressed)
+ needs: [compress-static-packages]
+ strategy:
+ fail-fast: false
+ matrix:
+ phpVersion: ['8.5', '8.4', '8.3', '8.2', '8.1', '8.0']
+ libType: ['static']
+ uses: ./.github/workflows/test-cgi-node-step.yaml
+ with:
+ artifactPattern: php-compressed-${{ matrix.libType }}
+ phpVersion: ${{ matrix.phpVersion }}
+ libType: ${{ matrix.libType }}
+
index-packages:
- name: Create HTML Indexes
+ name: Post nightly build to Cloudflare
+ if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop'
runs-on: ubuntu-latest
needs:
- test-browser-dynamic-compressed
- test-node-dynamic-compressed
+ - test-cgi-node-dynamic-compressed
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Disable man-db auto-update
run: |
@@ -555,7 +721,7 @@ jobs:
sudo dpkg-reconfigure man-db
- name: Download Artifact
- uses: actions/download-artifact@v4
+ uses: actions/download-artifact@v8
with:
pattern: php-compressed-dynamic
merge-multiple: true
@@ -567,6 +733,9 @@ jobs:
tar -xzf ${TAR}
done;
+ - name: Install Brotli & GZip
+ run: sudo apt install brotli gzip
+
- name: Index Package Directories
run: ./.github/bin/index-dirs.sh packages/
@@ -584,7 +753,7 @@ jobs:
.cache
- name: Upload Artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
name: php-indexed-packages
path: php-indexed-packages.tar.gz
@@ -601,9 +770,9 @@ jobs:
r2-account-id: ${{ secrets.R2_ACCOUNT_ID }}
r2-access-key-id: ${{ secrets.R2_ACCESS_KEY_ID }}
r2-secret-access-key: ${{ secrets.R2_SECRET_ACCESS_KEY }}
- r2-bucket: ${{ secrets.R2_BUCKET }}
- source-dir: packages
destination-dir: ${{ env.STAMP }}-${{ env.SHORT_SHA }}/
+ r2-bucket: php-wasm
+ source-dir: packages
- name: Install Wrangler
run: npm install -g wrangler
@@ -620,86 +789,79 @@ jobs:
if: ${{ success() }}
run: |
curl -H "Content-Type: application/json" \
- -X POST \
- -d "{\"content\": \"New nightly build available: https://nightly.php-wasm.seanmorr.is/${{ env.STAMP }}-${{ env.SHORT_SHA }}/\"}" \
- ${{ secrets.DISCORD_WEBHOOK_URL }}
+ -X POST \
+ -d "{\"content\": \"New nightly build available: https://nightly.php-wasm.seanmorr.is/${{ env.STAMP }}-${{ env.SHORT_SHA }}/\"}" \
+ ${{ secrets.DISCORD_WEBHOOK_URL }}
- build-demo:
- name: Build Web Demo
- runs-on: ubuntu-latest
- needs:
- - index-packages
- steps:
- - name: Check out repository code
- uses: actions/checkout@v4
- - name: Disable man-db auto-update
- run: |
- echo "set man-db/auto-update false" | sudo debconf-communicate
- sudo dpkg-reconfigure man-db
- - name: Download Artifact
- uses: actions/download-artifact@v4
- with:
- pattern: php-compressed-dynamic
- merge-multiple: true
- path: ./
+ build-demo-dynamic:
+ name: Build Web Demo w/dynamic libs
+ needs:
+ - test-browser-dynamic-compressed
+ - test-node-dynamic-compressed
+ - test-cgi-node-dynamic-compressed
+ uses: ./.github/workflows/build-demo-step.yaml
+ with:
+ libType: dynamic
- - name: Extract Artifact
- run: |
- for TAR in php-compressed-*.tar.gz; do
- tar -xzf ${TAR}
- done;
+ build-demo-shared:
+ name: Build Web Demo w/shared libs
+ needs:
+ - test-browser-shared-compressed
+ - test-node-shared-compressed
+ - test-cgi-node-shared-compressed
+ uses: ./.github/workflows/build-demo-step.yaml
+ with:
+ libType: shared
- - name: Download Index Artifact
- uses: actions/download-artifact@v4
- with:
- pattern: php-indexed-packages
- merge-multiple: true
- path: ./
+ build-demo-static:
+ name: Build Web Demo w/static libs
+ needs:
+ - test-browser-static-compressed
+ - test-node-static-compressed
+ - test-cgi-node-static-compressed
+ uses: ./.github/workflows/build-demo-step.yaml
+ with:
+ libType: static
- - name: Extract Artifact
- run: |
- for TAR in php-indexed-packages.tar.gz; do
- tar -xzf ${TAR}
- done;
- - name: Ensure the demo uses local packages
- run: cd demo-web; ./switch-packages.sh local; npm ci; cd ..;
- - name: Build Web Demo
- run: cd demo-web; ./switch-packages.sh local; npm run build; cd ..;
- env:
- CI: ''
+ test-demo-web-dynamic:
+ name: Test demo-web artifact w/dynamic libs
+ needs:
+ - build-demo-dynamic
+ uses: ./.github/workflows/test-demo-web-step.yaml
+ with:
+ artifactName: php-demo-web-dynamic
+ libType: dynamic
- - name: Copy packages into web demo
- run: cp -rfv packages demo-web/build/nightly
+ test-demo-web-shared:
+ name: Test demo-web artifact w/shared libs
+ needs:
+ - build-demo-shared
+ uses: ./.github/workflows/test-demo-web-step.yaml
+ with:
+ artifactName: php-demo-web-shared
+ libType: shared
+
+ test-demo-web-static:
+ name: Test demo-web artifact w/static libs
+ needs:
+ - build-demo-static
+ uses: ./.github/workflows/test-demo-web-step.yaml
+ with:
+ artifactName: php-demo-web-static
+ libType: static
- - name: Take Snapshot
- run: |
- sudo chown -R ${USER}:${USER} .
- sudo chmod -R u+rwX,go+rX .
- tar --exclude=.git \
- --format=posix \
- --exclude='php-demo-web.tar.gz' \
- --ignore-failed-read \
- --warning=no-file-changed \
- -czf 'php-demo-web.tar.gz' \
- docs
- - name: Upload artifact
- uses: actions/upload-artifact@v4
- with:
- name: php-demo-web
- path: php-demo-web.tar.gz
- compression-level: 0
- deploy-docs:
+ deploy-to-pages:
name: Deploy Docs to GitHub Pages
+ if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop'
runs-on: ubuntu-latest
needs:
- - build-demo
- if: github.ref == 'refs/heads/master'
+ - test-demo-web-dynamic
permissions:
contents: read
pages: write
@@ -709,18 +871,18 @@ jobs:
cancel-in-progress: true
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Download Artifact
- uses: actions/download-artifact@v4
+ uses: actions/download-artifact@v8
with:
- pattern: php-demo-web
+ pattern: php-demo-web-dynamic
merge-multiple: true
path: ./
- name: Extract Artifact
run: |
- for TAR in php-demo-web.tar.gz; do
+ for TAR in php-demo-web-dynamic.tar.gz; do
tar -xzf ${TAR}
done;
diff --git a/.github/workflows/deploy-pages-function.yaml b/.github/workflows/deploy-pages-function.yaml
new file mode 100644
index 000000000..cfdeba2c5
--- /dev/null
+++ b/.github/workflows/deploy-pages-function.yaml
@@ -0,0 +1,30 @@
+name: Deploy Cloudflare Pages Function
+
+on:
+ push:
+ paths:
+ - '.cloudflare/pages/functions/\[\[path\]\].js'
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+jobs:
+ deploy-pages-function:
+ name: Deploy Cloudflare Pages Function
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out repository code
+ uses: actions/checkout@v6
+
+ - name: Install Wrangler
+ run: npm install -g wrangler
+
+ - name: Deploy Cloudflare Pages Function
+ run: |
+ cd .cloudflare/pages
+ wrangler pages deploy --branch=main --project-name=php-wasm-nightly
+ env:
+ CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_PAGES_API_TOKEN }}
+ CLOUDFLARE_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }}
diff --git a/.github/workflows/test-browser-step.yaml b/.github/workflows/test-browser-step.yaml
index 725d4adc3..3629aac87 100644
--- a/.github/workflows/test-browser-step.yaml
+++ b/.github/workflows/test-browser-step.yaml
@@ -12,6 +12,10 @@ on:
artifactPattern:
required: true
type: string
+ phpVariant:
+ required: false
+ type: string
+ default: ''
jobs:
test:
@@ -19,7 +23,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Disable man-db auto-update
run: |
@@ -32,7 +36,7 @@ jobs:
touch -d '1970-01-01 00:00:00 UTC' .env
- name: Download Artifact
- uses: actions/download-artifact@v4
+ uses: actions/download-artifact@v8
with:
pattern: ${{ inputs.artifactPattern }}
merge-multiple: true
@@ -44,14 +48,14 @@ jobs:
tar -xzf ${TAR}
done;
+ - name: Flatten mtimes after extraction
+ run: find . \( -name node_modules -o -name .git \) -type d -prune -o -type f -print0 | xargs -0 touch -d '1970-01-01 00:00:00 UTC'
+
- name: Install NPM packages
run: npm ci
- - name: Install Global NPM packages
- run: npm install -g deno cv3-test netcat
-
- - name: Install docker-compose
- run: sudo apt update && sudo apt install docker-compose -y
+ - name: Verify browser harness assets
+ run: node test/browser/verify-browser-assets.mjs
- name: Install Chrome's APT key
run: wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
@@ -62,11 +66,8 @@ jobs:
- name: Install Chrome
run: sudo apt-get update && sudo apt install -y software-properties-common google-chrome-stable
- - name: Ensure the demo uses local packages
- run: cd demo-web; ./switch-packages.sh local; npm ci; cd ..;
-
- name: Run tests
- run: BUILD_TYPE=${{ inputs.libType }} make --debug=basic test-browser
+ run: PHP_VERSION=${{ inputs.phpVersion }} PHP_VARIANT=${{ inputs.phpVariant }} LIB_TYPE=${{ inputs.libType }} make --debug=basic test-browser
- name: Take Failure Snapshot
if: ${{ failure() }}
@@ -76,7 +77,7 @@ jobs:
tar --exclude=.git --exclude='snapshot.tar.gz' --ignore-failed-read --warning=no-file-changed -czf snapshot.tar.gz .
- name: Upload Failure Artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
if: ${{ failure() }}
with:
name: failure-snapshot-browser-test-${{ inputs.phpVersion }}-${{ inputs.libType }}
diff --git a/.github/workflows/test-cgi-node-step.yaml b/.github/workflows/test-cgi-node-step.yaml
new file mode 100644
index 000000000..c13ddaee2
--- /dev/null
+++ b/.github/workflows/test-cgi-node-step.yaml
@@ -0,0 +1,72 @@
+name: Test CGI Node
+
+on:
+ workflow_call:
+ inputs:
+ phpVersion:
+ required: true
+ type: string
+ libType:
+ required: true
+ type: string
+ artifactPattern:
+ required: true
+ type: string
+
+jobs:
+ test:
+ name: Test Cgi Node ${{ inputs.phpVersion }} w/${{ inputs.libType }} libs
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out repository code
+ uses: actions/checkout@v6
+
+ - name: Disable man-db auto-update
+ run: |
+ echo "set man-db/auto-update false" | sudo debconf-communicate
+ sudo dpkg-reconfigure man-db
+
+ - name: Import configuration
+ run: |
+ cp -p .github/.env_${{ inputs.phpVersion }}.${{ inputs.libType }}.ci .env
+ touch -d '1970-01-01 00:00:00 UTC' .env
+
+ - name: Download Artifact
+ uses: actions/download-artifact@v8
+ with:
+ pattern: ${{ inputs.artifactPattern }}
+ merge-multiple: true
+ path: ./
+
+ - name: Extract Artifact
+ run: |
+ for TAR in ${{ inputs.artifactPattern }}.tar.gz; do
+ tar -xzf ${TAR}
+ done;
+
+ - name: Flatten mtimes after extraction
+ run: find . \( -name node_modules -o -name .git \) -type d -prune -o -type f -print0 | xargs -0 touch -d '1970-01-01 00:00:00 UTC'
+
+ - name: Install NPM packages
+ run: |
+ npm ci
+
+ - name: Run tests
+ run: |
+ PHP_VERSION=${{ inputs.phpVersion }} LIB_TYPE=${{ inputs.libType }} make --debug=basic test-cgi-node
+ PHP_VERSION=${{ inputs.phpVersion }} LIB_TYPE=${{ inputs.libType }} make --debug=basic test-cgi-node-cjs
+
+ - name: Take Failure Snapshot
+ if: ${{ failure() }}
+ run: |
+ sudo chown -R ${USER}:${USER} .
+ sudo chmod -R u+rwX,go+rX .
+ tar --exclude=.git --exclude='snapshot.tar.gz' --ignore-failed-read --warning=no-file-changed -czf snapshot.tar.gz .
+
+ - name: Upload Failure Artifact
+ uses: actions/upload-artifact@v6
+ if: ${{ failure() }}
+ with:
+ name: failure-snapshot-cgi-node-test-${{ inputs.phpVersion }}-${{ inputs.libType }}
+ path: snapshot.tar.gz
+ compression-level: 0
diff --git a/.github/workflows/test-demo-web-step.yaml b/.github/workflows/test-demo-web-step.yaml
new file mode 100644
index 000000000..cbae9e6ba
--- /dev/null
+++ b/.github/workflows/test-demo-web-step.yaml
@@ -0,0 +1,73 @@
+name: Test Demo Web Artifact
+
+on:
+ workflow_call:
+ inputs:
+ artifactName:
+ required: true
+ type: string
+ libType:
+ required: true
+ type: string
+
+jobs:
+ test:
+ name: Test demo-web artifact w/${{ inputs.libType }} libs
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out repository code
+ uses: actions/checkout@v6
+
+ - name: Disable man-db auto-update
+ run: |
+ echo "set man-db/auto-update false" | sudo debconf-communicate
+ sudo dpkg-reconfigure man-db
+
+ - name: Download Artifact
+ uses: actions/download-artifact@v8
+ with:
+ name: ${{ inputs.artifactName }}
+ path: ./
+
+ - name: Extract Artifact
+ run: |
+ for TAR in php-demo-web-${{ inputs.libType }}.tar.gz; do
+ tar -xzf ${TAR}
+ done;
+
+ - name: Install NPM packages
+ run: npm ci
+
+ - name: Install Chrome's APT key
+ run: wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
+
+ - name: Install Chrome's APT source
+ run: sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
+
+ - name: Install Chrome
+ run: sudo apt-get update && sudo apt install -y software-properties-common google-chrome-stable
+
+ - name: Run tests
+ run: LIB_TYPE=${{ inputs.libType }} DEMO_WEB_ARTIFACT_ROOT=docs make --debug=basic test-demo-web
+
+ - name: Take Failure Snapshot
+ if: ${{ failure() }}
+ run: |
+ sudo chown -R ${USER}:${USER} .
+ sudo chmod -R u+rwX,go+rX .
+ tar --exclude=.git \
+ --exclude='demo-web-artifact-failure.tar.gz' \
+ --ignore-failed-read \
+ --warning=no-file-changed \
+ -czf demo-web-artifact-failure.tar.gz \
+ php-demo-web-${{ inputs.libType }}.tar.gz \
+ docs \
+ test-results
+
+ - name: Upload Failure Artifact
+ uses: actions/upload-artifact@v6
+ if: ${{ failure() }}
+ with:
+ name: failure-snapshot-demo-web-test-${{ inputs.libType }}
+ path: demo-web-artifact-failure.tar.gz
+ compression-level: 0
diff --git a/.github/workflows/test-node-step.yaml b/.github/workflows/test-node-step.yaml
index f26237266..88c32b8b1 100644
--- a/.github/workflows/test-node-step.yaml
+++ b/.github/workflows/test-node-step.yaml
@@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Import `.env` file
run: |
@@ -34,7 +34,7 @@ jobs:
- name: Cache Docker image
id: cache-docker-image
- uses: actions/cache@v3
+ uses: actions/cache@v5
with:
path: /tmp/builder-image.tar
key: ${{ runner.os }}-docker-${{ hashFiles('emscripten-builder.dockerfile') }}
@@ -49,17 +49,16 @@ jobs:
time make --debug=basic image
docker save -o /tmp/builder-image.tar seanmorris/php-emscripten-builder:latest
- - name: Install deps
- run: sudo apt update && sudo apt install coreutils docker-compose -y
+ - name: Verify Docker Compose
+ run: docker compose version
- name: npm install
run: |
npm ci
- npm ci --prefix demo-node
npm install -g deno@2.5.6
- name: Download Artifact
- uses: actions/download-artifact@v4
+ uses: actions/download-artifact@v8
with:
pattern: ${{ inputs.artifactPattern }}
merge-multiple: true
@@ -71,17 +70,27 @@ jobs:
tar -xzf ${TAR}
done;
- - name: Spin up docker-network
- run: docker network create phpwasm_default
+ - name: Re-flatten mtimes after extraction
+ run: find . \( -name node_modules -o -name .git \) -type d -prune -o -type f -print0 | xargs -0 touch -d '1970-01-01 00:00:00 UTC'
- name: Apply executable cache
run: |
- ls ./.cache/executables-* | while read -r CACHE; do
- cat ${CACHE} | xargs -I{} chmod +x {}
+ shopt -s nullglob
+ for CACHE in ./.cache/executables-*; do
+ xargs -r -a "${CACHE}" chmod +x
done
- name: Run tests
- run: make --debug=basic test-${{ inputs.testType }} PHP_VERSION=${{ inputs.phpVersion }}
+ run: |
+ TARGET=test-${{ inputs.testType }}
+
+ if [ "${{ inputs.testType }}" = "node" ]; then
+ make --debug=basic test-node-standard PHP_VERSION=${{ inputs.phpVersion }} LIB_TYPE=${{ inputs.libType }}
+ make --debug=basic test-node-cjs-standard PHP_VERSION=${{ inputs.phpVersion }} LIB_TYPE=${{ inputs.libType }}
+ exit 0
+ fi
+
+ make --debug=basic ${TARGET} PHP_VERSION=${{ inputs.phpVersion }} LIB_TYPE=${{ inputs.libType }}
- name: Take Failure Snapshot
if: ${{ failure() }}
@@ -91,7 +100,7 @@ jobs:
tar --exclude=.git --exclude='snapshot.tar.gz' --ignore-failed-read --warning=no-file-changed -czf snapshot.tar.gz .
- name: Upload Failure Artifact
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
if: ${{ failure() }}
with:
name: failure-snapshot-${{ inputs.testType }}-test-${{ inputs.phpVersion }}-${{ inputs.libType }}
diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml
index 0313408f9..e2ee913e4 100644
--- a/.github/workflows/test.yaml
+++ b/.github/workflows/test.yaml
@@ -1,28 +1,49 @@
name: Test
-on: [push]
+on:
+ push:
+ paths-ignore:
+ - '.cloudflare/pages/functions/\[\[path\]\].js'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
+env:
+ SKIP_PACKAGING_TEST: 1
+
jobs:
+ test-8-5-static:
+ name: Test 8.5 Static
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out repository code
+ uses: actions/checkout@v6
+ - run: npm install
+ - run: npm install -g deno@2.5.6
+ - run: |
+ echo "set man-db/auto-update false" | sudo debconf-communicate
+ sudo dpkg-reconfigure man-db
+ - run: docker compose version
+ - run: cp .circleci/.env_8.5.ci .env
+ - run: make image
+ - run: PHP_VERSION=8.5 make test
+
test-8-4-static:
name: Test 8.4 Static
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- run: npm install
- run: npm install -g deno@2.5.6
- run: |
echo "set man-db/auto-update false" | sudo debconf-communicate
sudo dpkg-reconfigure man-db
- - run: sudo apt update && sudo apt install docker-compose -y
+ - run: docker compose version
- run: cp .circleci/.env_8.4.ci .env
- run: make image
- - run: docker network create phpwasm_default
- run: PHP_VERSION=8.4 make test
test-8-3-static:
@@ -30,16 +51,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- run: npm install
- run: npm install -g deno@2.5.6
- run: |
echo "set man-db/auto-update false" | sudo debconf-communicate
sudo dpkg-reconfigure man-db
- - run: sudo apt update && sudo apt install docker-compose -y
+ - run: docker compose version
- run: cp .circleci/.env_8.3.ci .env
- run: make image
- - run: docker network create phpwasm_default
- run: PHP_VERSION=8.3 make test
test-8-2-static:
@@ -47,16 +67,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- run: npm install
- run: npm install -g deno@2.5.6
- run: |
echo "set man-db/auto-update false" | sudo debconf-communicate
sudo dpkg-reconfigure man-db
- - run: sudo apt update && sudo apt install docker-compose -y
+ - run: docker compose version
- run: cp .circleci/.env_8.2.ci .env
- run: make image
- - run: docker network create phpwasm_default
- run: PHP_VERSION=8.2 make test
test-8-1-static:
@@ -64,16 +83,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- run: npm install
- run: npm install -g deno@2.5.6
- run: |
echo "set man-db/auto-update false" | sudo debconf-communicate
sudo dpkg-reconfigure man-db
- - run: sudo apt update && sudo apt install docker-compose -y
+ - run: docker compose version
- run: cp .circleci/.env_8.1.ci .env
- run: make image
- - run: docker network create phpwasm_default
- run: PHP_VERSION=8.1 make test
test-8-0-static:
@@ -81,34 +99,47 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- run: npm install
- run: npm install -g deno@2.5.6
- run: |
echo "set man-db/auto-update false" | sudo debconf-communicate
sudo dpkg-reconfigure man-db
- - run: sudo apt update && sudo apt install docker-compose -y
+ - run: docker compose version
- run: cp .circleci/.env_8.0.ci .env
- run: make image
- - run: docker network create phpwasm_default
- run: PHP_VERSION=8.0 make test
+ test-8-5-dynamic:
+ name: Test 8.5 Dynamic
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out repository code
+ uses: actions/checkout@v6
+ - run: npm install
+ - run: npm install -g deno@2.5.6
+ - run: |
+ echo "set man-db/auto-update false" | sudo debconf-communicate
+ sudo dpkg-reconfigure man-db
+ - run: docker compose version
+ - run: cp .circleci/.env_8.5-dynamic.ci .env
+ - run: make image
+ - run: PHP_VERSION=8.5 make test
test-8-4-dynamic:
name: Test 8.4 Dynamic
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- run: npm install
- run: npm install -g deno@2.5.6
- run: |
echo "set man-db/auto-update false" | sudo debconf-communicate
sudo dpkg-reconfigure man-db
- - run: sudo apt update && sudo apt install docker-compose -y
+ - run: docker compose version
- run: cp .circleci/.env_8.4-dynamic.ci .env
- run: make image
- - run: docker network create phpwasm_default
- run: PHP_VERSION=8.4 make test
test-8-3-dynamic:
@@ -116,16 +147,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- run: npm install
- run: npm install -g deno@2.5.6
- run: |
echo "set man-db/auto-update false" | sudo debconf-communicate
sudo dpkg-reconfigure man-db
- - run: sudo apt update && sudo apt install docker-compose -y
+ - run: docker compose version
- run: cp .circleci/.env_8.3-dynamic.ci .env
- run: make image
- - run: docker network create phpwasm_default
- run: PHP_VERSION=8.3 make test
test-8-2-dynamic:
@@ -133,16 +163,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- run: npm install
- run: npm install -g deno@2.5.6
- run: |
echo "set man-db/auto-update false" | sudo debconf-communicate
sudo dpkg-reconfigure man-db
- - run: sudo apt update && sudo apt install docker-compose -y
+ - run: docker compose version
- run: cp .circleci/.env_8.2-dynamic.ci .env
- run: make image
- - run: docker network create phpwasm_default
- run: PHP_VERSION=8.2 make test
test-8-1-dynamic:
@@ -150,16 +179,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- run: npm install
- run: npm install -g deno@2.5.6
- run: |
echo "set man-db/auto-update false" | sudo debconf-communicate
sudo dpkg-reconfigure man-db
- - run: sudo apt update && sudo apt install docker-compose -y
+ - run: docker compose version
- run: cp .circleci/.env_8.1-dynamic.ci .env
- run: make image
- - run: docker network create phpwasm_default
- run: PHP_VERSION=8.1 make test
test-8-0-dynamic:
@@ -167,34 +195,47 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- run: npm install
- run: npm install -g deno@2.5.6
- run: |
echo "set man-db/auto-update false" | sudo debconf-communicate
sudo dpkg-reconfigure man-db
- - run: sudo apt update && sudo apt install docker-compose -y
+ - run: docker compose version
- run: cp .circleci/.env_8.0-dynamic.ci .env
- run: make image
- - run: docker network create phpwasm_default
- run: PHP_VERSION=8.0 make test
+ test-8-5-shared:
+ name: Test 8.5 Shared
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out repository code
+ uses: actions/checkout@v6
+ - run: npm install
+ - run: npm install -g deno@2.5.6
+ - run: |
+ echo "set man-db/auto-update false" | sudo debconf-communicate
+ sudo dpkg-reconfigure man-db
+ - run: docker compose version
+ - run: cp .circleci/.env_8.5-shared.ci .env
+ - run: make image
+ - run: PHP_VERSION=8.5 make test
test-8-4-shared:
name: Test 8.4 Shared
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- run: npm install
- run: npm install -g deno@2.5.6
- run: |
echo "set man-db/auto-update false" | sudo debconf-communicate
sudo dpkg-reconfigure man-db
- - run: sudo apt update && sudo apt install docker-compose -y
+ - run: docker compose version
- run: cp .circleci/.env_8.4-shared.ci .env
- run: make image
- - run: docker network create phpwasm_default
- run: PHP_VERSION=8.4 make test
test-8-3-shared:
@@ -202,16 +243,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- run: npm install
- run: npm install -g deno@2.5.6
- run: |
echo "set man-db/auto-update false" | sudo debconf-communicate
sudo dpkg-reconfigure man-db
- - run: sudo apt update && sudo apt install docker-compose -y
+ - run: docker compose version
- run: cp .circleci/.env_8.3-shared.ci .env
- run: make image
- - run: docker network create phpwasm_default
- run: PHP_VERSION=8.3 make test
test-8-2-shared:
@@ -219,13 +259,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- run: npm install
- run: npm install -g deno@2.5.6
- - run: sudo apt update && sudo apt install docker-compose -y
+ - run: docker compose version
- run: cp .circleci/.env_8.2-shared.ci .env
- run: make image
- - run: docker network create phpwasm_default
- run: PHP_VERSION=8.2 make test
test-8-1-shared:
@@ -233,16 +272,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- run: npm install
- run: npm install -g deno@2.5.6
- run: |
echo "set man-db/auto-update false" | sudo debconf-communicate
sudo dpkg-reconfigure man-db
- - run: sudo apt update && sudo apt install docker-compose -y
+ - run: docker compose version
- run: cp .circleci/.env_8.1-shared.ci .env
- run: make image
- - run: docker network create phpwasm_default
- run: PHP_VERSION=8.1 make test
test-8-0-shared:
@@ -250,14 +288,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- run: npm install
- run: npm install -g deno@2.5.6
- run: |
echo "set man-db/auto-update false" | sudo debconf-communicate
sudo dpkg-reconfigure man-db
- - run: sudo apt update && sudo apt install docker-compose -y
+ - run: docker compose version
- run: cp .circleci/.env_8.0-shared.ci .env
- run: make image
- - run: docker network create phpwasm_default
- run: PHP_VERSION=8.0 make test
diff --git a/.github/workflows/verify-sdl-step.yaml b/.github/workflows/verify-sdl-step.yaml
new file mode 100644
index 000000000..98596658e
--- /dev/null
+++ b/.github/workflows/verify-sdl-step.yaml
@@ -0,0 +1,43 @@
+name: Verify SDL Step
+
+on:
+ workflow_call:
+ inputs:
+ phpVersion:
+ required: true
+ type: string
+ libType:
+ required: true
+ type: string
+ artifactPattern:
+ required: true
+ type: string
+
+jobs:
+ verify:
+ name: Verify SDL ${{ inputs.phpVersion }} ${{ inputs.libType }}
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out repository code
+ uses: actions/checkout@v6
+
+ - name: Install wabt
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y wabt
+
+ - name: Download Artifact
+ uses: actions/download-artifact@v8
+ with:
+ pattern: ${{ inputs.artifactPattern }}
+ merge-multiple: true
+ path: ./
+
+ - name: Extract Artifact
+ run: |
+ for TAR in ${{ inputs.artifactPattern }}.tar.gz; do
+ tar -xzf ${TAR}
+ done
+
+ - name: Verify PHP (sdl variant) for Web
+ run: ./.github/bin/verify-sdl-main-module.sh ${{ inputs.phpVersion }}
diff --git a/.gitignore b/.gitignore
index 88b877291..142b1f8e2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,63 +1,31 @@
-/php*.js
-/php*.mjs
-/php*.js.br
-/php*.mjs.br
-/php*.js.gz
-/php*.mjs.gz
-/php*.wasm
-/php*.wat
-/php-*.wasm.gz
-/php-*.wasm.br
-/php*.wasm.map
-/php*.data
-/php*.data.gz
-/php*.data.br
-docs-source/app/assets/php*.js
-docs-source/app/assets/php*.wasm
-docs-source/app/assets/php*.wasm.gz
-docs-source/app/assets/php*.wasm.br
-docs-source/app/assets/php*.wat
-docs-source/app/assets/php*.wasm.map
-docs-source/app/assets/php*.data
-docs-source/app/assets/php*.data.gz
-docs-source/app/assets/php*.data.br
-/Php*.js
-/Php*.mjs
-/*.js
-/*.mjs
-/node_modules
-configured
+.DS_Store
.env
-/*-src/
-/docs/*.map
-/.cache
.env*
-packages/**/*.so
-packages/**/*.dat
-emscripten/
-**.generated.mjs
-
-packages/php-wasm/*.map
-packages/php-wasm/*.map.BAK
-packages/php-wasm/build.log
+configured
-packages/php-cli-wasm/*.map
-packages/php-cli-wasm/*.map.BAK
-packages/php-cli-wasm/build.log
+.cache/
+/docs/
+emscripten/
+node_modules/
-packages/php-cgi-wasm/*.map
-packages/php-cgi-wasm/*.map.BAK
-packages/php-cgi-wasm/build.log
+packages/**/*.so
+packages/**/*.dat
+packages/**/*.map
+packages/**/*.log
+packages/**/*.BAK
+packages/**/*.wasm
packages/php-wasm/mapped
packages/php-cli-wasm/mapped
packages/php-cgi-wasm/mapped
-docs/static/media/mapped/*
-demo-web/public/static/media/mapped/*
+demo-web/public/
+demo-web/build/
-.DS_Store
packages/**/index.html
packages/*.tar.gz
-packages/dependencies.json
+packages/**/*.generated.mjs
+
+*.gz
+*.br
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 198f9d85a..6fa670499 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,22 @@
Changes
-## v0.0.9 - Aiming for the (GitHub) Stars
+## v0.1.0 - Aiming for the (GitHub) Stars
+
+* Rebuilt `demo-web` around Vite, reorganized it into `pages`, `components`, `lib`, and `assets`, and added the newer browser/e2e harnesses plus runtime path helpers for the worker and page builds.
+* Added Quickbus-backed browser messaging, a richer `phpdbg` bus session, and a VSCode debugger bridge for the demo app and debugger workflow.
+* Expanded runtime/build coverage across older targets, including `phpdbg`, SDL, and Vrzno support in PHP `8.0` builds. SDL now ships as the `_sdl` runtime variant instead of a separately loaded shared library.
+* Added `version` and `variant` support to `php-tags`, making it possible to select non-default runtimes from static HTML.
+* Standardized the maintained runtime sources on `.mjs` modules and expanded type/JSDoc coverage across `php-wasm`, `php-cgi-wasm`, `php-cli-wasm`, `php-dbg-wasm`, and the extension helper packages.
+* Reworked shared and dynamic extension loading so built-in support libraries, ICU payloads, OpenSSL, libxml/XML, DOM, SimpleXML, XMLReader, and XMLWriter behave consistently across Node, browser, demo, and docs/test harnesses.
+* Suppressed implicit `libxml2.so` loading when it is not provided in `sharedLibs`, which reduces startup download size for minimal runtime configurations.
+* Broadened verification with vendored `php-wasm-site` docs fixtures, split docs/CGI coverage suites, deeper CLI-node PHPT coverage, richer XML/intl/tidy/iconv/sqlite smoke tests, and browser-test race-condition fixes.
+* Tightened the build/test pipeline by preserving `BUILD_TYPE` through CI, adding a dynamic fallback when it is omitted, smoke-testing packaged demo artifacts, centralizing shared-lib resolution, and refreshing the workflow matrix for the newer runtime surface.
+* Improved local workspace and release plumbing with symlink-aware package loading, action-artifact overlay support, and refreshed README/package docs around runtime defaults, versioned `.wasm` assets, extension wiring, interactive CLI/debugger behavior via `waitline`, and Cloudflare D1 setup through `pdo_cfd1`.
+
+## v0.0.9 - Here there be dragons
+
+*Version 0.0.9 is represented by a near endless stream of letter-tagged alpha releases and will be considered officially skipped. The changes in v0.1.0 mostly landed somewhere in this range, but since the API is not stable, here there be dragons.*
* Adding PHP-CGI support!
* Runtime extension loading!
diff --git a/Makefile b/Makefile
index 2b12a8bd9..335b387f1 100755
--- a/Makefile
+++ b/Makefile
@@ -20,6 +20,7 @@ MAKEFLAGS += --no-builtin-rules --no-builtin-variables --warn-undefined-variable
ENV_DIR?=.
ENV_FILE?=.env
-include ${ENV_FILE}
+LIB_TYPE ?=$(shell basename '${ENV_FILE}' | sed -n 's/^\.env_[0-9][0-9.]*\.\([^.]*\)\.ci$$/\1/p')
## PHP Version
PHP_VERSION_DEFAULT=8.4
@@ -38,6 +39,7 @@ WITH_SESSION ?=1
WITH_TOKENIZER?=1
SKIP_SHARED_LIBS?=0
+PRELOAD_ASSETS?=
ifeq ($(filter ${WITH_BCMATH},0 1),)
$(error WITH_BCMATH MUST BE 0 or 1. PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE}))
@@ -93,8 +95,8 @@ ifeq ($(filter ${BROTLI},0 1),)
$(error BROTLI MUST BE 0, 1. PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE}))
endif
-ifeq ($(filter ${PHP_VERSION},8.4 8.3 8.2 8.1 8.0),)
-$(error PHP_VERSION MUST BE 8.4, 8.3, 8.2, 8.1 or 8.0. (got ${PHP_VERSION}) PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE}))
+ifeq ($(filter ${PHP_VERSION},8.5 8.4 8.3 8.2 8.1 8.0),)
+$(error PHP_VERSION MUST BE 8.5, 8.4, 8.3, 8.2, 8.1 or 8.0. (got ${PHP_VERSION}) PLEASE CHECK YOUR SETTINGS FILE: $(abspath ${ENV_FILE}))
endif
EXTRA_MODULES=
@@ -132,9 +134,10 @@ SHELL=bash -euo pipefail
PKG_CONFIG_PATH=/src/lib/lib/pkgconfig
-DOCKER_COMPOSE?=docker-compose
+DOCKER_COMPOSE?=docker compose
CPU_COUNT=`nproc || echo 1`
MAX_LOAD=$(shell echo $$(( `nproc` + $$(( `nproc` / 2 )) )))
+LTO_FLAG?=-flto
DOCKER_ENV=PHP_DIST_DIR=$(realpath ${PHP_DIST_DIR}) ${DOCKER_COMPOSE} -p phpwasm run -T --rm -e PKG_CONFIG_PATH=${PKG_CONFIG_PATH} -e OUTER_UID=${UID}
DOCKER_RUN=${DOCKER_ENV} emscripten-builder
DOCKER_RUN_IN_PHP=${DOCKER_ENV} -w /src/third_party/php${PHP_VERSION}-src/ emscripten-builder
@@ -153,12 +156,19 @@ ARCHIVES=
SHARED_LIBS=
PRE_JS_FILES=source/env.js
EXTRA_PRE_JS_FILES?=
+PRE_JS_CACHE?=
PHPIZE=third_party/php${PHP_VERSION}-src/scripts/phpize
PRE_JS_FILES+= ${EXTRA_PRE_JS_FILES}
TEST_LIST?=
+ifeq (${PHP_VERSION},8.5)
+PHP_VERSION_FULL=8.5.2
+PHP_BRANCH=php-${PHP_VERSION_FULL}
+PHP_AR=libphp
+endif
+
ifeq (${PHP_VERSION},8.4)
PHP_VERSION_FULL=8.4.1
PHP_BRANCH=php-${PHP_VERSION_FULL}
@@ -203,10 +213,6 @@ PHP_ASSET_LIST=
PHP_ASSET_DIR?=${PHP_DIST_DIR}
SHARED_ASSET_PATHS=${PHP_ASSET_DIR}
-ifneq (${PHP_ASSET_DIR},${PHP_DIST_DIR})
-PHP_ASSET_LIST+=
-endif
-
PRELOAD_NAME=php
NOTPARALLEL=
@@ -336,6 +342,7 @@ third_party/php${PHP_VERSION}-src/configured: ${ENV_FILE} ${ARCHIVES} ${PHP_CONF
--disable-all \
--disable-fiber-asm \
--disable-rpath \
+ --disable-opcache-jit \
--without-pear \
--without-pcre-jit \
${CONFIGURE_FLAGS}
@@ -358,12 +365,13 @@ EXTRA_FLAGS+= --source-map-base ${SOURCE_MAP_BASE}
endif
ifneq (${PRE_JS_FILES},)
-EXTRA_FLAGS+= --pre-js /src/.cache/pre.js
+PRE_JS_CACHE:=.cache/pre.$(shell printf '%s\n' '${PRE_JS_FILES}' | sha1sum | cut -d' ' -f1).js
+EXTRA_FLAGS+= --pre-js /src/${PRE_JS_CACHE}
endif
-.cache/pre.js: ${PRE_JS_FILES}
+${PRE_JS_CACHE}: ${PRE_JS_FILES}
ifneq (${PRE_JS_FILES},)
- ${DOCKER_RUN} cat $(addprefix /src/,${PRE_JS_FILES}) > .cache/pre.js
+ ${DOCKER_RUN} cat $(addprefix /src/,${PRE_JS_FILES}) > ${PRE_JS_CACHE}
endif
WEB_FS_TYPE?=-lidbfs.js
@@ -391,12 +399,13 @@ BUILD_FLAGS+=-f ../../php.mk \
SAPI_CGI_PATH='${SAPI_CGI_PATH}' \
SAPI_CLI_PATH='${SAPI_CLI_PATH}'\
BUILD_BINARY='${SAPI_PHPDBG_PATH}'\
+ SAPI_PHPDBG_PATH='${SAPI_PHPDBG_PATH}'\
PHP_CLI_OBJS='${PHP_CLI_OBJS}' \
- EXTRA_CFLAGS=' -Wno-int-conversion -Wimplicit-function-declaration -flto -fPIC ${EXTRA_CFLAGS} ${SYMBOL_FLAGS} '\
- EXTRA_CXXFLAGS=' -Wno-int-conversion -Wimplicit-function-declaration -flto -fPIC ${EXTRA_CFLAGS} ${SYMBOL_FLAGS} '\
+ EXTRA_CFLAGS=' -Wno-int-conversion -Wimplicit-function-declaration ${LTO_FLAG} -fPIC ${EXTRA_CFLAGS} ${SYMBOL_FLAGS} -D HAVE_REALLOCARRAY=1 '\
+ EXTRA_CXXFLAGS=' -Wno-int-conversion -Wimplicit-function-declaration ${LTO_FLAG} -fPIC ${EXTRA_CFLAGS} ${SYMBOL_FLAGS} '\
EXTRA_LDFLAGS_PROGRAM='-O${OPTIMIZE} -static \
-Wl,-zcommon-page-size=2097152 -Wl,-zmax-page-size=2097152 -L/src/lib/lib \
- ${SYMBOL_FLAGS} -flto -fPIC \
+ ${SYMBOL_FLAGS} ${LTO_FLAG} -fPIC \
-s EXPORTED_FUNCTIONS='\''["_malloc", "_free", "_main"]'\'' \
-s EXPORTED_RUNTIME_METHODS='\''["ccall", "UTF8ToString", "lengthBytesUTF8", "stringToUTF8", "getValue", "setValue", "lengthBytesUTF8", "FS", "ENV"]'\'' \
-s INITIAL_MEMORY=${INITIAL_MEMORY} \
@@ -429,7 +438,7 @@ BUILD_FLAGS+=-f ../../php.mk \
BUILD_TYPE ?=js
ifneq (${PRE_JS_FILES},)
-DEPENDENCIES+= .cache/pre.js
+DEPENDENCIES+= ${PRE_JS_CACHE}
endif
HELPER_MJS=${PHP_DIST_DIR}/php-tags.mjs ${PHP_DIST_DIR}/php-tags.jsdelivr.mjs ${PHP_DIST_DIR}/php-tags.local.mjs ${PHP_DIST_DIR}/php-tags.unpkg.mjs
@@ -479,27 +488,59 @@ ALL=${MJS} ${CJS} ${TAG_JS}
tags: ${TAG_JS}
+############### StdLibs ###############
+
+STDLIB_NODE_TARGET=
+STDLIB_WEB_TARGET=
+STDLIB_WORKER_TARGET=
+STDLIB_WEBVIEW_TARGET=
+
+ifneq ($(filter ${WITH_LIBXML},dynamic),)
+ifneq ($(filter ${PHP_VERSION},8.5 8.4 8.3 8.2),)
+STDLIB_NODE_TARGET=packages/php-wasm/stdlib/${PHP_VERSION}-node.mjs
+STDLIB_WEB_TARGET=packages/php-wasm/stdlib/${PHP_VERSION}-web.mjs
+STDLIB_WORKER_TARGET=packages/php-wasm/stdlib/${PHP_VERSION}-worker.mjs
+STDLIB_WEBVIEW_TARGET=packages/php-wasm/stdlib/${PHP_VERSION}-webview.mjs
+endif
+endif
+
+stdlib: ${STDLIB_NODE_TARGET} ${STDLIB_WEB_TARGET} ${STDLIB_WORKER_TARGET} ${STDLIB_WEBVIEW_TARGET}
+
+packages/php-wasm/stdlib/${PHP_VERSION}-node.mjs: ${PHP_DIST_DIR}/php${PHP_VERSION}-node.mjs ${PHP_DIST_DIR}/PhpNode.mjs
+ node demo-node/get-symbols.mjs ${PHP_VERSION} Node > $@
+
+packages/php-wasm/stdlib/${PHP_VERSION}-web.mjs: ${PHP_DIST_DIR}/php${PHP_VERSION}-node.mjs ${PHP_DIST_DIR}/PhpNode.mjs
+ node demo-node/get-symbols.mjs ${PHP_VERSION} Web > $@
+
+packages/php-wasm/stdlib/${PHP_VERSION}-worker.mjs: ${PHP_DIST_DIR}/php${PHP_VERSION}-node.mjs ${PHP_DIST_DIR}/PhpNode.mjs
+ node demo-node/get-symbols.mjs ${PHP_VERSION} Worker > $@
+
+packages/php-wasm/stdlib/${PHP_VERSION}-webview.mjs: ${PHP_DIST_DIR}/php${PHP_VERSION}-node.mjs ${PHP_DIST_DIR}/PhpNode.mjs
+ node demo-node/get-symbols.mjs ${PHP_VERSION} Webview > $@
+
+# Single Builds
+
web-mjs:
$(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${PHP_CONFIGURE_DEPS}
$(MAKE) ${WEB_MJS}
$(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${WEB_MJS_ASSETS}
+ifneq (${STDLIB_WEB_TARGET},)
+ ${MAKE} ${STDLIB_WEB_TARGET}
+endif
@ cat ico.ans >&2
web-js:
$(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${PHP_CONFIGURE_DEPS}
$(MAKE) ${WEB_JS}
$(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${WEB_JS_ASSETS}
-ifneq ($(filter ${PHP_VERSION},8.4 8.3 8.2),)
- ${MAKE} packages/php-wasm/stdlib/${PHP_VERSION}-web.mjs
-endif
@ cat ico.ans >&2
worker-mjs:
$(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${PHP_CONFIGURE_DEPS}
$(MAKE) ${WORKER_MJS}
$(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${WORKER_MJS_ASSETS}
-ifneq ($(filter ${PHP_VERSION},8.4 8.3 8.2),)
- ${MAKE} packages/php-wasm/stdlib/${PHP_VERSION}-worker.mjs
+ifneq (${STDLIB_WORKER_TARGET},)
+ ${MAKE} ${STDLIB_WORKER_TARGET}
endif
@ cat ico.ans >&2
@@ -513,8 +554,8 @@ webview-mjs:
$(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${PHP_CONFIGURE_DEPS}
$(MAKE) ${WEBVIEW_MJS}
$(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${WEBVIEW_MJS_ASSETS}
-ifneq ($(filter ${PHP_VERSION},8.4 8.3 8.2),)
- ${MAKE} packages/php-wasm/stdlib/${PHP_VERSION}-webview.mjs
+ifneq (${STDLIB_WEBVIEW_TARGET},)
+ ${MAKE} ${STDLIB_WEBVIEW_TARGET}
endif
@ cat ico.ans >&2
@@ -528,8 +569,8 @@ node-mjs:
$(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${PHP_CONFIGURE_DEPS}
$(MAKE) ${NODE_MJS}
$(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${NODE_MJS_ASSETS}
-ifneq ($(filter ${PHP_VERSION},8.4 8.3 8.2),)
- ${MAKE} packages/php-wasm/stdlib/${PHP_VERSION}-node.mjs
+ifneq (${STDLIB_NODE_TARGET},)
+ ${MAKE} ${STDLIB_NODE_TARGET}
endif
@ cat ico.ans >&2
@@ -539,7 +580,7 @@ node-js:
$(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${NODE_JS_ASSETS}
@ cat ico.ans >&2
-# You must have one of the above built to use the following step.
+# You must have one of the above "Single Builds" done to use the following step.
# Don't use it unless you're mad at your CPU cooler.
fast-build: third_party/php${PHP_VERSION}-src/main/main.o
$(MAKE) -j${CPU_COUNT} -l${CPU_COUNT} \
@@ -773,14 +814,13 @@ ${PHP_DIST_DIR}/php${PHP_SUFFIX}-webview.mjs.wasm.map.MAPPED: ${PHP_DIST_DIR}/ph
########## Package files ###########
-${PHP_DIST_DIR}/%.js: source/%.js
+${PHP_DIST_DIR}/%.js: source/%.mjs
npx babel $< --out-dir ${PHP_DIST_DIR}
- perl -pi -w -e 's|import.meta|(undefined /*import.meta*/)|' ${PHP_DIST_DIR}/$(notdir $@)
- perl -pi -w -e 's|require\("(\..+?)"\)|require("\1.js")|' ${PHP_DIST_DIR}/$(notdir $@)
+ perl -pi -w -e 's|import.meta|(undefined /*import.meta*/)|g' ${PHP_DIST_DIR}/$(notdir $@)
+ perl -pi -w -e 's|require\("(\..+?).mjs"\)|require("\1.js")|g' ${PHP_DIST_DIR}/$(notdir $@)
-${PHP_DIST_DIR}/%.mjs: source/%.js
+${PHP_DIST_DIR}/%.mjs: source/%.mjs
cp $< $@;
- perl -pi -w -e "s~\b(import.+ from )(['\"])(?!node\:)([^'\"]+)\2~\1\2\3.mjs\2~g" $@;
${PHP_DIST_DIR}/php-tags.mjs: source/php-tags.mjs
cp $< $@;
@@ -794,22 +834,6 @@ ${PHP_DIST_DIR}/php-tags.unpkg.mjs: source/php-tags.unpkg.mjs
${PHP_DIST_DIR}/php-tags.local.mjs: source/php-tags.local.mjs
cp $< $@;
-############### StdLibs ###############
-
-stdlib: packages/php-wasm/stdlib/${PHP_VERSION}-node.mjs packages/php-wasm/stdlib/${PHP_VERSION}-web.mjs packages/php-wasm/stdlib/${PHP_VERSION}-worker.mjs packages/php-wasm/stdlib/${PHP_VERSION}-webview.mjs
-
-packages/php-wasm/stdlib/${PHP_VERSION}-node.mjs: ${PHP_DIST_DIR}/php${PHP_VERSION}-node.mjs ${PHP_DIST_DIR}/PhpNode.mjs
- BUILD_TYPE=${WITH_LIBXML} node demo-node/get-symbols.mjs ${PHP_VERSION} Node > $@
-
-packages/php-wasm/stdlib/${PHP_VERSION}-web.mjs: ${PHP_DIST_DIR}/php${PHP_VERSION}-node.mjs ${PHP_DIST_DIR}/PhpNode.mjs
- BUILD_TYPE=${WITH_LIBXML} node demo-node/get-symbols.mjs ${PHP_VERSION} Web > $@
-
-packages/php-wasm/stdlib/${PHP_VERSION}-worker.mjs: ${PHP_DIST_DIR}/php${PHP_VERSION}-node.mjs ${PHP_DIST_DIR}/PhpNode.mjs
- BUILD_TYPE=${WITH_LIBXML} node demo-node/get-symbols.mjs ${PHP_VERSION} Worker > $@
-
-packages/php-wasm/stdlib/${PHP_VERSION}-webview.mjs: ${PHP_DIST_DIR}/php${PHP_VERSION}-node.mjs ${PHP_DIST_DIR}/PhpNode.mjs
- BUILD_TYPE=${WITH_LIBXML} node demo-node/get-symbols.mjs ${PHP_VERSION} Webview > $@
-
########### Clerical stuff. ###########
${ENV_FILE}:
@@ -822,7 +846,6 @@ shared:
$(MAKE) -j${CPU_COUNT} -l${MAX_LOAD} ${SHARED_LIBS}
assets: $(foreach P,$(sort ${SHARED_ASSET_PATHS}),$(addprefix ${P}/,${PHP_ASSET_LIST}))
-# @ echo $(foreach P,$(sort ${SHARED_ASSET_PATHS}),$(addprefix ${P}/,${PHP_ASSET_LIST}))
deps:
${MAKE} -j${CPU_COUNT} -l${MAX_LOAD} ${ARCHIVES} ${PHP_CONFIGURE_DEPS}
@@ -843,6 +866,10 @@ third_party/php${PHP_VERSION}-src/scripts/phpize-built: ${DEPENDENCIES} | ${ORDE
${DOCKER_RUN_IN_PHP} chmod +x scripts/phpize
${DOCKER_RUN_IN_PHP} touch scripts/phpize-built
+patch/php8.5.patch:
+ bash -c 'cd third_party/php8.5-src/ && git diff > ../../patch/php8.5.patch'
+ perl -pi -w -e 's|([ab])/|\1/third_party/php8.5-src/|g' ./patch/php8.5.patch
+
patch/php8.4.patch:
bash -c 'cd third_party/php8.4-src/ && git diff > ../../patch/php8.4.patch'
perl -pi -w -e 's|([ab])/|\1/third_party/php8.4-src/|g' ./patch/php8.4.patch
@@ -879,12 +906,20 @@ php-clean:
sapi/cli/php \
sapi/cgi/php-cgi'
${DOCKER_RUN} bash -c 'rm -f \
- packages/php-wasm/php-*.mjs \
- packages/php-cgi-wasm/php-*.mjs \
- packages/php-wasm/php-*.wasm \
- packages/php-cgi-wasm/php-*.wasm \
+ packages/php-wasm/php${PHP_VERSION}-*.mjs \
+ packages/php-cgi-wasm/php${PHP_VERSION}-*.mjs \
+ packages/php-cli-wasm/php${PHP_VERSION}-*.mjs \
+ packages/php-dbg-wasm/php${PHP_VERSION}-*.mjs \
+ packages/php-wasm/php${PHP_VERSION}-*.wasm \
+ packages/php-cgi-wasm/php${PHP_VERSION}-*.wasm \
+ packages/php-cli-wasm/php${PHP_VERSION}-*.wasm \
+ packages/php-dbg-wasm/php${PHP_VERSION}-*.wasm \
packages/php-wasm/Php*.mjs \
- packages/php-cgi-wasm/Php*.mjs'
+ packages/php-cgi-wasm/Php*.mjs' \
+ packages/php-cli-wasm/Php*.mjs' \
+ packages/php-dbg-wasm/Php*.mjs'
+ ${DOCKER_RUN} rm -rf lib/include/lexbor
+ ${DOCKER_RUN} rm -rf third_party/php${PHP_VERSION}-src/ext/yaml
${DOCKER_RUN} bash -c 'ls third_party/ | grep "php${PHP_VERSION}-.*" | while read DIR; do { \
cd "third_party/$${DIR}"; \
make clean; \
@@ -927,7 +962,7 @@ clean:
packages/php-cli-wasm/*.mjs* \
third_party/php${PHP_VERSION}-src/configured \
third_party/preload \
- .cache/pre.js \
+ .cache/pre*.js \
.cache/preload-collected
${MAKE} php-clean
@@ -961,26 +996,127 @@ save-image:
mkdir -p ./image
docker image save seanmorris/php-emscripten-builder -o ./image/builder.tar
+NPM_PUBLISH_TAG?=latest
NPM_PUBLISH_DRY?=--dry-run
publish:
- npm publish ${NPM_PUBLISH_DRY}
+ ./publish-packages.sh ${NPM_PUBLISH_TAG} ${NPM_PUBLISH_DRY}
test:
${MAKE} test-node
-ifneq ($(filter ${PHP_VERSION},8.4 8.3 8.2),)
+ifneq ($(filter ${PHP_VERSION},8.5 8.4 8.3 8.2),)
${MAKE} test-deno
endif
NODE_TEST_FLAGS=
+DOC_TESTS=
+DOC_TESTS_CJS=
+PACKAGING_TESTS=test/packaging.test.mjs
+
+ifdef SKIP_PACKAGING_TEST
+ifeq (${SKIP_PACKAGING_TEST},1)
+PACKAGING_TESTS=
+endif
+endif
+
+ifeq (${LIB_TYPE},dynamic)
+DOC_TESTS+=test/docs.test.mjs
+DOC_TESTS+=test/docs-cgi.test.mjs
+DOC_TESTS_CJS+=test/docs.test.cjs
+endif
+
+test-node: node-mjs node-cgi-mjs
+ PHP_VERSION=${PHP_VERSION} \
+ PHP_VARIANT=${PHP_VARIANT} \
+ LIB_TYPE=${LIB_TYPE} \
+ WITH_LIBXML=${WITH_LIBXML} \
+ WITH_LIBZIP=${WITH_LIBZIP} \
+ WITH_ICONV=${WITH_ICONV} \
+ WITH_SQLITE=${WITH_SQLITE} \
+ WITH_GD=${WITH_GD} \
+ WITH_PHAR=${WITH_PHAR} \
+ WITH_ZLIB=${WITH_ZLIB} \
+ WITH_LIBPNG=${WITH_LIBPNG} \
+ WITH_FREETYPE=${WITH_FREETYPE} \
+ WITH_LIBJPEG=${WITH_LIBJPEG} \
+ WITH_DOM=${WITH_DOM} \
+ WITH_SIMPLEXML=${WITH_SIMPLEXML} \
+ WITH_XML=${WITH_XML} \
+ WITH_XMLREADER=${WITH_XMLREADER} \
+ WITH_XMLWRITER=${WITH_XMLWRITER} \
+ WITH_YAML=${WITH_YAML} \
+ WITH_TIDY=${WITH_TIDY} \
+ WITH_MBSTRING=${WITH_MBSTRING} \
+ WITH_ONIGURUMA=${WITH_ONIGURUMA} \
+ WITH_OPENSSL=${WITH_OPENSSL} \
+ WITH_SDL=${WITH_SDL} \
+ WITH_INTL=${WITH_INTL} node ${NODE_TEST_FLAGS} --test ${TEST_LIST} ${DOC_TESTS} ${PACKAGING_TESTS} `find test -maxdepth 1 -name '*.mjs' ! -name 'docs.test.mjs' ! -name 'docs-cgi.test.mjs' ! -name 'packaging.test.mjs' | sort`
+
+test-node-standard: node-mjs node-cgi-mjs node-cli-mjs node-dbg-mjs
+ PHP_VERSION=${PHP_VERSION} \
+ PHP_VARIANT=${PHP_VARIANT} \
+ LIB_TYPE=${LIB_TYPE} \
+ WITH_LIBXML=${WITH_LIBXML} \
+ WITH_LIBZIP=${WITH_LIBZIP} \
+ WITH_ICONV=${WITH_ICONV} \
+ WITH_SQLITE=${WITH_SQLITE} \
+ WITH_GD=${WITH_GD} \
+ WITH_PHAR=${WITH_PHAR} \
+ WITH_ZLIB=${WITH_ZLIB} \
+ WITH_LIBPNG=${WITH_LIBPNG} \
+ WITH_FREETYPE=${WITH_FREETYPE} \
+ WITH_LIBJPEG=${WITH_LIBJPEG} \
+ WITH_DOM=${WITH_DOM} \
+ WITH_SIMPLEXML=${WITH_SIMPLEXML} \
+ WITH_XML=${WITH_XML} \
+ WITH_XMLREADER=${WITH_XMLREADER} \
+ WITH_XMLWRITER=${WITH_XMLWRITER} \
+ WITH_YAML=${WITH_YAML} \
+ WITH_TIDY=${WITH_TIDY} \
+ WITH_MBSTRING=${WITH_MBSTRING} \
+ WITH_ONIGURUMA=${WITH_ONIGURUMA} \
+ WITH_OPENSSL=${WITH_OPENSSL} \
+ WITH_SDL=${WITH_SDL} \
+ WITH_INTL=${WITH_INTL} node ${NODE_TEST_FLAGS} --test ${TEST_LIST} ${DOC_TESTS} ${PACKAGING_TESTS} \
+ `find test -maxdepth 1 -name '*.mjs' ! -name 'docs.test.mjs' ! -name 'docs-cgi.test.mjs' ! -name 'packaging.test.mjs' | sort` \
+ test/cli-node/cli-node.test.mjs \
+ test/dbg-node/dbg-node.test.mjs
+
+test-node-cjs: node-js
+ PHP_VERSION=${PHP_VERSION} \
+ PHP_VARIANT=${PHP_VARIANT} \
+ LIB_TYPE=${LIB_TYPE} \
+ WITH_LIBXML=${WITH_LIBXML} \
+ WITH_LIBZIP=${WITH_LIBZIP} \
+ WITH_ICONV=${WITH_ICONV} \
+ WITH_SQLITE=${WITH_SQLITE} \
+ WITH_GD=${WITH_GD} \
+ WITH_PHAR=${WITH_PHAR} \
+ WITH_ZLIB=${WITH_ZLIB} \
+ WITH_LIBPNG=${WITH_LIBPNG} \
+ WITH_FREETYPE=${WITH_FREETYPE} \
+ WITH_LIBJPEG=${WITH_LIBJPEG} \
+ WITH_DOM=${WITH_DOM} \
+ WITH_SIMPLEXML=${WITH_SIMPLEXML} \
+ WITH_XML=${WITH_XML} \
+ WITH_XMLREADER=${WITH_XMLREADER} \
+ WITH_XMLWRITER=${WITH_XMLWRITER} \
+ WITH_YAML=${WITH_YAML} \
+ WITH_TIDY=${WITH_TIDY} \
+ WITH_MBSTRING=${WITH_MBSTRING} \
+ WITH_ONIGURUMA=${WITH_ONIGURUMA} \
+ WITH_OPENSSL=${WITH_OPENSSL} \
+ WITH_SDL=${WITH_SDL} \
+ WITH_INTL=${WITH_INTL} node ${NODE_TEST_FLAGS} --test ${TEST_LIST} ${DOC_TESTS_CJS} `find test -maxdepth 1 -name '*.cjs' ! -name 'docs.test.cjs' ! -name 'docs-cgi.test.cjs' | sort`
-test-node: node-mjs
+test-node-cjs-standard: node-js node-cli-js node-dbg-js
PHP_VERSION=${PHP_VERSION} \
PHP_VARIANT=${PHP_VARIANT} \
+ LIB_TYPE=${LIB_TYPE} \
WITH_LIBXML=${WITH_LIBXML} \
WITH_LIBZIP=${WITH_LIBZIP} \
WITH_ICONV=${WITH_ICONV} \
- WITH_SQLITE=${WITH_ICONV} \
+ WITH_SQLITE=${WITH_SQLITE} \
WITH_GD=${WITH_GD} \
WITH_PHAR=${WITH_PHAR} \
WITH_ZLIB=${WITH_ZLIB} \
@@ -990,21 +1126,27 @@ test-node: node-mjs
WITH_DOM=${WITH_DOM} \
WITH_SIMPLEXML=${WITH_SIMPLEXML} \
WITH_XML=${WITH_XML} \
+ WITH_XMLREADER=${WITH_XMLREADER} \
+ WITH_XMLWRITER=${WITH_XMLWRITER} \
WITH_YAML=${WITH_YAML} \
WITH_TIDY=${WITH_TIDY} \
WITH_MBSTRING=${WITH_MBSTRING} \
WITH_ONIGURUMA=${WITH_ONIGURUMA} \
WITH_OPENSSL=${WITH_OPENSSL} \
WITH_SDL=${WITH_SDL} \
- WITH_INTL=${WITH_INTL} node ${NODE_TEST_FLAGS} --test ${TEST_LIST} `ls test/*.mjs`
+ WITH_INTL=${WITH_INTL} node ${NODE_TEST_FLAGS} --test ${TEST_LIST} ${DOC_TESTS_CJS} \
+ `find test -maxdepth 1 -name '*.cjs' ! -name 'docs.test.cjs' ! -name 'docs-cgi.test.cjs' | sort` \
+ test/cli-node/cli-node.test.cjs \
+ test/dbg-node/dbg-node.test.cjs
-test-deno: node-mjs
+test-deno: node-mjs node-cgi-mjs
PHP_VERSION=${PHP_VERSION} \
PHP_VARIANT=${PHP_VARIANT} \
+ LIB_TYPE=${LIB_TYPE} \
WITH_LIBXML=${WITH_LIBXML} \
WITH_LIBZIP=${WITH_LIBZIP} \
WITH_ICONV=${WITH_ICONV} \
- WITH_SQLITE=${WITH_ICONV} \
+ WITH_SQLITE=${WITH_SQLITE} \
WITH_GD=${WITH_GD} \
WITH_PHAR=${WITH_PHAR} \
WITH_ZLIB=${WITH_ZLIB} \
@@ -1014,24 +1156,137 @@ test-deno: node-mjs
WITH_DOM=${WITH_DOM} \
WITH_SIMPLEXML=${WITH_SIMPLEXML} \
WITH_XML=${WITH_XML} \
+ WITH_XMLREADER=${WITH_XMLREADER} \
+ WITH_XMLWRITER=${WITH_XMLWRITER} \
WITH_YAML=${WITH_YAML} \
WITH_TIDY=${WITH_TIDY} \
WITH_MBSTRING=${WITH_MBSTRING} \
WITH_ONIGURUMA=${WITH_ONIGURUMA} \
WITH_OPENSSL=${WITH_OPENSSL} \
WITH_SDL=${WITH_SDL} \
- WITH_INTL=${WITH_INTL} deno test ${TEST_LIST} `ls test/*.mjs` --allow-read --allow-write --allow-env --allow-net --allow-sys
+ WITH_INTL=${WITH_INTL} deno test ${TEST_LIST} ${DOC_TESTS} ${PACKAGING_TESTS} `find test -maxdepth 1 -name '*.mjs' ! -name 'docs.test.mjs' ! -name 'docs-cgi.test.mjs' ! -name 'packaging.test.mjs' | sort` --allow-read --allow-write --allow-env --allow-net --allow-sys --allow-run=npm
test-browser:
- PHP_VERSION=${PHP_VERSION} PHP_VARIANT=${PHP_VARIANT} BUILD_TYPE=${BUILD_TYPE} REACT_APP_BUILD_TYPE=${BUILD_TYPE} test/browser-test.sh
+ PHP_VERSION=${PHP_VERSION} PHP_VARIANT=${PHP_VARIANT} LIB_TYPE=${LIB_TYPE} test/browser-test.sh
+
+DEMO_WEB_PHP_VERSION ?= 8.4
+
+test-demo-web:
+ PHP_VERSION=${DEMO_WEB_PHP_VERSION} LIB_TYPE=${LIB_TYPE} DEMO_WEB_ARTIFACT_ROOT=${DEMO_WEB_ARTIFACT_ROOT} test/demo-web-test.sh
+
+test-cgi-node: node-mjs node-cgi-mjs
+ PHP_VERSION=${PHP_VERSION} \
+ LIB_TYPE=${LIB_TYPE} \
+ WITH_LIBXML=${WITH_LIBXML} \
+ WITH_LIBZIP=${WITH_LIBZIP} \
+ WITH_ICONV=${WITH_ICONV} \
+ WITH_SQLITE=${WITH_SQLITE} \
+ WITH_GD=${WITH_GD} \
+ WITH_PHAR=${WITH_PHAR} \
+ WITH_ZLIB=${WITH_ZLIB} \
+ WITH_LIBPNG=${WITH_LIBPNG} \
+ WITH_FREETYPE=${WITH_FREETYPE} \
+ WITH_LIBJPEG=${WITH_LIBJPEG} \
+ WITH_DOM=${WITH_DOM} \
+ WITH_SIMPLEXML=${WITH_SIMPLEXML} \
+ WITH_XML=${WITH_XML} \
+ WITH_XMLREADER=${WITH_XMLREADER} \
+ WITH_XMLWRITER=${WITH_XMLWRITER} \
+ WITH_YAML=${WITH_YAML} \
+ WITH_TIDY=${WITH_TIDY} \
+ WITH_MBSTRING=${WITH_MBSTRING} \
+ WITH_ONIGURUMA=${WITH_ONIGURUMA} \
+ WITH_OPENSSL=${WITH_OPENSSL} \
+ WITH_SDL=${WITH_SDL} \
+ WITH_INTL=${WITH_INTL} test/node-cgi-test.sh
+ifeq (${LIB_TYPE},dynamic)
+ PHP_VERSION=${PHP_VERSION} \
+ LIB_TYPE=${LIB_TYPE} \
+ WITH_LIBXML=${WITH_LIBXML} \
+ WITH_LIBZIP=${WITH_LIBZIP} \
+ WITH_ICONV=${WITH_ICONV} \
+ WITH_SQLITE=${WITH_SQLITE} \
+ WITH_GD=${WITH_GD} \
+ WITH_PHAR=${WITH_PHAR} \
+ WITH_ZLIB=${WITH_ZLIB} \
+ WITH_LIBPNG=${WITH_LIBPNG} \
+ WITH_FREETYPE=${WITH_FREETYPE} \
+ WITH_LIBJPEG=${WITH_LIBJPEG} \
+ WITH_DOM=${WITH_DOM} \
+ WITH_SIMPLEXML=${WITH_SIMPLEXML} \
+ WITH_XML=${WITH_XML} \
+ WITH_XMLREADER=${WITH_XMLREADER} \
+ WITH_XMLWRITER=${WITH_XMLWRITER} \
+ WITH_YAML=${WITH_YAML} \
+ WITH_TIDY=${WITH_TIDY} \
+ WITH_MBSTRING=${WITH_MBSTRING} \
+ WITH_ONIGURUMA=${WITH_ONIGURUMA} \
+ WITH_OPENSSL=${WITH_OPENSSL} \
+ WITH_SDL=${WITH_SDL} \
+ WITH_INTL=${WITH_INTL} node --test test/docs-cgi.test.mjs
+endif
+
+test-cgi-node-cjs: node-js node-cgi-js
+ PHP_VERSION=${PHP_VERSION} \
+ LIB_TYPE=${LIB_TYPE} \
+ WITH_LIBXML=${WITH_LIBXML} \
+ WITH_LIBZIP=${WITH_LIBZIP} \
+ WITH_ICONV=${WITH_ICONV} \
+ WITH_SQLITE=${WITH_SQLITE} \
+ WITH_GD=${WITH_GD} \
+ WITH_PHAR=${WITH_PHAR} \
+ WITH_ZLIB=${WITH_ZLIB} \
+ WITH_LIBPNG=${WITH_LIBPNG} \
+ WITH_FREETYPE=${WITH_FREETYPE} \
+ WITH_LIBJPEG=${WITH_LIBJPEG} \
+ WITH_DOM=${WITH_DOM} \
+ WITH_SIMPLEXML=${WITH_SIMPLEXML} \
+ WITH_XML=${WITH_XML} \
+ WITH_XMLREADER=${WITH_XMLREADER} \
+ WITH_XMLWRITER=${WITH_XMLWRITER} \
+ WITH_YAML=${WITH_YAML} \
+ WITH_TIDY=${WITH_TIDY} \
+ WITH_MBSTRING=${WITH_MBSTRING} \
+ WITH_ONIGURUMA=${WITH_ONIGURUMA} \
+ WITH_OPENSSL=${WITH_OPENSSL} \
+ WITH_SDL=${WITH_SDL} \
+ WITH_INTL=${WITH_INTL} \
+ TEST_FORMAT=cjs test/node-cgi-test.sh
+ifeq (${LIB_TYPE},dynamic)
+ PHP_VERSION=${PHP_VERSION} \
+ LIB_TYPE=${LIB_TYPE} \
+ WITH_LIBXML=${WITH_LIBXML} \
+ WITH_LIBZIP=${WITH_LIBZIP} \
+ WITH_ICONV=${WITH_ICONV} \
+ WITH_SQLITE=${WITH_SQLITE} \
+ WITH_GD=${WITH_GD} \
+ WITH_PHAR=${WITH_PHAR} \
+ WITH_ZLIB=${WITH_ZLIB} \
+ WITH_LIBPNG=${WITH_LIBPNG} \
+ WITH_FREETYPE=${WITH_FREETYPE} \
+ WITH_LIBJPEG=${WITH_LIBJPEG} \
+ WITH_DOM=${WITH_DOM} \
+ WITH_SIMPLEXML=${WITH_SIMPLEXML} \
+ WITH_XML=${WITH_XML} \
+ WITH_XMLREADER=${WITH_XMLREADER} \
+ WITH_XMLWRITER=${WITH_XMLWRITER} \
+ WITH_YAML=${WITH_YAML} \
+ WITH_TIDY=${WITH_TIDY} \
+ WITH_MBSTRING=${WITH_MBSTRING} \
+ WITH_ONIGURUMA=${WITH_ONIGURUMA} \
+ WITH_OPENSSL=${WITH_OPENSSL} \
+ WITH_SDL=${WITH_SDL} \
+ WITH_INTL=${WITH_INTL} node --test test/docs-cgi.test.cjs
+endif
update-snapshots:
- PHP_VERSION=${PHP_VERSION} PHP_VARIANT=${PHP_VARIANT} BUILD_TYPE=${BUILD_TYPE} REACT_APP_BUILD_TYPE=${BUILD_TYPE} CV_UPDATE_SNAPSHOTS=1 test/browser-test.sh
+ PHP_VERSION=${PHP_VERSION} PHP_VARIANT=${PHP_VARIANT} LIB_TYPE=${LIB_TYPE} UPDATE_SNAPSHOTS=1 test/browser-test.sh
run:
${DOCKER_ENV} emscripten-builder bash
all-versions:
+ ${MAKE} PHP_VERSION=8.5
${MAKE} PHP_VERSION=8.4
${MAKE} PHP_VERSION=8.3
${MAKE} PHP_VERSION=8.2
@@ -1039,11 +1294,13 @@ all-versions:
${MAKE} PHP_VERSION=8.0
all-stdlibs:
+ ${MAKE} stdlib PHP_VERSION=8.5
${MAKE} stdlib PHP_VERSION=8.4
${MAKE} stdlib PHP_VERSION=8.3
${MAKE} stdlib PHP_VERSION=8.2
test-all-versions:
+ ${MAKE} test PHP_VERSION=8.5
${MAKE} test PHP_VERSION=8.4
${MAKE} test PHP_VERSION=8.3
${MAKE} test PHP_VERSION=8.2
@@ -1051,6 +1308,7 @@ test-all-versions:
${MAKE} test PHP_VERSION=8.0
x-all-versions:
+ ${MAKE} ${X} PHP_VERSION=8.5
${MAKE} ${X} PHP_VERSION=8.4
${MAKE} ${X} PHP_VERSION=8.3
${MAKE} ${X} PHP_VERSION=8.2
@@ -1058,6 +1316,7 @@ x-all-versions:
${MAKE} ${X} PHP_VERSION=8.0
php-clean-all-versions:
+ ${MAKE} php-clean PHP_VERSION=8.5
${MAKE} php-clean PHP_VERSION=8.4
${MAKE} php-clean PHP_VERSION=8.3
${MAKE} php-clean PHP_VERSION=8.2
@@ -1065,12 +1324,7 @@ php-clean-all-versions:
${MAKE} php-clean PHP_VERSION=8.0
demo-versions:
- rm -f third_party/php8.4-src/configured
- rm -f third_party/php8.3-src/configured
- rm -f third_party/php8.2-src/configured
- rm -f third_party/php8.1-src/configured
- rm -f third_party/php8.0-src/configured
-
+ ${MAKE} web-mjs PHP_VERSION=8.5 WITH_SDL=1
${MAKE} web-mjs PHP_VERSION=8.4 WITH_SDL=1
${MAKE} web-mjs PHP_VERSION=8.3 WITH_SDL=1
${MAKE} web-mjs PHP_VERSION=8.2 WITH_SDL=1
@@ -1079,6 +1333,7 @@ demo-versions:
${MAKE} worker-cgi-mjs web-cli-mjs web-dbg-mjs PHP_VERSION=8.3 WITH_SDL=0
+ ${MAKE} web-mjs PHP_VERSION=8.5 WITH_SDL=0
${MAKE} web-mjs PHP_VERSION=8.4 WITH_SDL=0
${MAKE} web-mjs PHP_VERSION=8.3 WITH_SDL=0
${MAKE} web-mjs PHP_VERSION=8.2 WITH_SDL=0
@@ -1092,10 +1347,10 @@ reconfigure:
rebuild:
${DOCKER_RUN} touch third_party/php${PHP_VERSION}-src/configured
-demo: web-mjs worker-cgi-mjs web-dbg-mjs packages/sdl/libSDL2.so
+demo: web-mjs worker-cgi-mjs web-dbg-mjs
npm run build --prefix ./demo-web
-serve-demo: web-mjs worker-cgi-mjs web-dbg-mjs packages/sdl/libSDL2.so
+serve-demo: web-mjs worker-cgi-mjs web-dbg-mjs
npm run start --prefix ./demo-web
-null:
\ No newline at end of file
+null:
diff --git a/README.md b/README.md
index e332e7c2e..df4511c55 100644
--- a/README.md
+++ b/README.md
@@ -6,61 +6,43 @@
_PHP in WebAssembly, npm not required._
-## [npm](https://npmjs.com/package/php-wasm) | [github](https://github.com/seanmorris/php-wasm) | [unpkg](https://unpkg.com/browse/php-wasm/) | [reddit](https://www.reddit.com/r/phpwasm) | [discord](https://discord.gg/j8VZzju7gJ)
-
+[npm](https://npmjs.com/package/php-wasm) | [github](https://github.com/seanmorris/php-wasm) | [unpkg](https://unpkg.com/browse/php-wasm/) | [reddit](https://www.reddit.com/r/phpwasm) | [discord](https://discord.gg/j8VZzju7gJ)
+
+## 📦 Current Packages
-## 🌟 v0.0.9-alpha - Aiming for the (GitHub) Stars
-
-* Adding PHP-CGI & PH-DBG support!
-* Faster build time!
-* Runtime extension loading!
-* libicu, freetype, zlib, gd, libpng, libjpeg, openssl, & phar support.
-* php-wasm, php-cgi-wasm, & php-wasm-builder are now separate packages.
-* [Vrzno](https://github.com/seanmorris/vrzno) now facilitates url fopen via the fetch() api.
-* [pdo_cfd1](https://github.com/seanmorris/pdo-cfd1) is now a separate extension from Vrzno.
-* [pdo_pglite](https://github.com/seanmorris/pdo-pglite) adds local Postgres support.
-* SQLite is now using version 3.46.
-* Demos for CodeIgniter, CakePHP, Laravel & Laminas.
-* Drupal & all other demos now use standard build + zip install.
-* Modules are now webpack-compatible out of the box.
-* Exposing FS methods w/queueing & locking to sync files between tabs & workers.
-* Fixed the bug with POST requests under Firefox.
-* Adding support for PHP 8.3.11 & 8.4.1.
-* Automatic CI testing for PHP 8.0, 8.1, 8.2, 8.3, & 8.4.
+* `php-wasm`, `php-cgi-wasm`, `php-cli-wasm`, `php-dbg-wasm`, and `php-wasm-builder` are published separately.
+* Published runtimes currently cover PHP `8.0` through `8.5`, depending on the package and entrypoint.
+* `php-wasm`, `php-cgi-wasm`, and `php-dbg-wasm` currently default to PHP `8.4`; `php-cli-wasm` currently defaults to PHP `8.3`. Pass `version` explicitly when your asset filenames need to line up.
+* Runtime-loadable libraries are available for `gd`, `iconv`, `intl`, `libxml`, `xml`, `dom`, `simplexml`, `yaml`, `zip`, `mbstring`, `openssl`, `phar`, `sqlite`, and `zlib`.
+* [Vrzno](https://github.com/seanmorris/vrzno), [pdo_cfd1](https://github.com/seanmorris/pdo-cfd1), and [pdo_pglite](https://github.com/seanmorris/pdo-pglite) are maintained as separate packages.
[changelog](https://raw.githubusercontent.com/seanmorris/php-wasm/master/CHANGELOG.md)
-Installing php-wasm:
-
-```sh
-$ npm i php-wasm@alpha
-```
-
-Installing php-cgi-wasm:
-
-```sh
-$ npm i php-cgi-wasm@alpha
-```
-Installing php-wasm-builder:
+Install the packages you need:
```sh
-$ npm i php-wasm-builder@alpha
+$ npm i php-wasm
+$ npm i php-cgi-wasm
+$ npm i php-cli-wasm
+$ npm i php-dbg-wasm
+$ npm i php-wasm-builder
```
## ☀️ Examples
@@ -130,7 +112,7 @@ $ npm i php-wasm-builder@alpha
## 🎩 Introducing php-cgi-wasm!
-Version 0.0.9 adds `php-cgi-wasm` to the mix. This allows you to run php in web-server mode, similar to how it runs under apache or nginx. Running within a Service Worker, it can intercept and respond to HTTP requests just like a normal webserver. This means the browser can simply navigate to a URL, and PHP will generate the page, and everything will work as-normal, AJAX and all. From the perspective of the webpage, its just making HTTP requests. Its not worried about whether the PHP runs on the server or in a Service Worker.
+`php-cgi-wasm` runs PHP in web-server mode, similar to Apache or nginx. Running within a Service Worker, it can intercept and respond to HTTP requests just like a normal web server. This means the browser can simply navigate to a URL and let PHP generate the page, with AJAX and other in-page requests still flowing over normal HTTP.
### Install the php-cgi-wasm package
@@ -163,9 +145,9 @@ self.addEventListener('fetch', event => php.handleFetchEvent(event));
self.addEventListener('message', event => php.handleMessageEvent(event));
```
-You can see examples of php-cgi-wasm running in a service worker and nodejs in [`demo-web/src/cgi-worker.mjs`](demo-web/src/cgi-worker.mjs) & [`demo-node/index.mjs`](demo-node/index.mjs) respectively.
+You can see examples of `php-cgi-wasm` running in a service worker and Node.js in [`demo-web/src/cgi-worker.mjs`](demo-web/src/cgi-worker.mjs) and [`demo-node/index.mjs`](demo-node/index.mjs) respectively.
-***Note:*** `php-cgi-wasm` & `php-wasm` are separate packages. One "embeds" php right into your javascript, the other runs in "cgi-mode," just like php would under apache or nginx.
+***Note:*** `php-cgi-wasm` and `php-wasm` are separate packages. One embeds PHP directly into your JavaScript runtime; the other runs in CGI mode, like PHP under Apache or nginx.
You can find documentation specific to php-cgi-wasm [here](packages/php-cgi-wasm).
@@ -177,14 +159,7 @@ Install php-wasm with npm:
$ npm install php-wasm
```
-Include the module in your preferred format:
-
-### Common JS
-
-```javascript
-const { PhpWeb } = require('php-wasm/PhpWeb.js');
-const php = new PhpWeb;
-```
+Include the module:
### ESM
@@ -207,33 +182,47 @@ const php = new PhpWeb;
##### unpkg
```javascript
-const { PhpWeb } = await import('https://www.unpkg.com/php-wasm/php-wasm/PhpWeb.mjs');
+const { PhpWeb } = await import('https://unpkg.com/php-wasm/PhpWeb.mjs');
const php = new PhpWeb;
```
#### Pre-Packaged Static Assets:
-If you're using a bundler, use the vendor's documentation to learn how to move the files matching the following pattern to your public directory:
+If you're using a bundler, use the vendor's documentation to move the versioned `.wasm` file that matches the runtime, PHP version, and module format you import. For example:
```bash
-node_modules/php-wasm/php-web.mjs.wasm
-node_modules/php-wasm/php-worker.mjs.wasm # ONLY if you're running the standard build in a worker
+node_modules/php-wasm/php8.4-web.mjs.wasm
+node_modules/php-wasm/php8.4-worker.mjs.wasm # ONLY if you're running the standard build in a worker
```
-For php-cgi-wasm:
+For `php-cgi-wasm`:
+
```bash
-node_modules/php-cgi-wasm/php-cgi-worker.mjs.wasm
-node_modules/php-cgi-wasm/php-cgi-web.mjs.wasm # ONLY if you're running the cgi build in a page
+node_modules/php-cgi-wasm/php8.4-cgi-node.mjs.wasm # ONLY if you're running the CGI build in Node.js
+node_modules/php-cgi-wasm/php8.4-cgi-worker.mjs.wasm # ONLY if you're running the CGI build in a worker
```
+If you import a different runtime version, copy the matching `php8.x-*.mjs.wasm` file as well.
+
+Core Node runtimes support both ESM and CommonJS.
+
+For `0.1.0`, use the published entrypoints across the runtime packages:
+
+- `php-wasm/PhpNode`
+- `php-cgi-wasm/PhpCgiNode`
+- `php-cli-wasm/PhpCliNode`
+- `php-dbg-wasm/PhpDbgNode`
+
+Browser/runtime helper entrypoints such as `PhpWeb` and `php-tags` remain ESM-first.
+
## 🍎 Quickstart
### Inline PHP
-Include the `php-tags.js` script from a CDN:
+Include the `php-tags` module from a CDN:
```html
-
+
```
And run some PHP right in the page!
@@ -245,10 +234,10 @@ And run some PHP right in the page!
```
-Inline php can use standard input, output and error with `data-` attributes. Just set the value of the attribute to a selector that will match that tag.
+Inline PHP can use standard input, output, and error with `data-` attributes. Set each attribute value to a selector that matches the corresponding element.
```html
-
+
@@ -265,7 +254,7 @@ The `src` attribute can be used on `
+
@@ -281,19 +270,19 @@ The `src` attribute can be used on `
+
```
##### Unpkg
```html
-
+
```
## 🥤 Running PHP & Taking Output
@@ -336,16 +325,18 @@ const exitCode = await php.run('
+
```
+The example above assumes the default `php-tags` runtime version (`8.4`). If you set `data-version` to something else, update the `php8.x-*.so` filenames to match.
+
## ⚙️ Configuration
You can pass in the `ini` property to the constructor to add lines to `/php.ini`:
@@ -382,7 +373,7 @@ PHP will replace strings in INI files in the form `${ENVIRONMENT_VARIABLE}` with
extension=php${PHP_VERSION}-phar.so
```
-Remember to correctly escape the `$` if you're supplying the INI from Javascript with ``backtics``:
+Remember to correctly escape the `$` if you're supplying the INI from JavaScript with backticks:
```javascript
const php = new PhpWeb({ini: `
@@ -395,12 +386,13 @@ const php = new PhpWeb({ini: `
### Loading extensions at runtime
-The following extensions may be loaded at runtime. This allows the shared extension & their dependencies to be cached, re-used, and selected a-la-carte for each application.
+The following extensions may be loaded at runtime. This allows the shared extensions and their dependencies to be cached, reused, and selected a la carte for each application.
* gd (https://www.npmjs.com/package/php-wasm-gd)
* iconv (https://www.npmjs.com/package/php-wasm-iconv)
* intl (https://www.npmjs.com/package/php-wasm-intl)
-* xml (https://www.npmjs.com/package/php-wasm-libxml)
+* libxml (https://www.npmjs.com/package/php-wasm-libxml)
+* xml (https://www.npmjs.com/package/php-wasm-xml)
* dom (https://www.npmjs.com/package/php-wasm-dom)
* simplexml (https://www.npmjs.com/package/php-wasm-simplexml)
* yaml (https://www.npmjs.com/package/php-wasm-libyaml)
@@ -416,25 +408,27 @@ There are two ways to load extensions at runtime, using the `dl()` function or `
```php
`/my/static/path/${filename}`});
### IDBFS (Web & Worker)
-To use IDBFS in PhpWeb, pass a `persist` object with a `mountPath` key.
+To use IDBFS in `PhpWeb`, pass a `persist` object with a `mountPath` key.
`mountPath` will be used as the path to the persistent directory within the PHP environment.
@@ -559,17 +589,23 @@ const { PhpWeb } = await import('https://cdn.jsdelivr.net/npm/php-wasm/PhpWeb.mj
const php = new PhpWeb({persist: {mountPath: '/persist'}});
```
-### NodeFS (NodeJS Only)
+### NodeFS (Node.js Only)
-To use NodeFS in PhpWeb, pass a `persist` object with `mountPath` & `localPath` keys.
+To use NodeFS in `PhpNode`, pass a `persist` object with `mountPath` and `localPath` keys.
`localPath` will be used as the path to the HOST directory to expose to PHP.
`mountPath` will be used as the path to the persistent directory within the PHP environment.
```javascript
-const { PhpNode } = await import('https://cdn.jsdelivr.net/npm/php-wasm/PhpNode.mjs');
+import path from 'node:path';
+import { PhpNode } from 'php-wasm/PhpNode';
-const php = new PhpNode({persist: {mountPath: '/persist', localPath: '~/your-files'}});
+const php = new PhpNode({
+ persist: {
+ mountPath: '/persist',
+ localPath: path.join(process.cwd(), 'persist'),
+ }
+});
```
## 📁 Filesystem Operations
@@ -595,7 +631,7 @@ await php.analyzePath(path);
#### php.readdir
-Get a list of files and folders in or directory.
+Get a list of files and folders in a directory.
```javascript
await php.readdir(path);
@@ -642,7 +678,7 @@ await php.rmdir(path);
Delete a file.
```javascript
-await php.rmdir(path);
+await php.unlink(path);
```
#### php.rename
@@ -669,11 +705,11 @@ await php.writeFile(path, data, {encoding: 'utf8'});
**Web and Worker only!**
-The web and worker build use `navigator.locks.request` to request a lock named `php-wasm-fs-lock` before performing filesystem operations. This ensure multiple tabs & the service worker can interact with the filesystem without overwriting eachother's work. Before any FS operation takes place, the entire FS is loaded from IDBFS, and before the lock is released, the entire FS is laoded BACK into IDBFS.
+The web and worker builds use `navigator.locks.request` to request a lock named `php-wasm-fs-lock` before performing filesystem operations. This ensures multiple tabs and the service worker can interact with the filesystem without overwriting each other's work. Before any filesystem operation takes place, the entire FS is loaded from IDBFS, and before the lock is released, the entire FS is loaded back into IDBFS.
-The operations are enqueued asyncronously, **so if multiple requests are generated before one transaction closes, they will be batched automatically.** This also applies to multiple requests generated before the lock is acquired. There is generally no need to take explicit control of FS mirroring.
+The operations are enqueued asynchronously, **so if multiple requests are generated before one transaction closes, they will be batched automatically.** This also applies to multiple requests generated before the lock is acquired. There is generally no need to take explicit control of FS mirroring.
-To suppress this behavior and take explicit control of the FS mirroring, you can pass the `{autoTransaction: false}` option to the constructor. Doing this will require you to call `php.startTransaction()` before any FS operations take place, and then`php.commitTransaction()` when you're done. **Using this incorrectly may leave your filesystem in a corrupted state.**
+To suppress this behavior and take explicit control of FS mirroring, you can pass the `{autoTransaction: false}` option to the constructor. Doing this requires you to call `php.startTransaction()` before any FS operations take place, and then `php.commitTransaction()` when you're done. **Using this incorrectly may leave your filesystem in a corrupted state.**
#### php.startTransaction
@@ -689,9 +725,9 @@ await php.commitTransaction();
### msg-bus
-There is a `msg-bus` module supplied by `php-cgi-wasm` as a helper to communicate with php running inside a worker. The module exposes two functions: `sendMessageFor` and `onMessage`.
+There is a `msg-bus` module supplied by `php-cgi-wasm` as a helper to communicate with PHP running inside a worker. The module exposes two functions: `sendMessageFor` and `onMessage`.
-This allows you to simply `await` the result of calls to file system methods (see above) on the service worker:
+This lets you simply `await` the result of calls to filesystem methods (see above) on the service worker:
```javascript
const result = await sendMessage(methodName, [param, param, param]);
@@ -703,7 +739,7 @@ const result = await sendMessage(methodName, [param, param, param]);
* Use `sendMessageFor` to **GENERATE A FUNCTION** that you can use to send messages to your service worker.
```javascript
-import { onMessage, sendMessageFor } from `php-cgi-wasm/msg-bus`;
+import { onMessage, sendMessageFor } from 'php-cgi-wasm/msg-bus';
const SERVICE_WORKER_SCRIPT_URL = '/cgi-worker.mjs';
@@ -782,7 +818,7 @@ $ php-wasm-builder build web cgi mjs
$ php-wasm-builder build worker cgi mjs
```
-This will build the package inside of the current directory (or in `PHP_DIST_DIR`, *see below for more info.*)
+This will build the package inside the current directory (or in `PHP_DIST_DIR`, *see below for more info.*)
### .php-wasm-rc
@@ -790,7 +826,7 @@ You can also create a `.php-wasm-rc` file in this directory to customize the bui
```make
# Select a PHP version
-PHP_VERSION=8.3
+PHP_VERSION=8.4
# Build the package to a directory other than the current one (RELATIVE path)
PHP_DIST_DIR=./public
@@ -816,7 +852,7 @@ INITIAL_MEMORY=2048MB
ASSERTIONS=0
# Select the optimization level
-OPTIMIZATION=3
+OPTIMIZE=3
# Build with extensions
WITH_GD=1
@@ -833,19 +869,19 @@ The following options may appear in `.php-wasm-rc`.
##### PHP_VERSION
-8.0|8.1|8.2|**8.3**
+8.0|8.1|8.2|8.3|**8.4**|8.5
---
##### PHP_DIST_DIR
-This is the directory where javascript & wasm files will be built to, *relative to the current directory.*
+This is the directory where JavaScript and wasm files will be built, *relative to the current directory.*
---
##### PHP_ASSET_DIR
-This is the directory where shared libs, extension, `.data` files & other supporting files will be built to, *relative to the current directory.* Defaults to `PHP_DIST_DIR`.
+This is the directory where preload `.data` / `.dat` files and other supporting assets will be built, *relative to the current directory.* Shared libraries and side modules remain in their owning packages. Defaults to `PHP_DIST_DIR`.
---
@@ -857,7 +893,7 @@ The optimization level to use while compiling.
---
-##### SUBOPTIMIZE
+##### SUB_OPTIMIZE
The optimization level to use while compiling libraries. Defaults to `OPTIMIZE`.
@@ -887,7 +923,7 @@ As stated above, extensions may be compiled as `dynamic`, `shared`, or `static`.
(defaults provided below in **bold**)
-The following options are availavle for building static PHP extensions:
+The following options are available for building static PHP extensions:
```
WITH_BCMATH # [0, 1] Enabled by default
@@ -897,9 +933,10 @@ WITH_EXIF # [0, 1] Enabled by default
WITH_FILTER # [0, 1] Enabled by default
WITH_TOKENIZER # [0, 1] Enabled by default
WITH_VRZNO # [0, 1] Enabled by default
+WITH_WAITLINE # [0, 1] Disabled by default in raw custom builds
```
-The following extension may be compiled as static, shared or dynamic:
+The following extensions may be compiled as static, shared, or dynamic:
```
WITH_PHAR # [0, 1, static, dynamic]
@@ -937,9 +974,9 @@ When compiled as a `dynamic` extension, this will produce the extension file `ph
static|**shared**
-This actual `php-libxml` extension must be statically compiled, but `libxml` itself may be loaded as a shared library.
+The `libxml` extension itself must be statically compiled, but `libxml2` may be loaded as a shared library.
-When compiled as a `shared` library, it will produce the library `libxml.so`.
+When compiled as a `shared` library, it will produce the library `libxml2.so`.
---
@@ -947,7 +984,7 @@ When compiled as a `shared` library, it will produce the library `libxml.so`.
static|shared|**dynamic**
-When compiled as a `dynamic` extension, this will produce the extension `php-8.x-zip.so`.
+When compiled as a `dynamic` extension, this will produce the extension `php8.x-zip.so`.
When compiled as a `dynamic` or `shared` extension, it will produce the library `libzip.so`.
@@ -959,7 +996,7 @@ This extension depends on `zlib`.
static|shared|**dynamic**
-When compiled as a `dynamic` extension, this will produce the extension `php-8.x-iconv.so`.
+When compiled as a `dynamic` extension, this will produce the extension `php8.x-iconv.so`.
When compiled as a `dynamic` or `shared` extension, it will produce the library `libiconv.so`.
@@ -969,7 +1006,7 @@ When compiled as a `dynamic` or `shared` extension, it will produce the library
static|shared|**dynamic**
-When compiled as a `dynamic` extension, this will produce the extensions `php-8.x-sqlite.so`, & `php-8.x-pdo-sqlite.so`.
+When compiled as a `dynamic` extension, this will produce the extensions `php8.x-sqlite.so` and `php8.x-pdo-sqlite.so`.
When compiled as a `dynamic` or `shared` extension, it will produce the library `libsqlite3.so`.
@@ -979,9 +1016,9 @@ When compiled as a `dynamic` or `shared` extension, it will produce the library
static|**dynamic**
-This extenstion makes use of `freetype`, `libjpeg`, `libpng`, & `zlib`.
+This extension makes use of `freetype`, `libjpeg`, `libpng`, and `zlib`.
-When compiled as a `dynamic` extension, this will produce the extension `php-8.x-gd.so`.
+When compiled as a `dynamic` extension, this will produce the extension `php8.x-gd.so`.
###### WITH_LIBPNG
@@ -1013,7 +1050,7 @@ If WITH_GD is dynamic, then loading will be deferred until after gd is loaded.
static|shared|**dynamic**
-When compiled as a `dynamic` extension, this will produce the extension `php-8.x-zlib.so`.
+When compiled as a `dynamic` extension, this will produce the extension `php8.x-zlib.so`.
When compiled as a `dynamic` or `shared` extension, it will produce the library `libz.so`.
@@ -1023,7 +1060,7 @@ When compiled as a `dynamic` or `shared` extension, it will produce the library
static|shared|**dynamic**
-When compiled as a `dynamic` extension, this will produce the extension `php-8.x-yaml.so`.
+When compiled as a `dynamic` extension, this will produce the extension `php8.x-yaml.so`.
When compiled as a `dynamic` or `shared` extension, it will produce the library `libyaml.so`.
@@ -1033,7 +1070,7 @@ When compiled as a `dynamic` or `shared` extension, it will produce the library
static|shared|**dynamic**
-When compiled as a `dynamic` extension, this will produce the extension `php-8.x-tidy.so`.
+When compiled as a `dynamic` extension, this will produce the extension `php8.x-tidy.so`.
When compiled as a `dynamic` or `shared` extension, it will produce the library `libtidy.so`.
@@ -1043,7 +1080,7 @@ When compiled as a `dynamic` or `shared` extension, it will produce the library
static|**dynamic**
-When compiled as a `dynamic` extension, this will produce the extension `php-8.x-mbstring.so`.
+When compiled as a `dynamic` extension, this will produce the extension `php8.x-mbstring.so`.
---
@@ -1053,7 +1090,7 @@ static|shared|**dynamic**
Support library for `mbstring`.
-When compiled as a `dynamic` or `shared ` library, this will produce the library `libonig.so`.
+When compiled as a `dynamic` or `shared` library, this will produce the library `libonig.so`.
If `WITH_MBSTRING` is `dynamic`, then loading will be deferred until after `mbstring` is loaded.
@@ -1063,7 +1100,7 @@ If `WITH_MBSTRING` is `dynamic`, then loading will be deferred until after `mbst
shared|**dynamic**
-When compiled as a `dynamic` extension, this will produce the extension `php-8.x-openssl`.
+When compiled as a `dynamic` extension, this will produce the extension `php8.x-openssl.so`.
When compiled as a `dynamic` or `shared` extension, it will produce the libraries `libssl.so` & `libcrypto.so`.
@@ -1071,7 +1108,7 @@ When compiled as a `dynamic` or `shared` extension, it will produce the librarie
static|shared|**dynamic**
-When compiled as a `dynamic`, or `shared` extension, this will produce the extension `php-8.x-intl.so` & the following libraries:
+When compiled as a `dynamic` or `shared` extension, this will produce the extension `php8.x-intl.so` and the following libraries:
* libicuuc.so
* libicutu.so
@@ -1087,7 +1124,7 @@ When compiled as a `dynamic`, or `shared` extension, this will produce the exten
#### php-wasm-builder build
-Use this to build custom version of php-wasm. Its recommended to build this to an empty directory using a `.php-wasm-rc` file.
+Use this to build a custom version of `php-wasm`. It's recommended to build into an empty directory using a `.php-wasm-rc` file.
```bash
npx php-wasm-builder build
@@ -1103,7 +1140,7 @@ npx php-wasm-builder image
#### php-wasm-builder copy-assets
-This will scan the current package's node_modules directory for shared libraries & supporting files, and copy them to `PHP_ASSET_DIR`.
+This will scan the current package's `node_modules` directory for supporting data files, and copy them to `PHP_ASSET_DIR`.
You can use this with `.php-wasm-rc` to copy assets even if you're not using a custom build.
@@ -1113,7 +1150,7 @@ npx php-wasm-builder copy-assets
#### php-wasm-builder build-assets
-Similar to `copy-assets`, but will actually compile the shared libaries, then copy them to `PHP_ASSET_DIR`.
+Similar to `copy-assets`, but will build the supporting asset files described by `.php-wasm-rc`, then copy them to `PHP_ASSET_DIR`.
You can use this with `.php-wasm-rc` to copy assets even if you're not using a custom build.
diff --git a/bin/docs-snippet-report.js b/bin/docs-snippet-report.js
new file mode 100644
index 000000000..72a2b4f64
--- /dev/null
+++ b/bin/docs-snippet-report.js
@@ -0,0 +1,10 @@
+#!/usr/bin/env node
+
+(async () => {
+ const { buildDocsCoverageReport } = await import('../test/docs/report.mjs');
+ const report = await buildDocsCoverageReport();
+ process.stdout.write(JSON.stringify(report, null, 2) + '\n');
+})().catch(error => {
+ console.error(error);
+ process.exit(1);
+});
diff --git a/bin/translate-test.js b/bin/translate-test.js
index 9d652ef4f..8e8af9e73 100644
--- a/bin/translate-test.js
+++ b/bin/translate-test.js
@@ -5,6 +5,7 @@ const { parseArgs } = require('node:util');
const parsedArgs = parseArgs({allowPositionals:true, options: {
file: { type: 'string' }
, phpVersion: { type: 'string' }
+ , libType: { type: 'string', default: 'shared' }
, buildType: { type: 'string', default: 'shared' }
}}).values;
@@ -36,6 +37,7 @@ async function translate()
console.log(`import { test } from 'node:test';
import { strict as assert } from 'node:assert';
import { PhpNode } from '../../../packages/php-wasm/PhpNode.mjs';
+import { nodeRuntimeOptions } from '../../../test/lib/node-runtime-options.mjs';
test(${JSON.stringify(String(sections.TEST).trim())}, async () => {
const sharedLibs = [];
@@ -50,7 +52,7 @@ test(${JSON.stringify(String(sections.TEST).trim())}, async () => {
const files = [];
process.env.WITH_INTL === 'dynamic' && files.push({parent: '/preload/', name: 'icudt72l.dat', url: './node_modules/php-wasm-intl/icudt72l.dat'});
- const php = new PhpNode( { sharedLibs, files, persist: { mountPath: '/persist', localPath: process.cwd() + '/test/' } } );
+ const php = new PhpNode(nodeRuntimeOptions({ sharedLibs, files, persist: { mountPath: '/persist', localPath: process.cwd() + '/test/' } }));
let stdOut = '', stdErr = '';
diff --git a/demo-node/get-symbols.mjs b/demo-node/get-symbols.mjs
index 7df069837..6400c512b 100644
--- a/demo-node/get-symbols.mjs
+++ b/demo-node/get-symbols.mjs
@@ -2,44 +2,8 @@
import { PhpNode } from 'php-wasm/PhpNode.mjs';
import fs from 'node:fs';
-const sharedLibs = [];
-const buildType = process.env.BUILD_TYPE ?? 'dynamic';
-
-if(buildType === 'static')
-{
- sharedLibs.push(
- {name: 'libcrypto.so', url: new URL('node_modules/php-wasm-openssl/libcrypto.so', import.meta.url)},
- {name: 'libssl.so', url: new URL('node_modules/php-wasm-openssl/libssl.so', import.meta.url)},
- );
-}
-else if(buildType === 'shared')
-{
- sharedLibs.push(
- {name: 'libxml2.so', url: new URL('node_modules/php-wasm-libxml/libxml2.so', import.meta.url)},
-
- {name: 'libz.so', url: new URL('node_modules/php-wasm-zlib/libz.so', import.meta.url)},
- {name: 'libzip.so', url: new URL('node_modules/php-wasm-libzip/libzip.so', import.meta.url)},
- {name: 'libfreetype.so', url: new URL('node_modules/php-wasm-gd/libfreetype.so', import.meta.url)},
- {name: 'libjpeg.so', url: new URL('node_modules/php-wasm-gd/libjpeg.so', import.meta.url)},
- {name: 'libwebp.so', url: new URL('node_modules/php-wasm-gd/libwebp.so', import.meta.url)},
- {name: 'libpng.so', url: new URL('node_modules/php-wasm-gd/libpng.so', import.meta.url)},
- {name: 'libiconv.so', url: new URL('node_modules/php-wasm-iconv/libiconv.so', import.meta.url)},
- {name: 'libicuuc.so', url: new URL('node_modules/php-wasm-intl/libicuuc.so', import.meta.url)},
- {name: 'libicutu.so', url: new URL('node_modules/php-wasm-intl/libicutu.so', import.meta.url)},
- {name: 'libicutest.so', url: new URL('node_modules/php-wasm-intl/libicutest.so', import.meta.url)},
- {name: 'libicuio.so', url: new URL('node_modules/php-wasm-intl/libicuio.so', import.meta.url)},
- {name: 'libicui18n.so', url: new URL('node_modules/php-wasm-intl/libicui18n.so', import.meta.url)},
- {name: 'libicudata.so', url: new URL('node_modules/php-wasm-intl/libicudata.so', import.meta.url)},
- {name: 'libcrypto.so', url: new URL('node_modules/php-wasm-openssl/libcrypto.so', import.meta.url)},
- {name: 'libssl.so', url: new URL('node_modules/php-wasm-openssl/libssl.so', import.meta.url)},
- {name: 'libonig.so', url: new URL('node_modules/php-wasm-mbstring/libonig.so', import.meta.url)},
- {name: 'libsqlite3.so', url: new URL('node_modules/php-wasm-sqlite/libsqlite3.so', import.meta.url)},
- {name: 'libtidy.so', url: new URL('node_modules/php-wasm-tidy/libtidy.so', import.meta.url)},
- {name: 'libyaml.so', url: new URL('node_modules/php-wasm-yaml/libyaml.so', import.meta.url)},
- );
-}
const [version, envName] = process.argv.slice(2);
-const php = new PhpNode({version, envName, sharedLibs, buildType});
+const php = new PhpNode({ version, envName });
php.addEventListener('output', event => console.log(event.detail.map(line => line.replace(/\s+$/, '')).join('')));
php.addEventListener('error', event => console.log(event.detail.map(line => line.replace(/\s+$/, '')).join('')));
diff --git a/demo-node/index.mjs b/demo-node/index.mjs
index afc98db34..93d17d910 100755
--- a/demo-node/index.mjs
+++ b/demo-node/index.mjs
@@ -2,26 +2,59 @@
import http from 'node:http';
import { PhpCgiNode } from 'php-cgi-wasm/PhpCgiNode.mjs';
+const libType = process.env.LIB_TYPE ?? process.env.BUILD_TYPE ?? 'dynamic';
+const sharedLibs = [];
+
+if(libType === 'dynamic')
+{
+ sharedLibs.push(
+ await import('php-wasm-intl')
+ , await import('php-wasm-libxml')
+ , await import('php-wasm-phar')
+ , await import('php-wasm-mbstring')
+ , await import('php-wasm-openssl')
+ , await import('php-wasm-dom')
+ , await import('php-wasm-xml')
+ , await import('php-wasm-simplexml')
+ , await import('php-wasm-sqlite')
+ , await import('php-wasm-zlib')
+ , await import('php-wasm-gd')
+ );
+}
+else if(libType === 'shared')
+{
+ sharedLibs.push(
+ {name: 'libxml2.so', url: new URL('node_modules/php-wasm-libxml/libxml2.so', import.meta.url)},
+ {name: 'libz.so', url: new URL('node_modules/php-wasm-zlib/libz.so', import.meta.url)},
+ {name: 'libzip.so', url: new URL('node_modules/php-wasm-libzip/libzip.so', import.meta.url)},
+ {name: 'libfreetype.so', url: new URL('node_modules/php-wasm-gd/libfreetype.so', import.meta.url)},
+ {name: 'libjpeg.so', url: new URL('node_modules/php-wasm-gd/libjpeg.so', import.meta.url)},
+ {name: 'libwebp.so', url: new URL('node_modules/php-wasm-gd/libwebp.so', import.meta.url)},
+ {name: 'libpng.so', url: new URL('node_modules/php-wasm-gd/libpng.so', import.meta.url)},
+ {name: 'libiconv.so', url: new URL('node_modules/php-wasm-iconv/libiconv.so', import.meta.url)},
+ {name: 'libicuuc.so', url: new URL('node_modules/php-wasm-intl/libicuuc.so', import.meta.url)},
+ {name: 'libicutu.so', url: new URL('node_modules/php-wasm-intl/libicutu.so', import.meta.url)},
+ {name: 'libicutest.so', url: new URL('node_modules/php-wasm-intl/libicutest.so', import.meta.url)},
+ {name: 'libicuio.so', url: new URL('node_modules/php-wasm-intl/libicuio.so', import.meta.url)},
+ {name: 'libicui18n.so', url: new URL('node_modules/php-wasm-intl/libicui18n.so', import.meta.url)},
+ {name: 'libicudata.so', url: new URL('node_modules/php-wasm-intl/libicudata.so', import.meta.url)},
+ {name: 'libcrypto.so', url: new URL('node_modules/php-wasm-openssl/libcrypto.so', import.meta.url)},
+ {name: 'libssl.so', url: new URL('node_modules/php-wasm-openssl/libssl.so', import.meta.url)},
+ {name: 'libonig.so', url: new URL('node_modules/php-wasm-mbstring/libonig.so', import.meta.url)},
+ {name: 'libsqlite3.so', url: new URL('node_modules/php-wasm-sqlite/libsqlite3.so', import.meta.url)},
+ {name: 'libtidy.so', url: new URL('node_modules/php-wasm-tidy/libtidy.so', import.meta.url)},
+ {name: 'libyaml.so', url: new URL('node_modules/php-wasm-yaml/libyaml.so', import.meta.url)},
+ );
+}
const php = new PhpCgiNode({
- prefix: '/php-wasm/cgi-bin/'
+ version: process.env.PHP_VERSION ?? '8.3'
+ , sharedLibs
+ , prefix: '/php-wasm/cgi-bin/'
, docroot: '/persist/www'
, persist: [
{mountPath: '/persist' , localPath: './persist'}
, {mountPath: '/config' , localPath: './config'}
]
- , sharedLibs: [
- // await import('php-wasm-intl')
- // , await import('php-wasm-libxml')
- // , await import('php-wasm-phar')
- // , await import('php-wasm-mbstring')
- // , await import('php-wasm-openssl')
- // , await import('php-wasm-dom')
- // , await import('php-wasm-xml')
- // , await import('php-wasm-simplexml')
- // , await import('php-wasm-sqlite')
- // , await import('php-wasm-zlib')
- // , await import('php-wasm-gd')
- ]
, types: {
jpeg: 'image/jpeg'
, jpg: 'image/jpeg'
diff --git a/demo-node/package-lock.json b/demo-node/package-lock.json
index 733c3456c..3d52a8d17 100644
--- a/demo-node/package-lock.json
+++ b/demo-node/package-lock.json
@@ -31,30 +31,39 @@
}
},
"../packages/dom": {
+ "name": "php-wasm-dom",
"version": "0.0.9-alpha-33"
},
"../packages/gd": {
+ "name": "php-wasm-gd",
"version": "0.0.9-alpha-33"
},
"../packages/iconv": {
+ "name": "php-wasm-iconv",
"version": "0.0.9-alpha-33"
},
"../packages/intl": {
+ "name": "php-wasm-intl",
"version": "0.0.9-alpha-33"
},
"../packages/libxml": {
+ "name": "php-wasm-libxml",
"version": "0.0.9-alpha-33"
},
"../packages/libyaml": {
+ "name": "php-wasm-yaml",
"version": "0.0.9-alpha-33"
},
"../packages/libzip": {
+ "name": "php-wasm-libzip",
"version": "0.0.9-alpha-33"
},
"../packages/mbstring": {
+ "name": "php-wasm-mbstring",
"version": "0.0.9-alpha-33"
},
"../packages/openssl": {
+ "name": "php-wasm-openssl",
"version": "0.0.9-alpha-33"
},
"../packages/pdo-pglite": {
@@ -64,6 +73,7 @@
}
},
"../packages/phar": {
+ "name": "php-wasm-phar",
"version": "0.0.9-alpha-33"
},
"../packages/php-cgi-wasm": {
@@ -83,18 +93,23 @@
"license": "Apache-2.0"
},
"../packages/simplexml": {
+ "name": "php-wasm-simplexml",
"version": "0.0.9-alpha-33"
},
"../packages/sqlite": {
+ "name": "php-wasm-sqlite",
"version": "0.0.9-alpha-33"
},
"../packages/tidy": {
+ "name": "php-wasm-tidy",
"version": "0.0.9-alpha-33"
},
"../packages/xml": {
+ "name": "php-wasm-xml",
"version": "0.0.9-alpha-33"
},
"../packages/zlib": {
+ "name": "php-wasm-zlib",
"version": "0.0.9-alpha-33"
},
"node_modules/pdo-pglite": {
diff --git a/demo-node/persist/symbols.php b/demo-node/persist/symbols.php
index 5a2a6cd45..72a7362f6 100644
--- a/demo-node/persist/symbols.php
+++ b/demo-node/persist/symbols.php
@@ -1,11 +1,5 @@
import { Php=vrzno_env('envName')?> } from '../Php=vrzno_env('envName')?>.mjs';
-const sharedLibs = [
-
- {name: 'libcrypto.so', url: new URL('php-wasm-openssl/libcrypto.so', import.meta.url)},
- {name: 'libssl.so', url: new URL('php-wasm-openssl/libssl.so', import.meta.url)},
-
-];
-const php = new Php=vrzno_env('envName')?>({version: '=vrzno_env('version')?>', sharedLibs, ini: `error_reporting = E_ALL ^ E_DEPRECATED`});
+const php = new Php=vrzno_env('envName')?>({version: '=vrzno_env('version')?>', ini: `error_reporting = E_ALL ^ E_DEPRECATED`});
php.addEventListener('output', event => console.log(event.detail.map(line => line.replace(/\s+$/, '')).join('')));
php.addEventListener('error', event => console.error(event.detail.map(line => line.replace(/\s+$/, '')).join('')));
$val):
diff --git a/demo-node/persist/www/index.php b/demo-node/persist/www/index.php
index b834b1b2e..7394d45f8 100644
--- a/demo-node/persist/www/index.php
+++ b/demo-node/persist/www/index.php
@@ -42,6 +42,8 @@