Werfen Sie einen Blick auf PHP-Mehrprozessverarbeitungsaufgaben

coldplay.xixi
Freigeben: 2023-04-09 15:44:01
nach vorne
4583 Leute haben es durchsucht

Werfen Sie einen Blick auf PHP-Mehrprozessverarbeitungsaufgaben

pcntl-Modul (Nicht-Unix-Systeme unterstützen dieses Modul nicht)

pcntl 模块(非 Unix 类系统不支持此模块)

一个 PHP 多进程简单例子大概是这个样子:

// 5 个子进程处理任务for ($i = 0; $i < 5; $i++) {
    $pid = pcntl_fork();    if ($pid == -1) {        die("could not fork");
    } elseif ($pid) {        echo "I&#39;m the Parent $i\n";
    } else { // 子进程处理
        echo "I&#39;m the Child $i\n";        // 业务处理
        exit($i); // 一定要注意退出子进程,否则 pcntl_fork() 会被子进程再 fork,带来处理上的影响。
    }
}// 等待子进程执行结束while (pcntl_waitpid(0, $status) != -1) {
    $status = pcntl_wexitstatus($status);    echo "Child $status completed\n";
}复制代码
Nach dem Login kopieren

当然实际应用中我们不能够这样输出代码,不够健壮,也不够优雅,我所以找了个基于 pcntl 封装的扩展包来使用。

spatie/async - 基于 pcntl 封装的扩展包

以下是我使用 spatie/asyncEin einfaches Beispiel für PHP-Mehrprozess sieht wahrscheinlich so aus:

/**
 * @param string $keyword
 *
 * @return array
 */public function searchAll(string $keyword): array{
    $songAll = [];    foreach ($this->platforms as $platform) {
        $songAll = array_merge($songAll, $this->search($platform, $keyword));
    }    return $songAll;
}/**
 * @param string $platform
 * @param string $keyword
 *
 * @return mixed
 */public function search(string $platform, string $keyword){
    $meting = $this->getMeting($platform);

    $songs = json_decode($meting->format()->search($keyword), true);    foreach ($songs as $key => &$song) {
        $detail = json_decode($meting->format()->url($song[&#39;url_id&#39;]), true);        if (empty($detail[&#39;url&#39;])) {            unset($songs[$key]);
        }
        $song = array_merge($song, $detail);
    }    unset($song);    return $songs;
}复制代码
Nach dem Login kopieren

Natürlich können wir das nicht dies in tatsächlichen Anwendungen Der Ausgabecode ist nicht robust genug oder elegant genug, daher habe ich ein Erweiterungspaket basierend auf dem pcntl-Paket zur Verwendung gefunden.

spatie/async – Erweiterungspaket basierend auf dem pcntl-Paket

Das Folgende ist, was ich spatie/async zum Beispiel für die Optimierung einer Multiprozess-AnfrageWerfen Sie einen Blick auf PHP-Mehrprozessverarbeitungsaufgaben

Originalcode (dauert etwa 20 Sekunden) – github.com/guanguans/m…

Werfen Sie einen Blick auf PHP-Mehrprozessverarbeitungsaufgaben

/**
 * @param string $keyword
 *
 * @return array
 */public function searchAll(string $keyword): array{
    $songAll = [];
    $pool = Pool::create();    foreach ($this->platforms as $platform) {
        $pool->add(function () use ($platform, $keyword) {            return $this->search($platform, $keyword);
        }, $this->getSerializedOutput())->then(function ($output) use (&$songAll) {
            $songAll = array_merge($songAll, $output);
        })->catch(function (\Throwable $exception) {            exit($exception->getMessage());
        });
    }
    $pool->wait();    return $songAll;
}/**
 * @return mixed
 */public function search(string $platform, string $keyword){
    $meting = $this->getMeting($platform);
    $songs = json_decode($meting->format()->search($keyword), true);

    $pool = Pool::create();    foreach ($songs as $key => &$song) {
        $pool->add(function () use ($meting, $song) {            return json_decode($meting->format()->url($song[&#39;url_id&#39;]), true);
        })->then(function ($output) use (&$songs, &$song, $key) {
            $song = array_merge($song, $output);            if (empty($song[&#39;url&#39;])) {                unset($songs[$key]);
            }
        })->catch(function (\Throwable $exception) {            exit($exception->getMessage());
        });
    }    unset($song);
    $pool->wait();    return $songs;
}复制代码
Nach dem Login kopieren
Nach der Verbesserung (dauert etwa 4 Sekunden) – github.com/guanguans/m…

rrreeeWenn Sie mehr über das Programmieren erfahren möchten, achten Sie bitte auf die Rubrik php-Schulung

! 🎜🎜🎜🎜

Das obige ist der detaillierte Inhalt vonWerfen Sie einen Blick auf PHP-Mehrprozessverarbeitungsaufgaben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.im
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!