Swoole 在 PHP-fpm/apache 中使用 task 功能

php迷途小書童 發表於 2019-08-13
  • 新建RedisServer.php
  • 程式碼如下
    <?php
    use Swoole\Redis\Server;
    $server = new Server("127.0.0.1", 9501, SWOOLE_PROCESS );
    $server->set(array(
        'task_worker_num' => 32,
        'worker_num' => 1,
        'task_enable_coroutine' => true,
        'heartbeat_check_interval' => 5,
        'heartbeat_idle_time' => 10,
    ));
    $server->setHandler('LPUSH', function ($fd, $data) use ($server) {
        $taskId = $server->task($data);
        if ($taskId === false) {
            $server->send($fd, Server::format(Server::ERROR));
        } else {
            $server->send($fd, Server::format(Server::INT, $taskId));
        }
    });
    $server->on('Finish', function($serv, $taskID, $data) {
        $stats = $serv->stats();
        if ($stats['tasking_num'] > 10) { //tasking_num 當前正在排隊的任務數
            echo "剩餘任務資訊:" . json_encode($serv->stats()) . "\n";
        }
    });
    $server->on('Task', function ($serv, $data) {
        go(function () {
            usleep(50000);
        });
        var_dump($data);
    });
    $server->start();

    task裡面 usleep(50000);模擬任務執行時間

  • 新建Queue.php
  • 程式碼如下
    <?php
    $redis = new Redis;
    $redis->connect('127.0.0.1', 9501);
    $x=1; 
    while($x <= 1000) {
      $redis->lpush("myqueue", json_encode(array("hello".$x, "swoole")));
      $x++;
    } 

    模擬1000的任務投遞
    經測試,1秒處理完畢

    可以根據Task任務執行的速度調節task_worker_num控制啟動的程式數量

  • 這些程式是由swoole底層負責管理的,在發生致命錯誤或程式退出後底層會重新建立新的任務程式

    task_worker_num

  • 最大值不得超過SWOOLE_CPU_NUM * 1000
  • 單個task的處理耗時,如100ms,那一個程式1秒就可以處理1/0.1=10個task
  • task投遞的速度,如每秒產生2000個task
  • 2000/10=200,需要設定task_worker_num => 200,啟用200個task程式

相關文章

PHP 基礎 PHP

PHP 基礎

註釋:// 多行註釋.// 單行註釋.變數命規範(1))以$開頭; 如:$a(2)由字母數字下劃線組成,但是不能以數字開頭;(3)可以使用中文,但是不推薦使用;(4)變數名嚴格區分大小寫;(5)
PHP 反射之動態代理 PHP

PHP 反射之動態代理

反射可以探知類的內部結構 可以用它做hook實現外掛功能,或者做動態代理與反射相關類和物件相關的函式get_object_varsget_class_methodsget_class_varsget
phpStudy 後門如何檢測和修復 PHP

phpStudy 後門如何檢測和修復

原文:http://soft.antted.com/news/8背景一篇《Phpstudy官網於2016年被入侵,犯罪分子篡改軟體並植入後門》讓人觸目驚心,從官網的下載官方安裝包也會有問題,由此可想而
🚀 Hyperf 釋出 v1.0.16 版本 | 企業級的 PHP 微服務協程框架 框架|PHP|微服務

🚀 Hyperf 釋出 v1.0.16 版本 | 企業級的 PHP 微服務協程框架

本週更新主要新增了 協程執行控制 的功能,通過 Hyperf\Utils\Coroutine\Concurrent 可以實現一個程式碼塊內限制同時最多執行的協程數量的功能 ,同時還修復了一些元件的 B
SMProxy 分析 (基於 Swoole 開發的 MySQL 資料庫連線池) 資料庫|MySQL|Swoole

SMProxy 分析 (基於 Swoole 開發的 MySQL 資料庫連線池)

前言: 在深入瞭解SMProxy之前,一直認為連線池是對mysql連線物件進行統一管理的處理,但是隨之而來的問題是現有的php框架都沒有自帶mysql連線池,如何以最小的代價替代框架的資料庫模組
JavaScript 和 PHP base64 加密解密 亂碼問題 JavaScript|PHP|加密

JavaScript 和 PHP base64 加密解密 亂碼問題

記錄以下base64加解密base64是通用的加解密方法,JavaScript也有現成的庫可以使用,PHP更是有現成函式可用。1 前端引入一個庫var html_source = base64.enc
PHP 多程式與訊號中斷實現多工常駐記憶體管理【Master/Worker 模型】 PHP

PHP 多程式與訊號中斷實現多工常駐記憶體管理【Master/Worker 模型】

本文章基於pcntl擴充套件做的多程式測試。程式排程策略:父子程式的排程由作業系統來負責,具體先排程子程式還是父程式由系統的排程演算法決定,當然可以在父程式加上延時或是呼叫程式回收函式pcntl_wa
關於 PHP 記憶體溢位的思考 PHP

關於 PHP 記憶體溢位的思考

背景最近做大批量資料匯出和資料匯入的時候,經常會遇到PHP記憶體溢位的問題,在解決了問題之後,總結了一些經驗,整理成文章記錄下。優化點優化SQL語句,避免慢查詢,合理的建立索引,查詢指定的欄位,sql
大話 swoole 非同步程式設計 Swoole

大話 swoole 非同步程式設計

遵從硬體不行軟體來湊,出現了各種壓榨CPU幹活的非同步程式設計技術。程式生死,一般遵循誰生誰管,當然兒子出問題(退出),會被告知老爸。沒了爸了孩子(子程式)會被特殊程式收編。非同步程式設計,通常是想好
手把手使用 PHP 實現 LRU 快取淘汰演算法 演算法|PHP

手把手使用 PHP 實現 LRU 快取淘汰演算法

:pencil2:LRU(cache):hourglass:LRU介紹快取是一種提高資料讀取效能的技術。但是對於計算機來說,並不可能快取所有的資料,在達到它的臨界空間時,我們需要通過一些規則用新的資料
Swoole 回撥函式的註冊與呼叫 Swoole

Swoole 回撥函式的註冊與呼叫

swoole的回撥函式大致分為兩種。一種是事件回撥,是swoole啟動執行時觸發的回撥。另一種是埠回撥,這類回撥的特點是都有fd引數傳入。//註冊回撥的函式。static PHP_METHOD(swo
求一個 phpstorm 的舒適護眼主題 PHP

求一個 phpstorm 的舒適護眼主題

求一個phpstorm的舒適護眼主題!!!