Рубрики
Uncategorized

Swool интегрирован в небольшую структуру

Автор оригинала: David Wong.

Резюме

Это шестая статья об обучении swool: swool интегрирован в небольшую структуру.

  • Часть 5. применение мультипротокола swool и многопортового
  • Часть 4: применение swool http
  • Часть 3: применение swool websocket
  • Часть 2: применение задачи свула
  • Часть 1: применение таймера свула

После написания 5 статей о внедрении swool многие подписчики были добавлены и поощрены некоторыми шишками. Многие подписчики также добавили друзей в wechat. После общения выясняется, что некоторые друзья лучше меня и работают усерднее меня, а также получают некоторые предложения от некоторых шишек.

На самом деле нелегко обнаружить, что нелегко продолжать писать статьи, беспокоиться о том, что другие считают это бесполезным, беспокоиться о том, что идеи слишком наивны или имеют лазейки, над которыми другие будут смеяться, беспокоиться о том, что чернил в вашем уме слишком мало, чтобы писать… Знать, что ваше мышление недостаточно ясное, логика недостаточно строгая, сказать себе, что это не имеет отношения к делу, некоторым станет лучше, невзгоды могут вырасти, и писать-хорошее начало, чтобы побудить себя продолжать учиться и думать.

Это не к делу. Вернемся к сути.

Эта статья на самом деле является небольшой просьбой читателей. Все вот так:

Читатель: “Брат Лян, очень приятно прочитать вашу статью. Вы можете запустить демо-версию напрямую, поместив ее локально. Большое спасибо.”

Я: “ха-ха… Спасибо за вашу поддержку. “

Читатель: “У меня есть небольшое требование. Теперь каждый файл независим. Я хочу развернуть его в производственной среде, чтобы сделать работу более удобной и иметь журналы…”

Я: “Вы не говорите о структуре? Теперь их много из коробки. Смотрите swift, easy cookie, mix php и так далее, рекомендованные официальным сайтом Вулфа. Пожалуйста, обратитесь по этому адресу для получения подробной информации: https://wiki.swoole.com/wiki/… “

Читатель: “Я обнаружил, что существует слишком много документов, которые трудно понять. Не могли бы вы помочь мне объяснить их?”

Я: “Что? Я тоже новичок. Давайте сделаем простое колесо. “

……

Итак, у меня есть эта статья, которая также является обзором предыдущих 5 статей.

Эффект

Команда выглядит следующим образом:

  • PHP index.php это видно на рисунке выше
  • PHP index.php запуск службы запуска (режим отладки)
  • PHP index.php запуск – d запуск службы (режим демона)
  • PHP index.php статус просмотр статуса службы
  • PHP index.php горячая загрузка службы перезагрузки
  • PHP index.php остановить завершение работы службы

Index.php это имя файла. Вы можете называть это как угодно.

Структура каталогов выглядит следующим образом:

├─ controller
│     ├── ...
├─ client
│  ├─ websocket
│     ├── ...
│  ├─ tcp
│     ├── ...
├─ server
│  ├─ config
│     ├── config.php
│  ├─ core
│     ├── Common.php
│     ├── Core.php
│     ├── HandlerException.php
│ ├ - log -- need read / write permission
│     ├── ...
├─ index.php

В настоящее время для этих документов новые точки знаний в последующих исследованиях будут непосредственно интегрированы здесь.

Поговорим о том, чего удалось достичь:

1. Запустил websocket, HTTP, TCP, UDP и другие сервисы.

2. Websocket в папке клиент/websocket реализует всплывающее окно видео.

3. Для примера HTTP посетите http://IP: порт непосредственно в браузере, а логический код находится в папке контроллера.

4. Пример TCP, в папке клиент/TCP.

5. Пример UDP, работающий напрямую ip-порт netcat -u Да.

6. Соответствующая конфигурация находится в папке server/config.

Код

Если нет, поместите основной файл (core. PHP).

3) {
            echo PHP_EOL;
            echo "----------------------------------------".PHP_EOL;
            echo "|               Swoole                 |".PHP_EOL;
            echo "|--------------------------------------|".PHP_EOL;
            echo '|    USAGE: php index.php commond      |'.PHP_EOL;
            echo '|--------------------------------------|'.PHP_EOL;
            Echo '| 1. Start to start the service in debug mode;
            Echo '| 2. Start - d starts the service in the mode of "day". Php| EOL;
            Echo '| 3. Status view service status' |. PHP | EOL;
            Echo '| 4. Reload hot load' |. Php| EOL;
            Echo '| 5. Stop to close the service |. Php| EOL;
            echo "----------------------------------------".PHP_EOL;
            echo PHP_EOL;
            exit;
        }
    }

    protected static function parseCommand() {
        global $argv;
        $command = $argv[1];
        $option  = isset( $argv[2] ) ? $argv[2] : '' ;
        switch ($command) {
            case 'start':
                If ($option = = = '- D') {// starts as a daemon
                    get_config(['[email protected]' => true]);
                }
                self::workerStart();
                break;
            case 'status':
                self::workerStatus();
                break;
            case 'reload':
                self::workerReload();
                break;
            case 'stop':
                self::workerStop();
                break;
            default:
                echo "Bad Command.".PHP_EOL;
        }
    }

    protected static function workerStart() {
        $config = get_config();

        self::$serv = new swoole_websocket_server($config['ip'], $config['websocket_port']);
        self::$serv->set($config['set']);
        self::$serv->on('Start', function ($serv) use ($config) {
            $start = new OnStart();
            $start::run($serv, $config);
        });

        self::$serv->on('ManagerStart', function ($serv) use ($config) {
            $manager_start = new OnManagerStart();
            $manager_start::run($serv, $config);
        });

        self::$serv->on('WorkerStart', function ($serv, $worker_id) use ($config) {
            $worker_start = new OnWorkerStart();
            $worker_start::run($serv, $worker_id, $config);
        });

        //TCP
        $tcp = self::$serv->listen($config['ip'], $config['tcp_port'], SWOOLE_SOCK_TCP);
        $tcp->set($config['tcp_set']);
        $tcp->on('Receive', function ($serv, $fd, $reactor_id, $data) {
            $receive = new OnReceive();
            $receive::run($serv, $fd, $reactor_id, $data);
        });

        //UDP
        $udp = self::$serv->listen($config['ip'], $config['udp_port'], SWOOLE_SOCK_UDP);
        $udp->set($config['udp_set']);
        $udp->on('Packet', function ($serv, $data, $client_info) {
            $packet = new OnPacket();
            $packet::run($serv, $data, $client_info);
        });

        self::$serv->on('Task', function ($serv, $task_id, $src_worker_id, $data) use ($config) {
            $task = new OnTask();
            $dataArr = json_decode($data, true);
            switch ($dataArr['server']) {
                case "tcp":
                    $task::tcp_task_run($serv, $task_id, $src_worker_id, $data);
                    break;
                case "ws":
                    $task::ws_task_run($serv, $task_id, $src_worker_id, $data);
                    break;
            }
        });

        self::$serv->on('Open', function ($serv, $request) {
            echo output("onOpen: handshake success with fd={$request->fd}");
        });

        self::$serv->on('Message', function ($serv, $frame) {
            $message = new OnMessage();
            $message::run($serv, $frame);
        });

        self::$serv->on('Request', function ($request, $response) {
            $req = new OnRequest();
            $req::run($request, $response);
        });

        self::$serv->on('Finish', function ($serv, $task_id, $data) {
            $finish = new OnFinish();
            $finish::run($serv, $task_id, $data);
        });

        self::$serv->on('Close', function ($serv, $fd, $reactor_id){
            try {
                Echo output ('Client shutdown ');
            } catch(Exception $e) {
            }
        });

        self::$serv->on('Shutdown', function ($serv) {
           Echo output ("service shutdown");
        });

        self::showProcessUI();

        self::$serv->start();
    }

    protected static function workerStatus() {
        $config = get_config();

        if (!file_exists($config['master_pid_file']) ||
            !file_exists($config['manager_pid_file']) ||
            !file_exists($config['worker_pid_file']) ) {
            Echo output ("no service started yet");
            return false;
        }

        self::showProcessUI($config);

        $masterPidString = trim(@file_get_contents($config['master_pid_file']));
        $masterPidArr    = explode( '-', $masterPidString);

        echo str_pad("Master", 18, ' ', STR_PAD_BOTH ).
            str_pad($config['master_process_name'], 26, ' ', STR_PAD_BOTH ).
            str_pad($masterPidArr[0], 16, ' ', STR_PAD_BOTH ).
            str_pad($masterPidArr[1], 16, ' ', STR_PAD_BOTH ).
            str_pad($masterPidArr[2], 16, ' ', STR_PAD_BOTH ).PHP_EOL;

        $managerPidString = trim(@file_get_contents($config['manager_pid_file']));
        $managerPidArr    = explode( '-', $managerPidString);

        echo str_pad("Manager", 20, ' ', STR_PAD_BOTH ).
            str_pad($config['manager_process_name'], 24, ' ', STR_PAD_BOTH ).
            str_pad($managerPidArr[0], 16, ' ', STR_PAD_BOTH ).
            str_pad($managerPidArr[1], 16, ' ', STR_PAD_BOTH ).
            str_pad($managerPidArr[2], 16, ' ', STR_PAD_BOTH ).PHP_EOL;


        $workerPidString = rtrim(@file_get_contents($config['worker_pid_file']), '|' );
        $workerPidArr    = explode( '|', $workerPidString );
        if (isset($workerPidArr) && !empty($workerPidArr)) {
            foreach ($workerPidArr as $key => $val) {
                $v = explode( '-', $val);
                echo str_pad("Worker", 18, ' ', STR_PAD_BOTH ).
                     str_pad($config['worker_process_name'], 26, ' ', STR_PAD_BOTH ).
                     str_pad($v[0], 16, ' ', STR_PAD_BOTH ).
                     str_pad($v[1], 16, ' ', STR_PAD_BOTH ).
                     str_pad($v[2], 16, ' ', STR_PAD_BOTH ).PHP_EOL;
            }
        }

        $taskPidString = rtrim(@file_get_contents($config['task_pid_file']), '|' );
        $taskPidArr  = explode( '|', $taskPidString );
        if (isset($taskPidArr) && !empty($taskPidArr)) {
            foreach ($taskPidArr as $key => $val) {
                $v = explode( '-', $val);
                echo str_pad("Task", 18, ' ', STR_PAD_BOTH ).
                     str_pad($config['task_process_name'], 24, ' ', STR_PAD_BOTH ).
                     str_pad($v[0], 20, ' ', STR_PAD_BOTH ).
                     str_pad($v[1], 12, ' ', STR_PAD_BOTH ).
                     str_pad($v[2], 20, ' ', STR_PAD_BOTH ).PHP_EOL;
            }
        }
    }

    protected static function workerReload() {
        $config = get_config();

        if (!file_exists($config['master_pid_file'])) {
            Echo output ("no service started yet");
            return false;
        }

        $masterPidString = trim(file_get_contents($config['master_pid_file']));
        $masterPidArr    = explode( '-', $masterPidString);

        if (!swoole_process::kill($masterPidArr[0], 0)) {
            Echo output ("PID: {$masterpidarr [0]} does not exist");
            return false;
        }

        swoole_process::kill($masterPidArr[0], SIGUSR1);

        @unlink($config['worker_pid_file']);
        @unlink($config['task_pid_file']);

        Echo output ("hot load successful");
        return true;
    }

    protected static function workerStop() {
        $config = get_config();

        if (!file_exists($config['master_pid_file'])) {
            Echo output ("no service started yet");
            return false;
        }

        $masterPidString = trim(file_get_contents($config['master_pid_file']));
        $masterPidArr    = explode( '-', $masterPidString);

        if (!swoole_process::kill($masterPidArr[0], 0)) {
            Echo output ("PID: {$masterpidarr [0]} does not exist");
            return false;
        }

        swoole_process::kill($masterPidArr[0]);

        $time = time();
        while (true) {
            usleep(2000);
            if (!swoole_process::kill($masterPidArr[0], 0)) {
                unlink($config['master_pid_file']);
                unlink($config['manager_pid_file']);
                unlink($config['worker_pid_file']);
                unlink($config['task_pid_file']);
                Echo output ("service shutdown succeeded");
                break;
            } else {
                if (time() - $time > 5) {
                    Echo output ("service shutdown failed, please try again");
                    break;
                }
            }
        }
        return true;
    }

    protected static function showProcessUI() {
        $config = get_config();
        if ($config['set']['daemonize'] == true) {
            return false;
        }
        echo str_pad("-", 90, '-', STR_PAD_BOTH) . PHP_EOL;
        Echo "|. Str_pad (" start / close ", 92, '', str_pad_both)." |. Php_eol;
        echo str_pad("-", 90, '-', STR_PAD_BOTH) . PHP_EOL;

        echo str_pad("Start success.", 50, ' ', STR_PAD_BOTH) .
            str_pad("php index.php stop", 50, ' ', STR_PAD_BOTH) . PHP_EOL;

        echo str_pad("-", 90, '-', STR_PAD_BOTH) . PHP_EOL;
        Echo "|. Str_pad (" version information ", 92, '', str_pad_both)." |. Php_eol;
        echo str_pad("-", 90, '-', STR_PAD_BOTH) . PHP_EOL;

        echo str_pad("Swoole Version:" . SWOOLE_VERSION, 50, ' ', STR_PAD_BOTH) .
            str_pad("PHP Version:" . PHP_VERSION, 50, ' ', STR_PAD_BOTH) . PHP_EOL;

        echo str_pad("-", 90, '-', STR_PAD_BOTH) . PHP_EOL;
        Echo "|. Str_pad (" IP information ", 90, '', str_pad_both)." |. Php_eol;
        echo str_pad("-", 90, '-', STR_PAD_BOTH) . PHP_EOL;

        echo str_pad("IP:" . $config['ip'], 50, ' ', STR_PAD_BOTH) .
            str_pad("PORT:" . $config['websocket_port'], 50, ' ', STR_PAD_BOTH) . PHP_EOL;

        echo str_pad("-", 90, '-', STR_PAD_BOTH) . PHP_EOL;
        Echo "|. Str_pad (" process information ", 92, '', str_pad_both)." |. Php_eol;
        echo str_pad("-", 90, '-', STR_PAD_BOTH) . PHP_EOL;

        Echo STR pad (swoole process, 20, ', STR pad both)
            STR pad ('process alias', '30', 'STR pad' both)
            STR pad ('process ID ',' 18 ',' STR pad 'both)
            STR pad ('parent process ID ',' 18 ',' STR pad 'both)
            STR pad ('user ',' 18 ',' STR pad 'both). PHP EOL;
    }

    protected static function signalHandler() {
        //Todo incomplete
        //swoole_process::signal(SIGINT, function ($signal) {
        //    echo $signal;
        //    return;
        //});
    }
}

Резюме

На то, чтобы закончить первое издание, ушло три ночи. Он относительно младший. Я надеюсь, что это может дать ссылку на студентов, которые только начинают.

Конечно, я буду продолжать совершенствовать его сам, и некоторые новые знания на более позднем этапе будут интегрированы в него, чтобы сделать мой собственный итеративный небольшой проект.

Первая версия является приблизительной. Не распыляйте, если вам это не нравится.

Это будет добавлено позже:

  • RPC
  • Сопрограмма – MySQL
  • Сопрограмма – Редис
  • Процесс

Нужен исходный код, добавьте мой wechat. (меню – > добавить мой wechat – > сканировать меня)

Рекомендуемое чтение

  • Системное объяснение Единый вход единого входа
  • Системное объяснение – Защита веб-безопасности PHP
  • Системное объяснение – Технология кэширования PHP
  • Системное объяснение – Проверка подписи интерфейса PHP
  • Системное объяснение – высокоточная работа PHP с плавающей запятой

Эту статью добро пожаловать переслать, переслать пожалуйста, укажите автора и источник, спасибо!