Maison >développement back-end >tutoriel php >Comment puis-je implémenter le multithreading en PHP ?

Comment puis-je implémenter le multithreading en PHP ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-25 06:24:12555parcourir

How Can I Implement Multithreading in PHP?

Comment utiliser le multi-threading en PHP

Introduction

Est-il possible d'implémenter le modèle multi-threading en PHP, s'il faut réellement l'implémenter ou simplement le simuler. Auparavant, il était suggéré de forcer le système d'exploitation à charger une autre instance de l'exécutable PHP et à gérer d'autres processus simultanés.

Le problème est que lorsque le code PHP termine son exécution, l'instance PHP réside toujours en mémoire car elle ne peut pas être terminée depuis PHP. Vous pouvez donc imaginer ce qui se passera si vous simulez plusieurs threads. Je cherche donc toujours un moyen d'effectuer ou de simuler efficacement le multi-threading en PHP. Des idées ?

Le multi-threading est possible en PHP

Oui, vous pouvez utiliser pthreads pour le multi-threading en PHP.

D'après la documentation PHP :

pthreads est une API orientée objet qui fournit tous les outils nécessaires au multithreading en PHP. Les applications PHP peuvent créer, lire, écrire, exécuter et synchroniser des threads, des threads de travail et des objets threadés.

Attention :
L'extension pthreads ne peut pas être utilisée dans un environnement de serveur Web. Par conséquent, le multithreading en PHP devrait être limité aux applications basées sur CLI.

Test simple

#!/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();
}

?>

Cas réel

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);
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn