Bu sayfa topluluk tarafından çevrilmiştir ve güncel olmayabilir. Referans versiyonuna (İngilizce) bakın.
Bu sayfa topluluk tarafından çevrilmiştir ve güncel olmayabilir. Referans versiyonuna (İngilizce) bakın.
Bu sayfa topluluk tarafından çevrilmiştir ve güncel olmayabilir. Referans versiyonuna (İngilizce) bakın.
Uygulamanızı bir kez önyükleyin ve bellekte tutun. FrankenPHP gelen istekleri birkaç milisaniye içinde halledecektir.
FRANKENPHP_CONFIG ortam değişkeninin değerini worker /path/to/your/worker/script.php olarak ayarlayın:
docker run \
-e FRANKENPHP_CONFIG="worker /app/path/to/your/worker/script.php" \
-v $PWD:/app \
-p 80:80 -p 443:443 -p 443:443/udp \
dunglas/frankenphp
Geçerli dizinin içeriğini bir worker kullanarak sunmak için php-server komutunun --worker seçeneğini kullanın:
frankenphp php-server --worker /path/to/your/worker/script.php
PHP uygulamanız ikili dosyaya gömülü ise, uygulamanın kök dizinine özel bir Caddyfile ekleyebilirsiniz.
Otomatik olarak kullanılacaktır.
Dosya değişikliklerinde worker’ı yeniden başlatmak (dosya değişikliklerini izleme) --watch seçeneğiyle de mümkündür.
Aşağıdaki komut, /path/to/your/app/ dizininde veya alt dizinlerde .php ile biten herhangi bir dosya değiştirilirse yeniden başlatmayı tetikleyecektir:
frankenphp php-server --worker /path/to/your/worker/script.php --watch="/path/to/your/app/**/*.php"
Bu özellik genellikle hot reloading ile birlikte kullanılır.
Tip
Bu bölüm, FrankenPHP worker moduna yerel desteğin sunulduğu Symfony 7.4 öncesi için gereklidir.
FrankenPHP’nin worker modu Symfony Runtime Component tarafından desteklenmektedir. Herhangi bir Symfony uygulamasını bir worker’da başlatmak için PHP Runtime‘ın FrankenPHP paketini yükleyin:
composer require runtime/frankenphp-symfony
FrankenPHP Symfony Runtime’ı kullanmak için APP_RUNTIME ortam değişkenini tanımlayarak uygulama sunucunuzu başlatın:
docker run \
-e FRANKENPHP_CONFIG="worker ./public/index.php" \
-e APP_RUNTIME=Runtime\\FrankenPhpSymfony\\Runtime \
-v $PWD:/app \
-p 80:80 -p 443:443 -p 443:443/udp \
dunglas/frankenphp
Bkz. özel dokümantasyon.
Aşağıdaki örnek, üçüncü taraf bir kütüphaneye güvenmeden kendi worker betiğinizi nasıl oluşturacağınızı göstermektedir:
<?php
// public/index.php
// Uygulamanızı önyükleyin
require __DIR__.'/vendor/autoload.php';
$myApp = new \App\Kernel();
$myApp->boot();
// Daha iyi performans için döngü dışında işleyici (daha az iş yapıyor)
$handler = static function () use ($myApp) {
try {
// Bir istek alındığında çağrılır,
// süper küresel değişkenler, php://input ve benzerleri sıfırlanır
echo $myApp->handle($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER);
} catch (\Throwable $exception) {
// `set_exception_handler` yalnızca worker betiği sona erdiğinde çağrılır,
// bu beklediğiniz gibi olmayabilir, bu yüzden istisnaları burada yakalayın ve ele alın
(new \MyCustomExceptionHandler)->handleException($exception);
}
};
$maxRequests = (int)($_SERVER['MAX_REQUESTS'] ?? 0);
for ($nbRequests = 0; !$maxRequests || $nbRequests < $maxRequests; ++$nbRequests) {
$keepRunning = \frankenphp_handle_request($handler);
// HTTP yanıtını gönderdikten sonra bir şey yapın
$myApp->terminate();
// Bir sayfa oluşturmanın ortasında tetiklenme olasılığını azaltmak için çöp toplayıcıyı çağırın
gc_collect_cycles();
if (!$keepRunning) break;
}
// Temizleme
$myApp->shutdown();
Ardından, uygulamanızı başlatın ve worker’ınızı yapılandırmak için FRANKENPHP_CONFIG ortam değişkenini kullanın:
docker run \
-e FRANKENPHP_CONFIG="worker ./public/index.php" \
-v $PWD:/app \
-p 80:80 -p 443:443 -p 443:443/udp \
dunglas/frankenphp
Varsayılan olarak, CPU başına 2 worker başlatılır. Başlatılacak worker sayısını da yapılandırabilirsiniz:
docker run \
-e FRANKENPHP_CONFIG="worker ./public/index.php 42" \
-v $PWD:/app \
-p 80:80 -p 443:443 -p 443:443/udp \
dunglas/frankenphp
PHP başlangıçta uzun süreli işlemler için tasarlanmadığından, hala bellek sızdıran birçok kütüphane ve eski kod vardır. Bu tür kodları worker modunda kullanmak için geçici bir çözüm, belirli sayıda isteği işledikten sonra worker betiğini yeniden başlatmaktır:
Önceki worker kod parçacığı, MAX_REQUESTS adlı bir ortam değişkeni ayarlayarak işlenecek maksimum istek sayısını yapılandırmaya izin verir.
Worker’ları dosya değişikliklerinde yeniden başlatmak mümkünken, tüm worker’ları Caddy admin API aracılığıyla sorunsuz bir şekilde yeniden başlatmak da mümkündür. Yönetici Caddyfile‘ınızda etkinleştirilmişse, yeniden başlatma uç noktasına aşağıdaki gibi basit bir POST isteği gönderebilirsiniz:
curl -X POST http://localhost:2019/frankenphp/workers/restart
Bir worker betiği sıfır olmayan bir çıkış koduyla çökerse, FrankenPHP onu üstel bir geri çekilme (exponential backoff) stratejisiyle yeniden başlatacaktır. Worker betiği, son geri çekilme süresinin 2 katından daha uzun süre çalışır durumda kalırsa, worker betiğini cezalandırmayacak ve tekrar yeniden başlatacaktır. Ancak, worker betiği kısa bir süre içinde sıfır olmayan bir çıkış koduyla başarısız olmaya devam ederse (örneğin, bir betikte yazım hatası olması durumunda), FrankenPHP too many consecutive failures hatasıyla çökecektir.
Ardışık hata sayısı, Caddyfile‘ınızda max_consecutive_failures seçeneği ile yapılandırılabilir:
frankenphp {
worker {
# ...
max_consecutive_failures 10
}
}
PHP süper küresel değişkenleri ($_SERVER, $_ENV, $_GET…) aşağıdaki gibi davranır:
frankenphp_handle_request()‘e ilk çağrıdan önce, süper küresel değişkenler worker betiğinin kendisine bağlı değerleri içerirfrankenphp_handle_request() çağrısı sırasında ve sonrasında, süper küresel değişkenler işlenen HTTP isteğinden üretilen değerleri içerir, frankenphp_handle_request()‘e yapılan her çağrı süper küresel değişken değerlerini değiştirirGeri çağırım içinde worker betiğinin süper küresel değişkenlerine erişmek için, bunları kopyalamalı ve kopyayı geri çağırımın kapsamına aktarmalısınız:
<?php
// frankenphp_handle_request()'e ilk çağrıdan önce worker'ın $_SERVER süper küresel değişkenini kopyalayın
$workerServer = $_SERVER;
$handler = static function () use ($workerServer) {
var_dump($_SERVER); // HTTP isteğine bağlı $_SERVER
var_dump($workerServer); // Worker betiğinin $_SERVER'ı
};
// ...