Elveda Nginx+Php-Fpm

Elveda Nginx+Php-Fpm

·

5 min read

PHP kodunu çalıştırmak, Java veya Golang gibi diğer programlama dillerinde çalışan uygulamalarla karşılaştırıldığında tamamen benzersiz(kötü anlamda değil:)) bir deneyim sunar. Çoğu dilde, client talebine yanıt verebilmek için uygulamanızı başlatmanız gerekir; oysa PHP ile, Nginx + PHP-FPM veya Apache mod_php gibi üst seviye bir web sunucusu tarafından çağrılana kadar sessizce duran basit bir ".php" dosyanız vardır.

Bu yaklaşım bellek sızıntıları(memory leakage) gibi bazı yaygın uygulama sorunlarını önlemeye yardımcı olurken, maalesef, her bir istek için uygulamanızı yeniden başlatmanızla ilişkili büyük ek yüklere neden olur. Basit bir HTTP isteği için, örneğin, bir PHP uygulaması, veritabanı bağlantıları ve işleme mantığını kurarken kullanılan zaman ve hesaplama gücüne ek olarak, kullanımdaki framework (örneğin: Symfony, Laravel, vb.) Adına önemli yük getirecektir. Asıl daha kötü kısmı ? Basit bir istekten sonra, sıfırdan başlamak için her şeyin bellekten yok edilmesi gerekir.

Hepsinden önemlisi, PHP, geliştiricilere uygulamalarına iletişim kurmak ve işlemek için alternatif yöntemleri entegre etmeleri için kolay bir yol sağlamaz. RabbitMQ gibi mesaj broker yazılımından basit verileri consume etmek bile, genellikle büyükçe bir kütüphane veya eklenti gerektirir. Ayrıca, denetleyiciyi, harici bir hata durumunda komut dosyalarını yeniden başlatmak için PHP komut dosyalarınızın ölmemesini veya üstte crontab olmamasını sağlayacak şekilde yapılandırmanız gerekir.

Bu yaygın şikayetler, birçok geliştiricinin PHP'yi ölmekte olan bir programlama dili olarak adlandırmasının nedenidir (dünyadaki ilk 10 milyon web sitesinin neredeyse% 80'inin birincil kodu olarak PHP kullanmasına rağmen). Diğer birçok dil, altyapı mantığının bir kısmını uygulama sunucularına ayırarak benzer sorunları çözmüş olsa da (yani, TomCat veya benzerini kullanmayan bir Java developer bulmakta zorlanacaksınız), PHP söz konusu olduğunda, şimdiye kadar benzer bir çözüm hazır değildi.

Golang'da Yazılan Yüksek Performanslı PHP Uygulama Sunucusu, Yük Dengeleyici ve İşlem Yöneticisi olan Roadrunner ile tanışın

PHP uygulamanızı bir kez çalıştırdıktan sonra birden çok istek için parçalamak zorunda kalmadan yeniden kullandığınızı hayal edin, işte RoadRunner bunu mümkün kılıyor.

<?php
/**
 * @var Goridge\RelayInterface $relay
 */
use Spiral\Goridge;
use Spiral\RoadRunner;

ini_set('display_errors', 'stderr');
require 'vendor/autoload.php';

$worker = new RoadRunner\Worker(new Goridge\StreamRelay(STDIN, STDOUT));
$psr7 = new RoadRunner\PSR7Client($worker);

while ($req = $psr7->acceptRequest()) {
    try {
        $resp = new \Zend\Diactoros\Response();
        $resp->getBody()->write("hello world");

        $psr7->respond($resp);
    } catch (\Throwable $e) {
        $psr7->getWorker()->error((string)$e);
    }
}

RoadRunner, arkaplanda bu işleri basitleştirmek için GoLang'i kullanır. Mevcut herhangi bir Golang kütüphanesini PHP ile entegre etmenize ve uygulamanızla PSR-7 standardı üzerinden iletişim kurmanıza olanak tanır. Bugün mevcut olan neredeyse tüm frameworklerle uyumlu olan RoadRunner, MIT lisanslıdır ve Github'dan halihazırda 12.000+ kez indirilmiştir.

Bu güçlü uygulama sunucusu, kodlarınzı, frameworkteki bazı yükleri temizleyerek performansı önemli ölçüde artıran bir daemon modunda çalıştırır. Benchmark testleri gösteriyor ki, RoadRunner ile PHP-FPM'den 10-20 kat daha yüksek performans alabilirsiniz.

image.png

RoadRunner ayrıca, uygulamanızın güvenli bir şekilde çalışmasını sağlamak için bellek sızıntı kontrolleri ve TTL kontrolleri gibi birçok araç ile birlikte gelir. Nginx olmadan statik dosyalara hizmet edebilir, bu nedenle Docker konteynerlerinin oluşturulmasını basitleştirir.

image.png

Hepsinden öte, RoadRunner bir dizi eklenti desteği sağlar. Örneğin, RoadRunner ile, diğer teknolojilerle entegrasyonu basitleştirmek için bir PHP uygulaması ile GRPC API sunabilirsiniz. Kuyruk(queue) (github.com/spiral/jobs) eklentisi ile RabbitMQ, Amazon SQS, Beanstalk gibi araçlarla 20 satır kodda basitçe entegrasyon gerçekleştirmeyi mümkün kılar veya sunucu belleğinde async PHP çalıştırır.

image.png

RoadRunner ile Golang, PHP uygulamanızı başlatma, durdurma ve yönetmenin yanı sıra belirli bir zamanda kaç tane worker çalışabileceğini kontrol etme konusunda tüm "ağır işleri" etkili bir şekilde yapar. Başka bir açık kaynaklı çözüm olan Goridge'i kullanarak, uygulamanızın Golang ve PHP taraflarını birbirine köprüleyebilir ve PSR7 istek ve yanıtlarını her zamankinden daha hızlı ve daha verimli bir şekilde iletebilirsiniz.

image.png

RoadRunner, geliştirmeyi hızlandırır, uygulama verimliliğini ve performansını iyileştirir. Ayrıca developer camiasının PHP'ye ilişkin sahip olduğu varsayımların çoğunu tersine çevirme gücüne sahiptir.