* test: failing test reproducing #767 * fix * Update frankenphp.c Co-authored-by: Tim Düsterhus <timwolla@googlemail.com> * Update frankenphp.c Co-authored-by: Tim Düsterhus <timwolla@googlemail.com> * review * ZVAL_COPY * fix * add back current $_SERVER behavior * add docs * bad fix for the leak * clean test * improve tests * fix test * fix * cleanup * clarify destroy super globals name * micro-optim: use zval_ptr_dtor_nogc to destroy super globals * style * fix * better name for frankenphp_free_server_context * more cleanup * remove useless memset * more cleanup * continue refactoring * fix and update docs * docs --------- Co-authored-by: Tim Düsterhus <timwolla@googlemail.com>
4.1 KiB
FrankenPHP Worker'ları Kullanma
Uygulamanızı bir kez önyükleyin ve bellekte tutun. FrankenPHP gelen istekleri birkaç milisaniye içinde halledecektir.
Çalışan Komut Dosyalarının Başlatılması
Docker
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
Binary Çıktısı
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 binary dosyaya gömülü ise, uygulamanın kök dizinine özel bir Caddyfile ekleyebilirsiniz.
Otomatik olarak kullanılacaktır.
Symfony Çalışma Zamanı
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
Laravel Octane
Bkz. ilgili doküman.
Özel Uygulamalar
Aşağıdaki örnek, üçüncü taraf bir kütüphaneye güvenmeden kendi çalışan kodunuzu nasıl oluşturacağınızı göstermektedir:
<?php
// public/index.php
// Bir istemci bağlantısı kesildiğinde alt komut dosyasının sonlandırılmasını önleyin
ignore_user_abort(true);
// 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) {
// Bir istek alındığında çağrılır,
// superglobals, php://input ve benzerleri sıfırlanır
echo $myApp->handle($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER);
};
for ($nbRequests = 0, $running = true; isset($_SERVER['MAX_REQUESTS']) && ($nbRequests < ((int)$_SERVER['MAX_REQUESTS'])) && $running; ++$nbRequests) {
$running = \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();
}
// Temizleme
$myApp->shutdown();
Ardından, uygulamanızı başlatın ve çalışanı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
Belirli Sayıda İstekten Sonra Worker'ı Yeniden Başlatın
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.