このページはコミュニティによって翻訳されたもので、最新ではない可能性があります。参照用のバージョンをご覧ください。
このページはコミュニティによって翻訳されたもので、最新ではない可能性があります。参照用のバージョンをご覧ください。
このページはコミュニティによって翻訳されたもので、最新ではない可能性があります。参照用のバージョンをご覧ください。
以下の拡張モジュールはFrankenPHPと互換性がないことが確認されています:
名前 | 理由 | 代替手段 |
---|---|---|
imap | スレッドセーフでない | javanile/php-imap2, webklex/php-imap |
newrelic | スレッドセーフでない | - |
以下の拡張モジュールはFrankenPHPとの組み合わせで既知のバグや予期しない動作が確認されています:
名前 | 問題 |
---|---|
ext-openssl | FrankenPHPの静的ビルド(musl libcでビルド)を使用した場合、高負荷時にOpenSSL拡張がクラッシュすることがあります。回避策として動的リンクのビルド(Dockerイメージで使用されているもの)を使用してください。このバグはPHP側で追跡中です。 |
get_browser()関数は継続使用するとパフォーマンスが悪化することが確認されています。回避策として、User Agentごとの結果をキャッシュ(例:APCuを利用)してください。User Agentごとの結果は静的なためです。
スタンドアロンバイナリおよびAlpineベースのDockerイメージ(dunglas/frankenphp:*-alpine
)は、バイナリサイズを小さく保つためにglibc and friendsではなくmusl libcを使用しています。これによりいくつかの互換性問題が発生する可能性があります。特に、globフラグGLOB_BRACE
は サポートされていません 。
https://127.0.0.1
を使用するデフォルトでは、FrankenPHPはlocalhost
用のTLS証明書を生成します。
これはローカル開発における最も簡単かつ推奨される方法です。
どうしても127.0.0.1
をホストとして使用したい場合は、サーバー名を127.0.0.1
に設定してその証明書を生成させることが可能です。
ただし、Dockerのネットワークシステムの仕組みにより、Dockerを使用する場合はこれだけでは不十分です。
この場合、curl: (35) LibreSSL/3.3.6: error:1404B438:SSL routines:ST_CONNECT:tlsv1 alert internal error
のようなTLSエラーが発生します。
Linuxを使用している場合、ホストネットワークドライバーを使用することで、この問題を解決できます:
docker run \
-e SERVER_NAME="127.0.0.1" \
-v $PWD:/app/public \
--network host \
dunglas/frankenphp
ホストネットワークドライバーはMacとWindowsではサポートされていません。これらのプラットフォームでは、コンテナのIPアドレスを推測してサーバー名に含める必要があります。
docker network inspect bridge
を実行し、Containers
キーを確認してIPv4Address
にある現在割り当てられている最後のIPアドレスを特定し、それに1を加えます。コンテナがまだ実行されていない場合、最初に割り当てられるIPアドレスは通常172.17.0.2
です。
そして、これをSERVER_NAME
環境変数に含めます:
docker run \
-e SERVER_NAME="127.0.0.1, 172.17.0.3" \
-v $PWD:/app/public \
-p 80:80 -p 443:443 -p 443:443/udp \
dunglas/frankenphp
Caution
172.17.0.3
の部分は、実際にコンテナに割り当てられるIPに置き換えてください。
これでホストマシンからhttps://127.0.0.1
へアクセスできるはずです。
うまくいかない場合は、FrankenPHPをデバッグモードで起動して問題を特定してみてください:
docker run \
-e CADDY_GLOBAL_OPTIONS="debug" \
-e SERVER_NAME="127.0.0.1" \
-v $PWD:/app/public \
-p 80:80 -p 443:443 -p 443:443/udp \
dunglas/frankenphp
@php
を参照するComposerスクリプトComposerスクリプトでは、いくつかのタスクでPHPバイナリを実行したい場合があります。例えば、Laravelプロジェクトで@php artisan package:discover --ansi
を実行する場合です。しかし現在これは以下の2つの理由で失敗します:
-d
フラグを使用してPHP設定を追加する場合があり、FrankenPHPはまだサポートしていません回避策として、未サポートのパラメータを削除してFrankenPHPを呼び出すシェルスクリプトを/usr/local/bin/php
に作成できます:
#!/usr/bin/env bash
args=("$@")
index=0
for i in "$@"
do
if [ "$i" == "-d" ]; then
unset 'args[$index]'
unset 'args[$index+1]'
fi
index=$((index+1))
done
/usr/local/bin/frankenphp php-cli ${args[@]}
次に、環境変数PHP_BINARY
にこのphp
スクリプトのパスを設定してComposerを実行します:
export PHP_BINARY=/usr/local/bin/php
composer install
静的バイナリを使用する場合、例えばSTARTTLSを使用してメールを送信する際に以下のTLS関連エラーが発生する可能性があります:
Unable to connect with STARTTLS: stream_socket_enable_crypto(): SSL operation failed with code 5. OpenSSL Error messages:
error:80000002:system library::No such file or directory
error:80000002:system library::No such file or directory
error:80000002:system library::No such file or directory
error:0A000086:SSL routines::certificate verify failed
静的バイナリにはTLS証明書がバンドルされていないため、OpenSSLにローカルのCA証明書の位置を明示する必要があります。
openssl_get_cert_locations()
の出力を調べて、
CA証明書をどこにインストールすべきか確認し、その場所に保存してください。
Warning
WebとCLIコンテキストでは設定が異なる場合があります。 適切なコンテキストで
openssl_get_cert_locations()
を実行してください。
Mozillaから抽出されたCA証明書はcurlのサイトでダウンロードできます。
または、Debian、Ubuntu、Alpineなどのディストリビューションでも、これらの証明書を含むca-certificates
というパッケージを提供しています。
SSL_CERT_FILE
およびSSL_CERT_DIR
を使用してOpenSSLにCA証明書を探す場所をヒントとして与えることも可能です:
# TLS 証明書の環境変数を設定
export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
export SSL_CERT_DIR=/etc/ssl/certs