亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP多進程處理任務的案例

發布時間:2020-10-09 17:15:05 來源:億速云 閱讀:226 作者:小新 欄目:編程語言

這篇文章主要介紹了PHP多進程處理任務的案例,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

pcntl 模塊(非 Unix 類系統不支持此模塊)

一個 PHP 多進程簡單例子大概是這個樣子:

// 5 個子進程處理任務for ($i = 0; $i < 5; $i++) {
    $pid = pcntl_fork();    if ($pid == -1) {        die("could not fork");
    } elseif ($pid) {        echo "I'm the Parent $i\n";
    } else { // 子進程處理
        echo "I'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";
}

當然實際應用中我們不能夠這樣輸出代碼,不夠健壯,也不夠優雅,我所以找了個基于 pcntl 封裝的擴展包來使用。

spatie/async - 基于 pcntl 封裝的擴展包

以下是我使用 spatie/async 來優化一個多進程請求的例子

原代碼(耗時 20s 左右)- github.com/guanguans/m…

PHP多進程處理任務的案例

/**
 * @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['url_id']), true);        if (empty($detail['url'])) {            unset($songs[$key]);
        }
        $song = array_merge($song, $detail);
    }    unset($song);    return $songs;
}

改進后(耗時 4s 左右)- github.com/guanguans/m…

PHP多進程處理任務的案例

/**
 * @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['url_id']), true);
        })->then(function ($output) use (&$songs, &$song, $key) {
            $song = array_merge($song, $output);            if (empty($song['url'])) {                unset($songs[$key]);
            }
        })->catch(function (\Throwable $exception) {            exit($exception->getMessage());
        });
    }    unset($song);
    $pool->wait();    return $songs;
}

感謝你能夠認真閱讀完這篇文章,希望小編分享PHP多進程處理任務的案例內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

台北市| 科技| 阜康市| 勃利县| 凌海市| 碌曲县| 茌平县| 大兴区| 湖口县| 萨迦县| 南平市| 阿图什市| 龙游县| 丹巴县| 张家口市| 武城县| 东莞市| 友谊县| 景洪市| 毕节市| 铁岭市| 全南县| 东平县| 勃利县| 望奎县| 张掖市| 邓州市| 齐齐哈尔市| 河间市| 永昌县| 嵊泗县| 巩留县| 太原市| 丁青县| 平定县| 吉首市| 涟源市| 洪泽县| 申扎县| 松阳县| 阜阳市|