Эта страница была переведена сообществом и не обязательно является актуальной. Обратитесь к справочной версии.
Эта страница была переведена сообществом и не обязательно является актуальной. Обратитесь к справочной версии.
Эта страница была переведена сообществом и не обязательно является актуальной. Обратитесь к справочной версии.
Следующие расширения не совместимы с FrankenPHP:
Название | Причина | Альтернативы |
---|---|---|
imap | Не поддерживает потокобезопасность | javanile/php-imap2, webklex/php-imap |
newrelic | Не поддерживает потокобезопасность | - |
Следующие расширения имеют известные ошибки или могут вести себя непредсказуемо при использовании с FrankenPHP:
Название | Проблема |
---|---|
ext-openssl | При использовании статической сборки FrankenPHP (на базе musl libc) расширение OpenSSL может аварийно завершаться при высокой нагрузке. Решение — использовать динамически связанную сборку (например, ту, что используется в Docker-образах). Ошибка отслеживается сообществом PHP. |
get_browser
Функция get_browser() начинает работать медленно через некоторое время. Решение — кэшировать результаты для каждого User-Agent, например, с помощью APCu, так как они статичны.
Автономные бинарные файлы и образы на базе Alpine (dunglas/frankenphp:*-alpine
) используют musl libc вместо glibc для уменьшения размера бинарных файлов. Это может вызвать проблемы совместимости. В частности, флаг GLOB_BRACE
в функции glob не поддерживается.
https://127.0.0.1
с DockerПо умолчанию FrankenPHP генерирует TLS-сертификат для localhost
, что является самым простым и рекомендуемым вариантом для локальной разработки.
Если вы всё же хотите использовать 127.0.0.1
, настройте генерацию сертификата, указав в переменной окружения SERVER_NAME
значение 127.0.0.1
.
Однако этого может не хватить при использовании Docker из-за особенностей его сетевой системы. Возможна ошибка TLS вида:curl: (35) LibreSSL/3.3.6: error:1404B438:SSL routines:ST_CONNECT:tlsv1 alert internal error
.
Если вы используете Linux, можно воспользоваться host-драйвером:
docker run \
-e SERVER_NAME="127.0.0.1" \
-v $PWD:/app/public \
--network host \
dunglas/frankenphp
Host-драйвер не поддерживается на Mac и Windows. На этих платформах нужно определить IP-адрес контейнера и включить его в SERVER_NAME
.
Выполните команду docker network inspect bridge
, найдите ключ Containers
и определите последний присвоенный IP из IPv4Address
. Увеличьте его на единицу. Если контейнеров нет, первый IP обычно 172.17.0.2
.
Включите этот IP в переменную окружения 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 могут вызывать PHP для выполнения задач, например, в проекте Laravel для команды @php artisan package:discover --ansi
.
Это на данный момент не поддерживается по двум причинам:
-d
, который FrankenPHP пока не поддерживает.Решение — создать shell-скрипт в /usr/local/bin/php
, который удаляет неподдерживаемые параметры и вызывает FrankenPHP:
#!/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
При использовании статических бинарных файлов могут возникать следующие ошибки TLS, например, при отправке писем через STARTTLS:
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
Веб и CLI контексты могут иметь разные настройки.
Запуститеopenssl_get_cert_locations()
в нужном контексте.
Сертификаты CA, извлечённые из Mozilla, можно скачать с сайта 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