Rumah >rangka kerja php >Workerman >Atribut reusePort dalam Workerman yang anda perlu tahu

Atribut reusePort dalam Workerman yang anda perlu tahu

醉折花枝作酒筹
醉折花枝作酒筹asal
2021-07-23 16:01:353057semak imbas

Workerman ialah rangka kerja soket PHP tak segerak berprestasi tinggi sumber terbuka yang dibangunkan semata-mata dalam PHP. Menyokong sambungan panjang TCP dan banyak protokol seperti soket web dan MQTT. Hari ini kami akan memperkenalkan atribut reusePort dalam Workerman Anda boleh merujuknya jika perlu.

Atribut reusePort dalam Workerman yang anda perlu tahu

Workerman ialah rangka kerja pelayan Soket PHP berprestasi tinggi. Anda boleh menggunakan Workerman untuk memprogram secara langsung pada lapisan TCP Rutin pengaturcaraan asas ialah:

$w = new Workerman\Worker('tcp://0.0.0.0:80');
$w->count = 4;
$w->onMessage = function(Workerman\COnnection\TcpConnection $connection, array $data) {
    $connection->send('Hello World');
};
Worker::runAll();

Semasa proses penggunaan, saya tertanya-tanya jika anda telah melihat parameter reusePort, iaitu. ditetapkan secara lalai adalah palsu. Apakah kegunaan parameter ini? Dalam keadaan apakah kita perlu menetapkannya kepada benar untuk meningkatkan prestasi?

1. Peranan penggunaan semula

Mengenai parameter reusePort, dokumen rasmi Workerman menerangkannya dengan cara ini:

Benarkan berbilang orang yang tidak berkaitan selepas menghidupkan penggunaan semula port mendengar Proses berkaitan mendengar port yang sama, dan kernel sistem melakukan pengimbangan beban dan menentukan proses untuk menyerahkan sambungan soket kepada, mengelakkan kesan kumpulan gemuruh dan meningkatkan prestasi aplikasi sambungan pendek berbilang proses.

Jika anda belum mempelajari pengaturcaraan rangkaian Linux secara mendalam, sukar untuk memahami ayat ini. Berikut ialah penjelasan ringkas:

Atur cara pelayan biasanya menerima permintaan pelanggan dengan mendengar nombor port tertentu pada pelayan. Di Linux, nombor port kad rangkaian pelayan disarikan ke dalam Soket.

Untuk meningkatkan prestasi, program pelayan umum mempunyai berbilang proses (biasanya dikenali sebagai Worker) mendengar Soket yang sama apabila tiada sambungan pelanggan datang, Pekerja ini digantung nyatakan, tiada sumber CPU digunakan.

Jika sambungan pelanggan tiba pada masa tertentu, kernel Linux akan membangunkan Pekerja ini pada masa yang sama dan membiarkan mereka bersaing untuk mengendalikan sambungan

Akibatnya, hanya seorang Pekerja akan mendapat peluang untuk mengendalikan sambungan , Pekerja lain terus kembali ke negeri yang digantung selepas pertandingan gagal. Proses menyedarkan Pekerja menggunakan sumber CPU Lebih ramai Pekerja, lebih banyak sumber CPU digunakan, mengakibatkan pembaziran sumber. Ini sering dirujuk sebagai Kesan Kumpulan Mengejutkan.

Anda mungkin bertanya: Mengapa tidak hanya bangunkan seorang Pekerja pada satu masa? Malangnya, kernel Linux tidak mempunyai ciri sedemikian.

Nasib baik, dalam Linux 3.9 dan versi yang lebih baru, ciri penggunaan semula ditambah. Apakah kegunaan ciri ini?

Sebelum penggunaan semula, nombor port hanya boleh dipantau oleh satu Soket Dengan penggunaan semula, sekatan ini dipecahkan: nombor port boleh dipantau oleh berbilang Soket pada masa yang sama.

Seperti yang dinyatakan sebelum ini, kernel Linux tidak boleh membangkitkan hanya seorang Pekerja pada satu masa, tetapi kernel boleh menghantar sambungan klien secara sama rata kepada sekumpulan Soket yang mendengar pada port yang sama.

Seperti yang ditunjukkan dalam rajah, setiap Pekerja mempunyai Soket sendiri, semuanya mendengar pada port yang sama. Apabila sambungan pelanggan tiba, kernel memajukan sambungan ke Soket, dan Soket ini hanya akan membangunkan Pekerja di mana ia berada. Ini dengan bijak menyelesaikan Kesan Gerombolan Gemuruh dan meningkatkan prestasi keseluruhan.

Daripada ini, kita boleh membuat kesimpulan: Jika versi kernel Linux anda ialah 3.9 dan ke atas, apabila menggunakan Workerman, anda boleh menetapkan reusePort kepada true untuk meningkatkan kecekapan menjalankan program.

2. Cara Workerman menggunakan reuseport

Walaupun anda hanya perlu menetapkan reusePort kepada true dalam Workerman, anda boleh menikmati ciri lanjutan Linux ini. Tetapi dalam kod sumber Workerman, ia bukan semudah menghidupkan parameter kernel. Workerman menyembunyikan banyak butiran reka bentuk untuk anda, mari lihat. Kelas

Worker ialah kelas yang paling penting dalam Workerman, dan terdapat fungsi listen():

protected function listen()
{
    ...
    if (!$this->_mainSocket) {
        ...
        $this->_mainSocket = stream_socket_server(...);
        ...
    }
    ...
}

listen() Fungsi fungsi adalah untuk mencipta Soket dalam proses semasa dan mulakan Dengar untuk permintaan.

Apabila reusePort adalah palsu, proses utama memanggil fungsi listen() sebelum mencipta Worker:

protected function initWorkers() {
    ....
    if (!$worker->reusePort) {
        $worker->listen();
    }
    ....
}

Kemudian proses utama mencipta Worker melalui pcntl_fork( ). pcntl_fork() mempunyai ciri: pembolehubah dalam proses anak yang dicipta (Pekerja) disalin daripada proses induk, termasuk mainSocket yang dicipta oleh proses induk. Oleh itu, apabila reusePort adalah **palsu**, semua Pekerja menyalin Soket utama proses induk. Oleh itu, apabila reusePort adalah ∗∗false∗∗, semua Pekerja menyalin _mainSocket proses induk, iaitu berkongsi satu Soket.

Tetapi apabila reusePort adalah benar, keadaannya berbeza. Proses utama tidak akan memanggil listen() sebelum mencipta Pekerja Sebaliknya, setiap Pekerja akan memulakan panggilan listen() sendiri selepas mencipta Pekerja:

protected static function forkOneWorkerForLinux($worker) {
    ...
    $pid = pcntl_fork();
    if ($pid === 0) {
        if ($worker->reusePort) {
            $worker->listen();
        }
        ...
    }
    ...
}

Hasilnya ialah setiap anak memproses (. Pekerja ) telah mencipta Soket mereka sendiri.

Akhir sekali, jika anda mahu kernel mendayakan fungsi penggunaan semula, anda perlu menetapkan konteks Soket secara manual:

if ($this->reusePort) {
    $context = stream_context_create();
    stream_context_set_option($context, 'socket', 'so_reuseport', 1);
}

推荐学习:php视频教程

Atas ialah kandungan terperinci Atribut reusePort dalam Workerman yang anda perlu tahu. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn