Fibers içinde cgo çağrısı yapan PHP fonksiyonlarının ve dil yapılarının çağrılmasının çökmelere neden olduğu bilinmektedir.
Bu sorun Go projesi tarafından üzerinde çalışılmaktadır.
Bu arada, bir çözüm Fibers içinden Go’ya temsilci atayan yapıları (echo
gibi) ve fonksiyonları (header()
gibi) kullanmamaktır.
Bu kod, Fiber içinde echo
kullandığı için büyük olasılıkla çökecektir:
$fiber = new Fiber(function() {
echo 'In the Fiber'.PHP_EOL;
echo 'Still inside'.PHP_EOL;
});
$fiber->start();
Bunun yerine, değeri Fiber’den döndürün ve dışarıda kullanın:
$fiber = new Fiber(function() {
Fiber::suspend('In the Fiber'.PHP_EOL));
Fiber::suspend('Still inside'.PHP_EOL));
});
echo $fiber->start();
echo $fiber->resume();
$fiber->resume();
Aşağıdaki eklentilerin FrankenPHP ile uyumlu olmadığı bilinmektedir:
Adı | Nedeni | Alternatifleri |
---|---|---|
imap | İş parçacığı güvenli değil | javanile/php-imap2, webklex/php-imap |
Aşağıdaki eklentiler FrankenPHP ile kullanıldığında bilinen hatalara ve beklenmeyen davranışlara sahiptir:
Adı | Problem |
---|
get_browser() fonksiyonu bir süre sonra kötü performans gösteriyor gibi görünüyor. Geçici bir çözüm, statik oldukları için User-Agent başına sonuçları önbelleğe almaktır (örneğin APCu ile).
Binary çıktısı ve Alpine tabanlı Docker imajları (dunglas/frankenphp:*-alpine), daha küçük bir binary boyutu korumak için glibc ve arkadaşları yerine musl libc kullanır. Bu durum bazı uyumluluk sorunlarına yol açabilir. Özellikle, glob seçeneği GLOB_BRACE mevcut değildir.
https://127.0.0.1
KullanımıFrankenPHP varsayılan olarak localhost
için bir TLS sertifikası oluşturur.
Bu, yerel geliştirme için en kolay ve önerilen seçenektir.
Bunun yerine ana bilgisayar olarak 127.0.0.1
kullanmak istiyorsanız, sunucu adını 127.0.0.1
şeklinde ayarlayarak bunun için bir sertifika oluşturacak yapılandırma yapmak mümkündür.
Ne yazık ki, ağ sistemi nedeniyle Docker kullanırken bu yeterli değildir.
Curl: (35) LibreSSL/3.3.6: error:1404B438:SSL routines:ST_CONNECT:tlsv1 alert internal error
‘a benzer bir TLS hatası alırsınız.
Linux kullanıyorsanız, ana bilgisayar ağ sürücüsünü kullanmak bir çözümdür:
docker run \
-e SERVER_NAME="127.0.0.1" \
-v $PWD:/app/public \
--network host \
dunglas/frankenphp
Ana bilgisayar ağ sürücüsü Mac ve Windows’ta desteklenmez. Bu platformlarda, konteynerin IP adresini tahmin etmeniz ve bunu sunucu adlarına dahil etmeniz gerekecektir.
docker network inspect bridge
‘i çalıştırın ve IPv4Address
anahtarının altındaki son atanmış IP adresini belirlemek için Containers
anahtarına bakın ve bir artırın. Eğer hiçbir konteyner çalışmıyorsa, ilk atanan IP adresi genellikle 172.17.0.2
dir.
Ardından, bunu SERVER_NAME
ortam değişkenine ekleyin:
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`ü konteynerinize atanacak IP ile değiştirdiğinizden emin olun.
Artık ana makineden https://127.0.0.1
adresine erişebilmeniz gerekir.
Eğer durum böyle değilse, sorunu anlamaya çalışmak için FrankenPHP’yi hata ayıklama modunda başlatın:
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
Referanslı Composer BetiklerComposer betikleri bazı görevler için bir PHP binary çalıştırmak isteyebilir, örneğin bir Laravel projesinde @php artisan package:discover --ansi
çalıştırmak. Bu şu anda mümkün değil ve 2 nedeni var:
-d
bayrağını kullanarak PHP ayarlarını komuta ekleyebilir.Geçici bir çözüm olarak, /usr/local/bin/php
içinde desteklenmeyen parametreleri silen ve ardından FrankenPHP’yi çağıran bir kabuk betiği oluşturabiliriz:
#!/bin/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[@]}
Ardından PHP_BINARY
ortam değişkenini PHP betiğimizin yoluna ayarlayın ve Composer bu yolla çalışacaktır:
export PHP_BINARY=/usr/local/bin/php
composer install