Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Panduan Permulaan untuk PHP: Pengaturcaraan Berbilang Thread

Panduan Permulaan untuk PHP: Pengaturcaraan Berbilang Thread

WBOY
WBOYasal
2023-05-20 12:51:06917semak imbas

PHP ialah bahasa pengaturcaraan sebelah pelayan yang popular digunakan untuk mencipta aplikasi web dan tapak web dinamik. Walaupun PHP tidak menyokong pengaturcaraan berbilang benang secara asli, ia menyediakan alatan dan sambungan yang boleh digunakan untuk melaksanakan operasi I/O tanpa sekatan dan komunikasi antara proses. Artikel ini akan memperkenalkan pengetahuan asas dan alatan pengaturcaraan berbilang benang PHP.

  1. Asas pengaturcaraan berbilang benang

Pengaturcaraan berbilang benang ialah kaedah pengaturcaraan serentak yang membenarkan atur cara melaksanakan berbilang tugas pada masa yang sama. Benang ialah unit terkecil untuk sistem pengendalian untuk memperuntukkan sumber Ia mempunyai laluan pelaksanaan kod bebas dan timbunan (panggilan fungsi storan dan pembolehubah setempat). Sumber seperti memori dan deskriptor fail boleh dikongsi antara benang, jadi alat penyegerakan seperti kunci dan pembolehubah keadaan perlu digunakan untuk mengelakkan keadaan perlumbaan.

Dalam PHP, mencipta benang memerlukan penggunaan fungsi yang disediakan oleh sambungan PCNTL. PCNTL ialah lanjutan PHP yang menyediakan antara muka untuk kawalan proses PHP. Menggunakan sambungan PCNTL, kami boleh mencipta dan mengurus subproses, menghantar dan menerima isyarat serta mengendalikan peristiwa keluar proses dan banyak lagi.

  1. sambungan PCNTL

sambungan PHP PCNTL menyediakan beberapa fungsi yang boleh digunakan untuk pengaturcaraan berbilang benang Berikut ialah beberapa fungsi biasa:

pcntl_fork(): Buat proses kanak-kanak dan salin semua sumber proses semasa (termasuk kod dan data). Satu-satunya perbezaan antara proses anak dan proses induk ialah mereka mempunyai ID proses yang berbeza. Proses induk boleh menggunakan ID ini untuk memantau dan mengawal proses anak.

pcntl_wait($status): Tunggu sebarang proses kanak-kanak untuk keluar dan dapatkan status keluarnya. Fungsi ini menyekat pelaksanaan proses semasa sehingga mana-mana proses anak keluar.

pcntl_signal($sig, $handler): Daftar pemproses isyarat dan panggil fungsi pemprosesan yang ditentukan apabila isyarat yang ditentukan diterima. Anda boleh menggunakan fungsi ini untuk menangkap dan mengendalikan penamatan proses anak, gangguan dan peristiwa lain.

pcntl_alarm($seconds): Pasang isyarat pemasa yang menghantar isyarat SIGALARM selepas beberapa saat yang ditetapkan. Anda boleh menggunakan fungsi ini untuk melaksanakan beberapa tugas dengan kerap, seperti tinjauan pendapat untuk menyemak status proses dan peristiwa kemas kini fail.

  1. Komunikasi antara proses

Dalam pengaturcaraan berbilang benang, komunikasi antara proses (IPC) adalah penting. PHP menyediakan pelbagai kaedah IPC, seperti:

(1) Paip: membenarkan data ditukar antara dua proses yang berkaitan, di mana satu proses menulis data dan proses yang lain membaca data.

(2) Baris gilir mesej: Mekanisme untuk memindahkan data antara proses. Proses boleh menghantar dan menerima mesej melalui baris gilir mesej, yang melaksanakan komunikasi tak segerak.

(3) Memori dikongsi: Berbilang proses boleh mengakses kawasan memori kongsi yang sama untuk berkongsi status dan data.

(4) Semaphore: digunakan untuk penyegerakan dan pengecualian bersama antara pelbagai proses untuk mengelakkan keadaan perlumbaan.

  1. Pelaksanaan pengaturcaraan berbilang benang dalam PHP

Melaksanakan pengaturcaraan berbilang benang dalam PHP memerlukan penggunaan sambungan PCNTL dan alatan IPC yang berkaitan. Berikut ialah contoh pengaturcaraan berbilang benang PHP mudah:

<?php

$pid = pcntl_fork();

if ($pid == -1) {
    die('could not fork');
} else if ($pid) {
    // 父进程
    pcntl_wait($status); // 等待子进程退出
} else {
    // 子进程
    echo "child process
";
    sleep(5);
    exit(0); // 退出子进程
}

echo "parent process
";

Contoh ini mencipta proses anak dan mencetak mesej dalam proses anak. Proses induk menunggu proses anak keluar sebelum keluar. Dalam aplikasi praktikal, alat IPC boleh digunakan untuk melaksanakan komunikasi antara proses dan penyegerakan. Contohnya, gunakan baris gilir mesej untuk melaksanakan penghantaran mesej antara proses ibu bapa dan anak:

<?php

$parent_pid = getmypid(); // 获取父进程ID
$msg_queue = msg_get_queue(123); // 创建消息队列

$pid = pcntl_fork();

if ($pid == -1) {
    die('could not fork');
} else if ($pid) {
    // 父进程
    sleep(1); // 等待子进程创建消息队列
    msg_send($msg_queue, $parent_pid, "Hello, child process!"); // 发送消息
    echo "message sent
";
    pcntl_wait($status); // 等待子进程退出
} else {
    // 子进程
    $child_pid = getmypid(); // 获取子进程ID
    echo "child process
";
    $msg = null;
    msg_receive($msg_queue, $child_pid, $msgtype, 1024, $msg); // 接收消息
    echo "received message: $msg
";
    exit(0); // 退出子进程
}

echo "parent process
";

Contoh ini mencipta baris gilir mesej dan menghantar mesej rentetan antara proses ibu bapa dan anak. Proses induk menunggu proses anak keluar sebelum keluar. Ambil perhatian bahawa dalam contoh ini anda perlu menggunakan ID proses sebagai jenis mesej untuk menghalang mesej daripada diterima oleh proses lain.

  1. Ringkasan

Walaupun PHP sendiri tidak menyokong multi-threading, dengan menggunakan sambungan PCNTL dan alatan IPC yang berkaitan, kami boleh mencapai pengaturcaraan berbilang benang, kawalan konkurensi dan IPC komunikasi, dsb. Fungsi. Pengaturcaraan berbilang benang boleh meningkatkan prestasi dan responsif program, tetapi penjagaan mesti diambil untuk mengelakkan masalah seperti keadaan perlumbaan dan kebuntuan. Dalam aplikasi praktikal, alat dan teknologi yang sesuai perlu dipilih mengikut senario tertentu.

Atas ialah kandungan terperinci Panduan Permulaan untuk PHP: Pengaturcaraan Berbilang Thread. 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