Rumah > pembangunan bahagian belakang > tutorial php > Bagaimanakah Saya Boleh Melaksanakan Multithreading dalam PHP?

Bagaimanakah Saya Boleh Melaksanakan Multithreading dalam PHP?

Linda Hamilton
Lepaskan: 2024-12-25 06:24:12
asal
608 orang telah melayarinya

How Can I Implement Multithreading in PHP?

Cara menggunakan multi-threading dalam PHP

Pengenalan

Adakah mungkin untuk melaksanakan model multi-threading dalam PHP, sama ada untuk benar-benar melaksanakan atau hanya mensimulasikannya. Sebelum ini, dicadangkan untuk memaksa sistem pengendalian memuatkan satu lagi contoh PHP boleh laku dan mengendalikan proses serentak yang lain.

Masalah dengan ini ialah apabila kod PHP menyelesaikan pelaksanaan, tika PHP masih berada dalam ingatan kerana ia tidak boleh ditamatkan daripada PHP. Jadi anda boleh bayangkan apa yang akan berlaku jika anda mensimulasikan berbilang benang. Jadi saya masih mencari cara untuk melaksanakan atau mensimulasikan multi-threading dengan cekap dalam PHP. Ada idea?

Berbilang benang boleh dilakukan dalam PHP

Ya, anda boleh menggunakan pthread untuk berbilang benang dalam PHP.

Menurut dokumentasi PHP:

pthreads ialah API berorientasikan objek yang menyediakan semua alatan yang diperlukan untuk multithreading dalam PHP. Aplikasi PHP boleh mencipta, membaca, menulis, melaksanakan dan menyegerakkan benang, benang pekerja dan objek berulir.

Amaran:
Pelanjutan pthreads tidak boleh digunakan dalam persekitaran pelayan web. Oleh itu, multithreading dalam PHP harus dihadkan kepada aplikasi berasaskan CLI.

Ujian mudah

#!/usr/bin/php
<?php
class AsyncOperation extends Thread {

    public function __construct($arg) {
        $this->arg = $arg;
    }

    public function run() {
        if ($this->arg) {
            $sleep = mt_rand(1, 10);
            printf('%s: %s  -start -sleeps %d' . "\n", date("g:i:sa"), $this->arg, $sleep);
            sleep($sleep);
            printf('%s: %s  -finish' . "\n", date("g:i:sa"), $this->arg);
        }
    }
}

// 创建一个数组
$stack = array();

// 启动多线程
foreach ( range("A", "D") as $i ) {
    $stack[] = new AsyncOperation($i);
}

// 启动所有线程
foreach ( $stack as $t ) {
    $t->start();
}

?>
Salin selepas log masuk

Kes sebenar

error_reporting(E_ALL);
class AsyncWebRequest extends Thread {
    public $url;
    public $data;

    public function __construct($url) {
        $this->url = $url;
    }

    public function run() {
        if (($url = $this->url)) {
            /*
             * 如果请求大量数据,你可能想要使用 fsockopen 和 read,并在读取之间使用 usleep
             */
            $this->data = file_get_contents($url);
        } else
            printf("Thread #%lu was not provided a URL\n", $this->getThreadId());
    }
}

$t = microtime(true);
$g = new AsyncWebRequest(sprintf("http://www.google.com/?q=%s", rand() * 10));
/* 开始同步 */
if ($g->start()) {
    printf("Request took %f seconds to start ", microtime(true) - $t);
    while ( $g->isRunning() ) {
        echo ".";
        usleep(100);
    }
    if ($g->join()) {
        printf(" and %f seconds to finish receiving %d bytes\n", microtime(true) - $t, strlen($g->data));
    } else
        printf(" and %f seconds to finish, request failed\n", microtime(true) - $t);
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Multithreading dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan