ホームページ PHPフレームワーク Workerman thinkphp6 での workman の使用方法の簡単な分析 [チュートリアルの共有]

thinkphp6 での workman の使用方法の簡単な分析 [チュートリアルの共有]

Dec 08, 2022 pm 08:30 PM
thinkphp workerman thinkphp6

thinkphp6中怎么使用workerman?下面本篇文章给大家介绍一下thinkphp6整合workerman的教程,希望对大家有所帮助。

thinkphp6 での workman の使用方法の簡単な分析 [チュートリアルの共有]

thinkphp6整合workerman教程

thinkphp6安装workerman命令:

composer require topthink/think-worker
ログイン後にコピー

第一步,创建一个自定义命令类文件,运行指令。【相关推荐:《workerman教程》】

php think make:command Spider spider
ログイン後にコピー

会生成一个app\command\Spider命令行指令类,我们修改内容如下:

<?php
namespace app\command;
 
// tp指令特性使用的功能
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\Output;
 
// 引用项目的基类,该类继承自worker
use app\server\controller\Start;
 
/**
 * 指令类
 * 在此定义指令
 * 再次启动多个控制器
 * @var mixed
 */
class Spider extends Command
{
 
    /**
     * 注册模块名称
     * 使用命令会启动该模块控制器
     * @var mixed
     */
    public $model_name = &#39;server&#39;;
 
    /**
     * 注册控制器名称
     * 使用命令启动相关控制器
     * @var mixed
     */
    public $controller_names = [&#39;WebhookTimer&#39;];
 
    /**
     * configure
     * tp框架自定义指令特性
     * 注册命令参数
     * @return mixed
     */
    protected function configure()
    {
        $this->setName(&#39;spider&#39;)
            ->addArgument(&#39;status&#39;, Argument::OPTIONAL, "status")
            ->addArgument(&#39;controller_name&#39;, Argument::OPTIONAL, "controller_name/controller_name")
            ->addArgument(&#39;mode&#39;, Argument::OPTIONAL, "d")
            ->setDescription(&#39;spider control&#39;);
 
        /**
         * 以上设置命令格式为:php think spider [status] [controller_name/controller_name] [d]
         * think        为thinkphp框架入口文件
         * spider       为在框架中注册的命令,上面setName设置的
         * staus        为workerman框架接受的命令
         * controller_name/controller_name      为控制器名称,以正斜线分割,执行制定控制器,为空或缺省则启动所有控制器,控制器列表在controller_name属性中注册
         * d            最后一个参数为wokerman支持的-d-g参数,但是不用加-,直接使用d或者g
         * php think spider start collect/SendMsg
         */
    }
 
 
    /**
     * execute
     * tp框架自定义指令特性
     * 执行命令后的逻辑
     * @param mixed $input
     * @param mixed $output
     * @return mixed
     */
    protected function execute(Input $input, Output $output)
    {
 
        //获得status参数,即think自定义指令中的第一个参数,缺省报错
        $status  = $input->getArgument(&#39;status&#39;);
        if(!$status){
            $output->writeln(&#39;pelase input control command , like start&#39;);
            exit;
        }
 
 
        //获得控制器名称
        $controller_str =  $input->getArgument(&#39;controller_name&#39;);
 
        //获得模式,d为wokerman的后台模式(生产环境)
        $mode = $input->getArgument(&#39;mode&#39;);
 
        //分析控制器参数,如果缺省或为all,那么运行所有注册的控制器
        $controller_list = $this->controller_names;
 
        if($controller_str != &#39;&#39; && $controller_str != &#39;all&#39; )
        {
            $controller_list = explode(&#39;/&#39;,$controller_str);
        }
 
        //重写mode参数,改为wokerman接受的参数
        if($mode == &#39;d&#39;){
            $mode = &#39;-d&#39;;
        }
 
        if($mode == &#39;g&#39;){
            $mode = &#39;-g&#39;;
        }
 
        //将wokerman需要的参数传入到其parseCommand方法中,此方法在start类中重写
        Start::$argvs = [
            &#39;think&#39;,
            $status,
            $mode
        ];
 
        $output->writeln(&#39;start running spider&#39;);
 
        $programs_ob_list = [];
 
 
        //实例化需要运行的控制器
        foreach ($controller_list as $c_key => $controller_name) {
            $class_name = &#39;app\\&#39;.$this->model_name.&#39;\controller\\&#39;.$controller_name;
            $programs_ob_list[] = new $class_name();
        }
 
 
 
        //将控制器的相关回调参数传到workerman中
        foreach ([&#39;onWorkerStart&#39;, &#39;onConnect&#39;, &#39;onMessage&#39;, &#39;onClose&#39;, &#39;onError&#39;, &#39;onBufferFull&#39;, &#39;onBufferDrain&#39;, &#39;onWorkerStop&#39;, &#39;onWorkerReload&#39;] as $event) {
            foreach ($programs_ob_list as $p_key => $program_ob) {
                if (method_exists($program_ob, $event)) {
                    $programs_ob_list[$p_key]->$event = [$program_ob,$event];
                }
            }
        }
 
        Start::runAll();
    }
}
ログイン後にコピー

例如我们创建一个定时器的命令app\server\controller创建WebhookTimer.php

<?php
namespace app\server\controller;
use Workerman\Worker; 
use \Workerman\Lib\Timer;
use think\facade\Cache;
use think\facade\Db;
use think\Request;
 
class WebhookTimer extends Start
{
    public $host     = &#39;0.0.0.0&#39;;
    public $port     = &#39;9527&#39;;
    public $name     = &#39;webhook&#39;;
    public $count    = 1;
    public function onWorkerStart($worker)
    {
      
        
            Timer::add(2, array($this, &#39;webhooks&#39;), array(), true);
        
     
    }
    public function onConnect()
    {
 
    }
 
    public function onMessage($ws_connection, $message)
    {
       
    }
 
    public function onClose()
    {
 
    }
    
    public function webhooks()
    {
 
       echo 11;
    }
    
    
}
ログイン後にコピー

执行start命令行

php think spider start
ログイン後にコピー

执行stop命令

php think spider stop
ログイン後にコピー

执行全部进程命令

php think spider start all d
ログイン後にコピー

app\command\Spider.php文件

public $controller_names = ['WebhookTimer','其他方法','其他方法'];

其他方法 就是app\server\controller下创建的其他类文件方法

完结

Start.php文件

<?php
namespace app\server\controller;
 
use Workerman\Worker;
 
class Start extends Worker
{
    public static $argvs = [];
    public static $workerHost;
    public $socket   = &#39;&#39;;
    public $protocol = &#39;http&#39;;
    public $host     = &#39;0.0.0.0&#39;;
    public $port     = &#39;2346&#39;;
    public $context  = [];
 
    public function __construct()
    {
        self::$workerHost = parent::__construct($this->socket ?: $this->protocol . &#39;://&#39; . $this->host . &#39;:&#39; . $this->port, $this->context);
    }
 
    /**
     * parseCommand
     * 重写wokerman的解析命令方法
     * @return mixed
     */
    public static function parseCommand()
    {
        if (static::$_OS !== OS_TYPE_LINUX) {
            return;
        }
        // static::$argvs;
        // Check static::$argvs;
        $start_file = static::$argvs[0];
        $available_commands = array(
            &#39;start&#39;,
            &#39;stop&#39;,
            &#39;restart&#39;,
            &#39;reload&#39;,
            &#39;status&#39;,
            &#39;connections&#39;,
        );
        $usage = "Usage: php yourfile <command> [mode]\nCommands: \nstart\t\tStart worker in DEBUG mode.\n\t\tUse mode -d to start in DAEMON mode.\nstop\t\tStop worker.\n\t\tUse mode -g to stop gracefully.\nrestart\t\tRestart workers.\n\t\tUse mode -d to start in DAEMON mode.\n\t\tUse mode -g to stop gracefully.\nreload\t\tReload codes.\n\t\tUse mode -g to reload gracefully.\nstatus\t\tGet worker status.\n\t\tUse mode -d to show live status.\nconnections\tGet worker connections.\n";
        if (!isset(static::$argvs[1]) || !in_array(static::$argvs[1], $available_commands)) {
            if (isset(static::$argvs[1])) {
                static::safeEcho(&#39;Unknown command: &#39; . static::$argvs[1] . "\n");
            }
            exit($usage);
        }
 
        // Get command.
        $command  = trim(static::$argvs[1]);
        $command2 = isset(static::$argvs[2]) ? static::$argvs[2] : &#39;&#39;;
 
        // Start command.
        $mode = &#39;&#39;;
        if ($command === &#39;start&#39;) {
            if ($command2 === &#39;-d&#39; || static::$daemonize) {
                $mode = &#39;in DAEMON mode&#39;;
            } else {
                $mode = &#39;in DEBUG mode&#39;;
            }
        }
        static::log("Workerman[$start_file] $command $mode");
 
        // Get master process PID.
        $master_pid      = is_file(static::$pidFile) ? file_get_contents(static::$pidFile) : 0;
        $master_is_alive = $master_pid && posix_kill($master_pid, 0) && posix_getpid() != $master_pid;
        // Master is still alive?
        if ($master_is_alive) {
            if ($command === &#39;start&#39;) {
                static::log("Workerman[$start_file] already running");
                exit;
            }
        } elseif ($command !== &#39;start&#39; && $command !== &#39;restart&#39;) {
            static::log("Workerman[$start_file] not run");
            exit;
        }
 
        // execute command.
        switch ($command) {
            case &#39;start&#39;:
                if ($command2 === &#39;-d&#39;) {
                    static::$daemonize = true;
                }
                break;
            case &#39;status&#39;:
                while (1) {
                    if (is_file(static::$_statisticsFile)) {
                        @unlink(static::$_statisticsFile);
                    }
                    // Master process will send SIGUSR2 signal to all child processes.
                    posix_kill($master_pid, SIGUSR2);
                    // Sleep 1 second.
                    sleep(1);
                    // Clear terminal.
                    if ($command2 === &#39;-d&#39;) {
                        static::safeEcho("\33[H\33[2J\33(B\33[m", true);
                    }
                    // Echo status data.
                    static::safeEcho(static::formatStatusData());
                    if ($command2 !== &#39;-d&#39;) {
                        exit(0);
                    }
                    static::safeEcho("\nPress Ctrl+C to quit.\n\n");
                }
                exit(0);
            case &#39;connections&#39;:
                if (is_file(static::$_statisticsFile) && is_writable(static::$_statisticsFile)) {
                    unlink(static::$_statisticsFile);
                }
                // Master process will send SIGIO signal to all child processes.
                posix_kill($master_pid, SIGIO);
                // Waiting amoment.
                usleep(500000);
                // Display statisitcs data from a disk file.
                if(is_readable(static::$_statisticsFile)) {
                    readfile(static::$_statisticsFile);
                }
                exit(0);
            case &#39;restart&#39;:
            case &#39;stop&#39;:
                if ($command2 === &#39;-g&#39;) {
                    static::$_gracefulStop = true;
                    $sig = SIGTERM;
                    static::log("Workerman[$start_file] is gracefully stopping ...");
                } else {
                    static::$_gracefulStop = false;
                    $sig = SIGINT;
                    static::log("Workerman[$start_file] is stopping ...");
                }
                // Send stop signal to master process.
                $master_pid && posix_kill($master_pid, $sig);
                // Timeout.
                $timeout    = 5;
                $start_time = time();
                // Check master process is still alive?
                while (1) {
                    $master_is_alive = $master_pid && posix_kill($master_pid, 0);
                    if ($master_is_alive) {
                        // Timeout?
                        if (!static::$_gracefulStop && time() - $start_time >= $timeout) {
                            static::log("Workerman[$start_file] stop fail");
                            exit;
                        }
                        // Waiting amoment.
                        usleep(10000);
                        continue;
                    }
                    // Stop success.
                    static::log("Workerman[$start_file] stop success");
                    if ($command === &#39;stop&#39;) {
                        exit(0);
                    }
                    if ($command2 === &#39;-d&#39;) {
                        static::$daemonize = true;
                    }
                    break;
                }
                break;
            case &#39;reload&#39;:
                if($command2 === &#39;-g&#39;){
                    $sig = SIGQUIT;
                }else{
                    $sig = SIGUSR1;
                }
                posix_kill($master_pid, $sig);
                exit;
            default :
                if (isset($command)) {
                    static::safeEcho(&#39;Unknown command: &#39; . $command . "\n");
                }
                exit($usage);
        }
    }
 
}
ログイン後にコピー

更多编程相关知识,请访问:编程教学!!

以上がthinkphp6 での workman の使用方法の簡単な分析 [チュートリアルの共有]の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

thinkphpプロジェクトの実行方法 thinkphpプロジェクトの実行方法 Apr 09, 2024 pm 05:33 PM

ThinkPHP プロジェクトを実行するには、Composer をインストールし、Composer を使用してプロジェクトを作成し、プロジェクト ディレクトリに入り、php bin/consoleserve を実行し、http://localhost:8000 にアクセスしてようこそページを表示する必要があります。

Workerman ドキュメントにファイルのアップロードとダウンロードを実装する Workerman ドキュメントにファイルのアップロードとダウンロードを実装する Nov 08, 2023 pm 06:02 PM

Workerman ドキュメントでファイルのアップロードとダウンロードを実装するには、特定のコード サンプルが必要です はじめに: Workerman は、シンプル、効率的、使いやすい高性能 PHP 非同期ネットワーク通信フレームワークです。実際の開発では、ファイルのアップロードとダウンロードが一般的な機能要件となりますが、この記事では、Workerman フレームワークを使用してファイルのアップロードとダウンロードを実装する方法と、具体的なコード例を紹介します。 1. ファイル アップロード: ファイル アップロードとは、ローカル コンピューター上のファイルをサーバーに転送する操作を指します。以下が使用されます

thinkphp にはいくつかのバージョンがあります thinkphp にはいくつかのバージョンがあります Apr 09, 2024 pm 06:09 PM

ThinkPHP には、さまざまな PHP バージョン向けに設計された複数のバージョンがあります。メジャー バージョンには 3.2、5.0、5.1、および 6.0 が含まれますが、マイナー バージョンはバグを修正し、新機能を提供するために使用されます。最新の安定バージョンは ThinkPHP 6.0.16 です。バージョンを選択するときは、PHP バージョン、機能要件、コミュニティ サポートを考慮してください。最高のパフォーマンスとサポートを得るには、最新の安定バージョンを使用することをお勧めします。

thinkphpの実行方法 thinkphpの実行方法 Apr 09, 2024 pm 05:39 PM

ThinkPHP フレームワークをローカルで実行する手順: ThinkPHP フレームワークをローカル ディレクトリにダウンロードして解凍します。 ThinkPHP ルート ディレクトリを指す仮想ホスト (オプション) を作成します。データベース接続パラメータを構成します。 Webサーバーを起動します。 ThinkPHP アプリケーションを初期化します。 ThinkPHP アプリケーションの URL にアクセスして実行します。

開発に関する提案: ThinkPHP フレームワークを使用して非同期タスクを実装する方法 開発に関する提案: ThinkPHP フレームワークを使用して非同期タスクを実装する方法 Nov 22, 2023 pm 12:01 PM

「開発に関する提案: ThinkPHP フレームワークを使用して非同期タスクを実装する方法」 インターネット技術の急速な発展に伴い、Web アプリケーションには、多数の同時リクエストと複雑なビジネス ロジックを処理するための要件が​​ますます高まっています。システムのパフォーマンスとユーザー エクスペリエンスを向上させるために、開発者は多くの場合、電子メールの送信、ファイルのアップロードの処理、レポートの生成など、時間のかかる操作を実行するために非同期タスクの使用を検討します。 PHP の分野では、人気のある開発フレームワークとして ThinkPHP フレームワークが、非同期タスクを実装するための便利な方法をいくつか提供しています。

laravelとthinkphpではどちらが優れていますか? laravelとthinkphpではどちらが優れていますか? Apr 09, 2024 pm 03:18 PM

Laravel フレームワークと ThinkPHP フレームワークのパフォーマンスの比較: ThinkPHP は、最適化とキャッシュに重点を置いて、一般に Laravel よりもパフォーマンスが優れています。 Laravel は優れたパフォーマンスを発揮しますが、複雑なアプリケーションの場合は、ThinkPHP の方が適している可能性があります。

Workerman ドキュメントの基本的な使用方法を実装する方法 Workerman ドキュメントの基本的な使用方法を実装する方法 Nov 08, 2023 am 11:46 AM

Workerman ドキュメントの基本的な使用方法の実装方法の紹介: Workerman は、開発者が同時実行性の高いネットワーク アプリケーションを簡単に構築できるようにする高性能 PHP 開発フレームワークです。この記事では、インストールと構成、サービスとリスニング ポートの作成、クライアント リクエストの処理など、Workerman の基本的な使用方法を紹介します。そして、対応するコード例を示します。 1. Workerman のインストールと構成 コマンド ラインに次のコマンドを入力して、Workerman をインストールします。

スウールとワーカーマンはどちらが良いですか? スウールとワーカーマンはどちらが良いですか? Apr 09, 2024 pm 07:00 PM

Swoole と Workerman はどちらも高性能の PHP サーバー フレームワークです。 Swoole は、非同期処理、優れたパフォーマンス、スケーラビリティで知られており、多数の同時リクエストと高スループットを処理する必要があるプロジェクトに適しています。 Workerman は、使いやすさや同時実行量が少ないプロジェクトに適した直感的な API を備え、非同期モードと同期モードの両方の柔軟性を提供します。

See all articles