summaryrefslogtreecommitdiffhomepage
path: root/vhosts/blog/public/posts/2023-10-02/compile-php-runtime-to-wasm
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-03-29 00:47:55 +0900
committernsfisis <nsfisis@gmail.com>2025-03-29 00:55:14 +0900
commitd30dfc89bf1b673b2fdc0638766b930adaec228c (patch)
tree739d8826451947adfeb526ef1adeb1db397a9af4 /vhosts/blog/public/posts/2023-10-02/compile-php-runtime-to-wasm
parentf65ec15aaf8fc46685c39d721cab82f64baead8c (diff)
downloadnsfisis.dev-d30dfc89bf1b673b2fdc0638766b930adaec228c.tar.gz
nsfisis.dev-d30dfc89bf1b673b2fdc0638766b930adaec228c.tar.zst
nsfisis.dev-d30dfc89bf1b673b2fdc0638766b930adaec228c.zip
feat(blog/nuldoc): migrate syntax highlighter from highlight.js to shiki.js
Diffstat (limited to 'vhosts/blog/public/posts/2023-10-02/compile-php-runtime-to-wasm')
-rw-r--r--vhosts/blog/public/posts/2023-10-02/compile-php-runtime-to-wasm/index.html243
1 files changed, 130 insertions, 113 deletions
diff --git a/vhosts/blog/public/posts/2023-10-02/compile-php-runtime-to-wasm/index.html b/vhosts/blog/public/posts/2023-10-02/compile-php-runtime-to-wasm/index.html
index 0e00dead..35252f62 100644
--- a/vhosts/blog/public/posts/2023-10-02/compile-php-runtime-to-wasm/index.html
+++ b/vhosts/blog/public/posts/2023-10-02/compile-php-runtime-to-wasm/index.html
@@ -14,8 +14,7 @@
<meta property="og:locale" content="ja_JP">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>PHP の処理系を Emscripten で WebAssembly にコンパイルする|REPL: Rest-Eat-Program Loop</title>
- <link rel="stylesheet" href="/style.css?h=79020a898c7052f79b32e90376a4497d">
- <link rel="stylesheet" href="/hl.css?h=340e65ffd5c17713efc9107c06304f7b">
+ <link rel="stylesheet" href="/style.css?h=60eb349e583f5bd51518a7eb98598043">
</head>
<body class="single">
<header class="header">
@@ -111,18 +110,20 @@
先にこの記事のゴールを示しておく。これから示す手順のとおりに進めると、次のようなコードが動くようになる。このコードはこのあと使うので、<code>index.mjs</code> の名前で保存しておくこと。
</p>
- <pre class="highlight" language="javascript"><code class="highlight"><span class="hljs-keyword">import</span> { readFile } <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;node:fs/promises&#x27;</span>;
-<span class="hljs-keyword">import</span> <span class="hljs-title class_">PHPWasm</span> <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;./php-wasm.mjs&#x27;</span>
-
-<span class="hljs-keyword">const</span> code = <span class="hljs-keyword">await</span> <span class="hljs-title function_">readFile</span>(<span class="hljs-string">&#x27;/dev/stdin&#x27;</span>, { <span class="hljs-attr">encoding</span>: <span class="hljs-string">&#x27;utf-8&#x27;</span> });
-
-<span class="hljs-keyword">const</span> { ccall } = <span class="hljs-keyword">await</span> <span class="hljs-title class_">PHPWasm</span>();
-<span class="hljs-keyword">const</span> result = <span class="hljs-title function_">ccall</span>(
- <span class="hljs-string">&#x27;php_wasm_run&#x27;</span>,
- <span class="hljs-string">&#x27;number&#x27;</span>, [<span class="hljs-string">&#x27;string&#x27;</span>],
- [code],
-);
-<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`exit code: <span class="hljs-subst">${result}</span>`</span>);</code></pre>
+ <div class="codeblock" language="javascript">
+ <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">import</span><span style="color:#24292E"> { readFile } </span><span style="color:#D73A49">from</span><span style="color:#032F62"> 'node:fs/promises'</span><span style="color:#24292E">;</span></span>
+<span class="line"><span style="color:#D73A49">import</span><span style="color:#24292E"> PHPWasm </span><span style="color:#D73A49">from</span><span style="color:#032F62"> './php-wasm.mjs'</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#D73A49">const</span><span style="color:#005CC5"> code</span><span style="color:#D73A49"> =</span><span style="color:#D73A49"> await</span><span style="color:#6F42C1"> readFile</span><span style="color:#24292E">(</span><span style="color:#032F62">'/dev/stdin'</span><span style="color:#24292E">, { encoding: </span><span style="color:#032F62">'utf-8'</span><span style="color:#24292E"> });</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#D73A49">const</span><span style="color:#24292E"> { </span><span style="color:#005CC5">ccall</span><span style="color:#24292E"> } </span><span style="color:#D73A49">=</span><span style="color:#D73A49"> await</span><span style="color:#6F42C1"> PHPWasm</span><span style="color:#24292E">();</span></span>
+<span class="line"><span style="color:#D73A49">const</span><span style="color:#005CC5"> result</span><span style="color:#D73A49"> =</span><span style="color:#6F42C1"> ccall</span><span style="color:#24292E">(</span></span>
+<span class="line"><span style="color:#032F62"> 'php_wasm_run'</span><span style="color:#24292E">,</span></span>
+<span class="line"><span style="color:#032F62"> 'number'</span><span style="color:#24292E">, [</span><span style="color:#032F62">'string'</span><span style="color:#24292E">],</span></span>
+<span class="line"><span style="color:#24292E"> [code],</span></span>
+<span class="line"><span style="color:#24292E">);</span></span>
+<span class="line"><span style="color:#24292E">console.</span><span style="color:#6F42C1">log</span><span style="color:#24292E">(</span><span style="color:#032F62">`exit code: ${</span><span style="color:#24292E">result</span><span style="color:#032F62">}`</span><span style="color:#24292E">);</span></span></code></pre>
+ </div>
<p>
標準入力から与えたコードを WebAssembly にコンパイルされた PHP 処理系の上で実行している。このような <code>php-wasm.mjs</code> (とそこから呼び出される <code>php-wasm.wasm</code>) を作成する。
@@ -137,30 +138,32 @@
先ほどのコードでも使っていたエントリポイントである <code>php_wasm_run</code> を用意する。
</p>
- <pre class="highlight" language="c"><code class="highlight"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;stdio.h&gt;</span></span>
-<span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;emscripten.h&gt;</span></span>
-<span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;Zend/zend_execute.h&gt;</span></span>
-<span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;sapi/embed/php_embed.h&gt;</span></span>
-
-<span class="hljs-type">int</span> EMSCRIPTEN_KEEPALIVE <span class="hljs-title function_">php_wasm_run</span><span class="hljs-params">(<span class="hljs-type">const</span> <span class="hljs-type">char</span>* code)</span> {
- zend_result result;
-
- <span class="hljs-type">int</span> argc = <span class="hljs-number">1</span>;
- <span class="hljs-type">char</span>* argv[] = { <span class="hljs-string">&quot;php.wasm&quot;</span>, <span class="hljs-literal">NULL</span> };
-
- PHP_EMBED_START_BLOCK(argc, argv);
-
- result = zend_eval_string_ex(code, <span class="hljs-literal">NULL</span>, <span class="hljs-string">&quot;php.wasm code&quot;</span>, <span class="hljs-number">1</span>);
-
- PHP_EMBED_END_BLOCK();
-
- <span class="hljs-built_in">fprintf</span>(<span class="hljs-built_in">stdout</span>, <span class="hljs-string">&quot;\n&quot;</span>);
- fflush(<span class="hljs-built_in">stdout</span>);
- <span class="hljs-built_in">fprintf</span>(<span class="hljs-built_in">stderr</span>, <span class="hljs-string">&quot;\n&quot;</span>);
- fflush(<span class="hljs-built_in">stderr</span>);
-
- <span class="hljs-keyword">return</span> result == SUCCESS ? <span class="hljs-number">0</span> : <span class="hljs-number">1</span>;
-}</code></pre>
+ <div class="codeblock" language="c">
+ <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">#include</span><span style="color:#032F62"> &#x3C;stdio.h></span></span>
+<span class="line"><span style="color:#D73A49">#include</span><span style="color:#032F62"> &#x3C;emscripten.h></span></span>
+<span class="line"><span style="color:#D73A49">#include</span><span style="color:#032F62"> &#x3C;Zend/zend_execute.h></span></span>
+<span class="line"><span style="color:#D73A49">#include</span><span style="color:#032F62"> &#x3C;sapi/embed/php_embed.h></span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#D73A49">int</span><span style="color:#24292E"> EMSCRIPTEN_KEEPALIVE </span><span style="color:#6F42C1">php_wasm_run</span><span style="color:#24292E">(</span><span style="color:#D73A49">const</span><span style="color:#D73A49"> char*</span><span style="color:#E36209"> code</span><span style="color:#24292E">) {</span></span>
+<span class="line"><span style="color:#24292E"> zend_result result;</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#D73A49"> int</span><span style="color:#24292E"> argc </span><span style="color:#D73A49">=</span><span style="color:#005CC5"> 1</span><span style="color:#24292E">;</span></span>
+<span class="line"><span style="color:#D73A49"> char*</span><span style="color:#24292E"> argv</span><span style="color:#D73A49">[]</span><span style="color:#D73A49"> =</span><span style="color:#24292E"> { </span><span style="color:#032F62">"php.wasm"</span><span style="color:#24292E">, </span><span style="color:#005CC5">NULL</span><span style="color:#24292E"> };</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#6F42C1"> PHP_EMBED_START_BLOCK</span><span style="color:#24292E">(argc, argv);</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#24292E"> result </span><span style="color:#D73A49">=</span><span style="color:#6F42C1"> zend_eval_string_ex</span><span style="color:#24292E">(code, </span><span style="color:#005CC5">NULL</span><span style="color:#24292E">, </span><span style="color:#032F62">"php.wasm code"</span><span style="color:#24292E">, </span><span style="color:#005CC5">1</span><span style="color:#24292E">);</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#6F42C1"> PHP_EMBED_END_BLOCK</span><span style="color:#24292E">();</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#6F42C1"> fprintf</span><span style="color:#24292E">(stdout, </span><span style="color:#032F62">"</span><span style="color:#005CC5">\n</span><span style="color:#032F62">"</span><span style="color:#24292E">);</span></span>
+<span class="line"><span style="color:#6F42C1"> fflush</span><span style="color:#24292E">(stdout);</span></span>
+<span class="line"><span style="color:#6F42C1"> fprintf</span><span style="color:#24292E">(stderr, </span><span style="color:#032F62">"</span><span style="color:#005CC5">\n</span><span style="color:#032F62">"</span><span style="color:#24292E">);</span></span>
+<span class="line"><span style="color:#6F42C1"> fflush</span><span style="color:#24292E">(stderr);</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#D73A49"> return</span><span style="color:#24292E"> result </span><span style="color:#D73A49">==</span><span style="color:#24292E"> SUCCESS </span><span style="color:#D73A49">?</span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> :</span><span style="color:#005CC5"> 1</span><span style="color:#24292E">;</span></span>
+<span class="line"><span style="color:#24292E">}</span></span></code></pre>
+ </div>
<p>
ほとんどはただの PHP の公開 API を使ったコードだが、Emscripten 向けの注意点が 2点ある。
@@ -185,49 +188,55 @@
まずは <a href="https://hub.docker.com/r/emscripten/emsdk" rel="noreferrer" target="_blank">Emscripten 公式が提供している Docker イメージ</a>を使って、PHP 処理系と先ほど示した C 言語のソースコードを WebAssembly にコンパイルする。
</p>
- <pre class="highlight" language="dockerfile"><code class="highlight"><span class="hljs-keyword">FROM</span> emscripten/emsdk:<span class="hljs-number">3.1</span>.<span class="hljs-number">46</span> AS wasm-builder</code></pre>
+ <div class="codeblock" language="dockerfile">
+ <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">FROM</span><span style="color:#24292E"> emscripten/emsdk:3.1.46 </span><span style="color:#D73A49">AS</span><span style="color:#24292E"> wasm-builder</span></span></code></pre>
+ </div>
<p>
次に、<a href="https://github.com/php/php-src" rel="noreferrer" target="_blank">php/php-src</a> から PHP 処理系のソースコードを取得し、ビルドに必要な apt パッケージを取ってくる。有効にする拡張を増やしたいなら、ここでインストールするパッケージも増やすことになるだろう。
</p>
- <pre class="highlight" language="dockerfile"><code class="highlight"><span class="hljs-keyword">RUN</span><span class="language-bash"> git <span class="hljs-built_in">clone</span> --depth=1 --branch=php-8.2.10 https://github.com/php/php-src</span>
-
-<span class="hljs-keyword">RUN</span><span class="language-bash"> apt-get update &amp;&amp; \
- apt-get install -y --no-install-recommends \
- autoconf \
- bison \
- pkg-config \
- re2c \
- &amp;&amp; \
- :</span></code></pre>
+ <div class="codeblock" language="dockerfile">
+ <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">RUN</span><span style="color:#24292E"> git clone --depth=1 --branch=php-8.2.10 https://github.com/php/php-src</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#D73A49">RUN</span><span style="color:#24292E"> apt-get update &#x26;&#x26; \</span></span>
+<span class="line"><span style="color:#24292E"> apt-get install -y --no-install-recommends \</span></span>
+<span class="line"><span style="color:#24292E"> autoconf \</span></span>
+<span class="line"><span style="color:#24292E"> bison \</span></span>
+<span class="line"><span style="color:#24292E"> pkg-config \</span></span>
+<span class="line"><span style="color:#24292E"> re2c \</span></span>
+<span class="line"><span style="color:#24292E"> &#x26;&#x26; \</span></span>
+<span class="line"><span style="color:#24292E"> :</span></span></code></pre>
+ </div>
<p>
続けて、Emscripten のツールチェインを用いて PHP 処理系をビルドする。
</p>
- <pre class="highlight" language="dockerfile"><code class="highlight"><span class="hljs-keyword">RUN</span><span class="language-bash"> <span class="hljs-built_in">cd</span> php-src &amp;&amp; \
- ./buildconf --force &amp;&amp; \
- emconfigure ./configure \
- --disable-all \
- --disable-mbregex \
- --disable-fiber-asm \
- --disable-cli \
- --disable-cgi \
- --disable-phpdbg \
- --enable-embed=static \
- --enable-mbstring \
- --without-iconv \
- --without-libxml \
- --without-pcre-jit \
- --without-pdo-sqlite \
- --without-sqlite3 \
- &amp;&amp; \
- EMCC_CFLAGS=<span class="hljs-string">&#x27;-s ERROR_ON_UNDEFINED_SYMBOLS=0&#x27;</span> emmake make -j$(<span class="hljs-built_in">nproc</span>) &amp;&amp; \
- <span class="hljs-built_in">mv</span> libs/libphp.a .. &amp;&amp; \
- make clean &amp;&amp; \
- git clean -fd &amp;&amp; \
- :</span></code></pre>
+ <div class="codeblock" language="dockerfile">
+ <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">RUN</span><span style="color:#24292E"> cd php-src &#x26;&#x26; \</span></span>
+<span class="line"><span style="color:#24292E"> ./buildconf --force &#x26;&#x26; \</span></span>
+<span class="line"><span style="color:#24292E"> emconfigure ./configure \</span></span>
+<span class="line"><span style="color:#24292E"> --disable-all \</span></span>
+<span class="line"><span style="color:#24292E"> --disable-mbregex \</span></span>
+<span class="line"><span style="color:#24292E"> --disable-fiber-asm \</span></span>
+<span class="line"><span style="color:#24292E"> --disable-cli \</span></span>
+<span class="line"><span style="color:#24292E"> --disable-cgi \</span></span>
+<span class="line"><span style="color:#24292E"> --disable-phpdbg \</span></span>
+<span class="line"><span style="color:#24292E"> --enable-embed=static \</span></span>
+<span class="line"><span style="color:#24292E"> --enable-mbstring \</span></span>
+<span class="line"><span style="color:#24292E"> --without-iconv \</span></span>
+<span class="line"><span style="color:#24292E"> --without-libxml \</span></span>
+<span class="line"><span style="color:#24292E"> --without-pcre-jit \</span></span>
+<span class="line"><span style="color:#24292E"> --without-pdo-sqlite \</span></span>
+<span class="line"><span style="color:#24292E"> --without-sqlite3 \</span></span>
+<span class="line"><span style="color:#24292E"> &#x26;&#x26; \</span></span>
+<span class="line"><span style="color:#24292E"> EMCC_CFLAGS=</span><span style="color:#032F62">'-s ERROR_ON_UNDEFINED_SYMBOLS=0'</span><span style="color:#24292E"> emmake make -j$(nproc) &#x26;&#x26; \</span></span>
+<span class="line"><span style="color:#24292E"> mv libs/libphp.a .. &#x26;&#x26; \</span></span>
+<span class="line"><span style="color:#24292E"> make clean &#x26;&#x26; \</span></span>
+<span class="line"><span style="color:#24292E"> git clean -fd &#x26;&#x26; \</span></span>
+<span class="line"><span style="color:#24292E"> :</span></span></code></pre>
+ </div>
<p>
ここまでと比べると少し複雑なので、それぞれ詳しく見ていこう。
@@ -257,22 +266,24 @@
さて、PHP 処理系をライブラリ化できたので、次に先ほど載せた C のソースコードをビルドしていこう。<code>Dockerfile</code> と同じ場所に <code>php-wasm.c</code> という名前で保存し、次のようにする。
</p>
- <pre class="highlight" language="dockerfile"><code class="highlight"><span class="hljs-keyword">COPY</span><span class="language-bash"> php-wasm.c /src/</span>
-
-<span class="hljs-keyword">RUN</span><span class="language-bash"> <span class="hljs-built_in">cd</span> php-src &amp;&amp; \
- emcc \
- -c \
- -o php-wasm.o \
- -I . \
- -I TSRM \
- -I Zend \
- -I main \
- ../php-wasm.c \
- &amp;&amp; \
- <span class="hljs-built_in">mv</span> php-wasm.o .. &amp;&amp; \
- make clean &amp;&amp; \
- git clean -fd &amp;&amp; \
- :</span></code></pre>
+ <div class="codeblock" language="dockerfile">
+ <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">COPY</span><span style="color:#24292E"> php-wasm.c /src/</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#D73A49">RUN</span><span style="color:#24292E"> cd php-src &#x26;&#x26; \</span></span>
+<span class="line"><span style="color:#24292E"> emcc \</span></span>
+<span class="line"><span style="color:#24292E"> -c \</span></span>
+<span class="line"><span style="color:#24292E"> -o php-wasm.o \</span></span>
+<span class="line"><span style="color:#24292E"> -I . \</span></span>
+<span class="line"><span style="color:#24292E"> -I TSRM \</span></span>
+<span class="line"><span style="color:#24292E"> -I Zend \</span></span>
+<span class="line"><span style="color:#24292E"> -I main \</span></span>
+<span class="line"><span style="color:#24292E"> ../php-wasm.c \</span></span>
+<span class="line"><span style="color:#24292E"> &#x26;&#x26; \</span></span>
+<span class="line"><span style="color:#24292E"> mv php-wasm.o .. &#x26;&#x26; \</span></span>
+<span class="line"><span style="color:#24292E"> make clean &#x26;&#x26; \</span></span>
+<span class="line"><span style="color:#24292E"> git clean -fd &#x26;&#x26; \</span></span>
+<span class="line"><span style="color:#24292E"> :</span></span></code></pre>
+ </div>
<p>
<code>emcc</code> は <code>cc</code> (C コンパイラ/リンカ) の Emscripten 版で、<code>-c</code> は「コンパイル」の意。<code>-o</code> や <code>-I</code> は普通の C コンパイラと同様、出力ファイルの指定とインクルードパスの指定である。
@@ -282,18 +293,20 @@
<code>libphp.a</code> と <code>php-wasm.o</code> が手に入ったので、これらをリンクして WebAssembly のバイナリとそのラッパである JavaScript ファイルを生成する。これにも <code>emcc</code> コマンドを使う。
</p>
- <pre class="highlight" language="dockerfile"><code class="highlight"><span class="hljs-keyword">RUN</span><span class="language-bash"> emcc \
- -s ENVIRONMENT=node \
- -s ERROR_ON_UNDEFINED_SYMBOLS=0 \
- -s EXPORTED_RUNTIME_METHODS=<span class="hljs-string">&#x27;[&quot;ccall&quot;]&#x27;</span> \
- -s EXPORT_ES6=1 \
- -s INITIAL_MEMORY=16777216 \
- -s INVOKE_RUN=0 \
- -s MODULARIZE=1 \
- -o php-wasm.js \
- php-wasm.o \
- libphp.a \
- ;</span></code></pre>
+ <div class="codeblock" language="dockerfile">
+ <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">RUN</span><span style="color:#24292E"> emcc \</span></span>
+<span class="line"><span style="color:#24292E"> -s ENVIRONMENT=node \</span></span>
+<span class="line"><span style="color:#24292E"> -s ERROR_ON_UNDEFINED_SYMBOLS=0 \</span></span>
+<span class="line"><span style="color:#24292E"> -s EXPORTED_RUNTIME_METHODS=</span><span style="color:#032F62">'["ccall"]'</span><span style="color:#24292E"> \</span></span>
+<span class="line"><span style="color:#24292E"> -s EXPORT_ES6=1 \</span></span>
+<span class="line"><span style="color:#24292E"> -s INITIAL_MEMORY=16777216 \</span></span>
+<span class="line"><span style="color:#24292E"> -s INVOKE_RUN=0 \</span></span>
+<span class="line"><span style="color:#24292E"> -s MODULARIZE=1 \</span></span>
+<span class="line"><span style="color:#24292E"> -o php-wasm.js \</span></span>
+<span class="line"><span style="color:#24292E"> php-wasm.o \</span></span>
+<span class="line"><span style="color:#24292E"> libphp.a \</span></span>
+<span class="line"><span style="color:#24292E"> ;</span></span></code></pre>
+ </div>
<p>
それぞれのフラグについて解説する。
@@ -335,14 +348,16 @@
といっても、Node.js はビルトインで WebAssembly をサポートしているので、ほとんどやることはない。先ほど掲載した JavaScript のコードは、<code>Dockerfile</code> と同じディレクトリに <code>index.mjs</code> で配置すること。
</p>
- <pre class="highlight" language="dockerfile"><code class="highlight"><span class="hljs-keyword">FROM</span> node:<span class="hljs-number">20.7</span>
-
-<span class="hljs-keyword">WORKDIR</span><span class="language-bash"> /app</span>
-<span class="hljs-keyword">COPY</span><span class="language-bash"> --from=wasm-builder /src/php-wasm.js /app/php-wasm.mjs</span>
-<span class="hljs-keyword">COPY</span><span class="language-bash"> --from=wasm-builder /src/php-wasm.wasm /app/php-wasm.wasm</span>
-<span class="hljs-keyword">COPY</span><span class="language-bash"> index.mjs /app/</span>
-
-<span class="hljs-keyword">ENTRYPOINT</span><span class="language-bash"> [<span class="hljs-string">&quot;node&quot;</span>, <span class="hljs-string">&quot;index.mjs&quot;</span>]</span></code></pre>
+ <div class="codeblock" language="dockerfile">
+ <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">FROM</span><span style="color:#24292E"> node:20.7</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#D73A49">WORKDIR</span><span style="color:#24292E"> /app</span></span>
+<span class="line"><span style="color:#D73A49">COPY</span><span style="color:#24292E"> --from=wasm-builder /src/php-wasm.js /app/php-wasm.mjs</span></span>
+<span class="line"><span style="color:#D73A49">COPY</span><span style="color:#24292E"> --from=wasm-builder /src/php-wasm.wasm /app/php-wasm.wasm</span></span>
+<span class="line"><span style="color:#D73A49">COPY</span><span style="color:#24292E"> index.mjs /app/</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#D73A49">ENTRYPOINT</span><span style="color:#24292E"> [</span><span style="color:#032F62">"node"</span><span style="color:#24292E">, </span><span style="color:#032F62">"index.mjs"</span><span style="color:#24292E">]</span></span></code></pre>
+ </div>
</section>
</section>
@@ -352,12 +367,14 @@
<code>Dockerfile</code>、<code>php-wasm.c</code>、<code>index.mjs</code> を用意したら、Docker コンテナをビルドして実行する。
</p>
- <pre class="highlight" language="dockerfile"><code class="highlight">$ docker build -t php-wasm .
-$ echo <span class="hljs-string">&#x27;echo &quot;Hello, World!&quot;, PHP_EOL;&#x27;</span> | docker <span class="hljs-keyword">run</span><span class="language-bash"> --<span class="hljs-built_in">rm</span> -i php-wasm</span>
-Hello, World!
-
-
-exit code: <span class="hljs-number">0</span></code></pre>
+ <div class="codeblock" language="dockerfile">
+ <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#24292E">$ docker build -t php-wasm .</span></span>
+<span class="line"><span style="color:#24292E">$ echo </span><span style="color:#032F62">'echo "Hello, World!", PHP_EOL;'</span><span style="color:#24292E"> | docker run --rm -i php-wasm</span></span>
+<span class="line"><span style="color:#24292E">Hello, World!</span></span>
+<span class="line"></span>
+<span class="line"></span>
+<span class="line"><span style="color:#24292E">exit code: 0</span></span></code></pre>
+ </div>
</section>
<section id="section--outro">