Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Multithreading dalam PHP dan cara melaksanakannya

Multithreading dalam PHP dan cara melaksanakannya

王林
王林asal
2023-06-23 11:08:253643semak imbas

Berbilang benang merujuk kepada menjalankan berbilang utas (aliran pelaksanaan program) pada masa yang sama dalam aplikasi dan boleh melaksanakan berbilang tugas pada masa yang sama. Dalam PHP, multi-threading digunakan secara meluas dalam senario yang memerlukan berbilang tugasan untuk dilakukan secara serentak, seperti pengiraan data besar, akses serentak, dsb. Artikel ini akan memperkenalkan multi-threading dalam PHP dan cara melaksanakannya.

1. Prinsip pelaksanaan multi-threading PHP

Sebelum benar-benar memahami kaedah pelaksanaan multi-threading PHP, terdapat konsep yang perlu difahami, dan itu adalah hubungan antara proses dan utas . Proses merujuk kepada contoh program yang sedang berjalan Setiap proses mempunyai ruang memori dan sumbernya sendiri, dan proses adalah bebas antara satu sama lain. Benang ialah unit boleh laku dalam proses Suatu proses boleh mengandungi berbilang utas dan berkongsi sumber proses. Kelebihan berbilang benang berbanding berbilang proses ialah menukar antara benang lebih pantas daripada bertukar antara proses, dan overhed sumber adalah lebih kecil. Ia sesuai untuk senario seperti akses serentak yang memerlukan pelaksanaan berbilang tugas pada masa yang sama.

Dalam PHP, untuk melaksanakan multi-threading, anda perlu menggunakan sambungan yang dipanggil perpustakaan "PCNTL". Sambungan ini menyediakan satu set fungsi yang boleh mengawal proses dan pengendalian isyarat, membolehkan pengaturcaraan berbilang proses dan berbilang benang.

2. Cara melaksanakan multi-threading dalam PHP

1 Gunakan fungsi pcntl_fork() untuk mencipta proses anak

Gunakan fungsi pcntl_fork() dalam PHP untuk mencipta proses anak Proses semasa disalin ke dalam dua proses, satu proses induk dan satu lagi proses anak. Proses ibu bapa dan proses anak adalah dua proses bebas, tetapi mereka berkongsi beberapa sumber. Ciri ini boleh digunakan untuk melaksanakan multi-threading.

Berikut ialah contoh untuk mencipta 5 sub-proses, setiap sub-proses menjalankan tugas yang berbeza:

<?php
$workers = 5;

for ($i = 0; $i < $workers; $i++) {
    $pid = pcntl_fork();
    if ($pid === -1) {
        die('Could not fork');
    } elseif ($pid) {
        // 父进程继续执行
    } else {
        // 子进程执行任务
        sleep(5);
        exit(0);
    }
}

// 父进程等待所有子进程结束
while (pcntl_waitpid(0, $status) != -1) {
    $status = pcntl_wexitstatus($status);
    echo "Child $status completed
";
}
?>

2 Gunakan fungsi pcntl_signal() untuk melaksanakan pemprosesan isyarat

Dalam berbilang benang Untuk mengelakkan konflik antara benang yang berbeza, mekanisme pemprosesan isyarat perlu digunakan untuk mengendalikan isu penyegerakan dalam berbilang benang.

Gunakan fungsi pcntl_signal() dalam PHP untuk menetapkan kaedah pemprosesan isyarat. Berikut ialah contoh, mencipta 5 proses anak, setiap proses anak melaksanakan tugas yang berbeza Apabila semua proses anak telah menyelesaikan tugas mereka, proses induk terus melaksanakan:

<?php
$workers = 5;
$jobs = [];

// 子进程任务
function doJob($job) {
    echo "Worker $job start
";
    sleep(5);
    echo "Worker $job completed
";
}

// 信号处理函数
function sig_handler($signo) {
    global $jobs;
    switch ($signo) {
        case SIGCHLD:
            // 检查所有子进程是否都已经结束
            while (($pid = pcntl_waitpid(-1, $status, WNOHANG)) > 0) {
                $jobs--;
            }
            break;
    }
}

// 安装信号处理器
pcntl_signal(SIGCHLD, "sig_handler");

// 创建子进程
for ($i = 0; $i < $workers; $i++) {
    $pid = pcntl_fork();
    if ($pid == -1) {
        die('Could not fork');
    } elseif ($pid == 0) {
        // 子进程执行任务
        doJob($i);
        exit(0);
    } else {
        // 父进程继续执行
        $jobs++;
    }
}

// 父进程等待所有子进程结束
while ($jobs > 0) {
    sleep(1);
}

// 所有子进程都已完成任务
echo "All workers completed
";
?>

Di atas ialah cara PHP melaksanakan multi-threading. Anda boleh Pilih mengikut keperluan sebenar.

3. Ringkasan

Kaedah pelaksanaan berbilang benang dalam PHP bergantung terutamanya pada lanjutan pustaka "PCNTL" Gunakan fungsi pcntl_fork() untuk mencipta proses anak, dan gunakan pcntl_signal() berfungsi untuk melaksanakan pemprosesan isyarat Dalam pengaturcaraan berbilang benang, anda perlu memberi perhatian kepada isu penyegerakan dan menyegerakkan pemprosesan antara benang yang berbeza untuk mengelakkan konflik.

Atas ialah kandungan terperinci Multithreading dalam PHP dan cara melaksanakannya. 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