1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/xavier007-xavier-swoole

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Расширение ThinkPHP 5.0 Swoole

Обратите внимание, что данный текст содержит фрагменты кода на языке PHP.

Ссылаясь на официальные think-swoole2.0 и easyswoole, разработайте расширение swoole для TP 5.0.

Добавьте асинхронную задачу: QQ499873958.

<?php

namespace app\index\controller;

use xavier\swoole\Task;

class Index {
    public function index() {
        return "index";
    }

    public function test() {
        echo 1;
        $param = request()->param();
        $post = request()->post();

        // Асинхронная задача
        Task::async(function ($serv, $task_id, $data) {
            $i = 0;
            while ($i < 10) {
                $i++;
                echo $i;
                sleep(1);
            }
        });

        // Использование swoole 4.0 для сопрограммы
        \go(function () {
            $i = 0;
            while ($i < 10) {
                echo 2;
                $i++;
                \co::sleep(1);
            };
        });
        return json($post);
    }
}

Конфигурационный файл

Файл конфигурации сторонних пакетов должен находиться в папке application/extra и называться swoole.php.

<?php
return [
    'host' => '0.0.0.0', // Адрес прослушивания
    'port' => 9501, // Порт прослушивания
    'mode' => '', // Режим выполнения по умолчанию SWOOLE_PROCESS
    'sock_type' => '', // Тип сокета по умолчанию SWOOLE_SOCK_TCP
    'app_path' => getcwd() . '/application', // Путь приложения (если включено 'daemonize'=>true, необходимо установить (используя абсолютный путь))
    'file_monitor' => false, // Включить ли мониторинг изменений PHP-файлов (автоматически включается в режиме отладки)
    'file_monitor_interval' => 2, // Интервал обнаружения изменений файлов (в секундах)
    'file_monitor_path' => [], // Каталог мониторинга файлов (по умолчанию отслеживаются каталоги application и config)
    // Поддерживает все параметры конфигурации swoole
    'pid_file' => getcwd()  . '/runtime/swoole.pid',
    'log_file' => getcwd()  . '/runtime/swoole.log',
    'task_worker_num' => 20,
    //'document_root' => getcwd() . 'public',
    //'enable_static_handler' => true,
    'daemonize' => 1,//охрана
    'worker_num' => 8,    //количество рабочих процессов
    'max_request' => 10000,
];

Обратите внимание: \think\Request добавляет следующий статический метод. Поскольку TP работает под Apache или NGINX, каждый запрос завершается уничтожением, поэтому здесь не будет проблем с синглтоном, но в Swoole из-за постоянного присутствия в памяти, как только запрос будет создан, он не изменится, поэтому он будет удалён, и каждый раз после запроса будет создаваться заново.

В настоящее время TP официально поддерживает следующие методы, которые не нужно изменять, но они ещё не объединены в ветку 5.0, если вам это нужно, вы можете загрузить официальный мастер-ветку.

public static function destroy()
{
    if (!is_null(self::$instance)) {
        self::$instance=null;
    }
}

Измените следующий код, так как при запуске в командном режиме любой запрос считается GET.

/**
 * Текущий тип запроса
 * @access public
 * @param bool $method true Получить исходный тип запроса
 * @return string
 */
public function method($method = false)
{
    if (true === $method) {
        // Получить оригинальный тип запроса
        $this->method = IS_CLI ?(defined('IS_SWOOLE')?((isset($this->server['REQUEST_METHOD'])? $this->server['REQUEST_METHOD'] : isset($_SERVER['REQUEST_METHOD'])?$_SERVER['REQUEST_METHOD']:'GET')):'GET') : (isset($this->server['REQUEST_METHOD']) ? $this->server['REQUEST_METHOD'] : $_SERVER['REQUEST_METHOD']);
    } elseif (!$this->method) {
        if (isset($_POST[Config::get('var_method')])) {
            $this->method = strtoupper($_POST[Config::get('var_method')]);
            $this->{$this->method}($_POST);
        } elseif (isset($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'])) {
            $this->method = strtoupper($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']);
        } else {
            $this->method = IS_CLI ?(defined('IS_SWOOLE')?((isset($this->server['REQUEST_METHOD'])? $this->server['REQUEST_METHOD'] : isset($_SERVER['REQUEST_METHOD'])?$_SERVER['REQUEST_METHOD']:'GET')):'GET') : (isset($this->server['REQUEST_METHOD']) ? $this->server['REQUEST_METHOD'] : $_SERVER['REQUEST_METHOD']);
        }
    }

    return $this->method;
}

Запустите команду:

php think swoole start

Запуск в фоновом режиме:

php think swoole start -d

Остановите службу:

php think swoole stop

Демо

<?php

namespace app\index\controller;

use xavier\swoole\Task;
use xavier\swoole\Timer;

use xavier\swoole\Component\HttpClient;

class Index
{
    public function __construct()
    {

    }

    public function index()
    {
        return "indexss";
    }

    public function test()
    {
        $param = request()->param();
        $post  =
``` Данный текст написан на языке PHP.

**Перевод текста:**

Запрос()->post();

    Task::async(function ($serv, $task_id, $data) use($post) {
        $i = 0;
        while ($i < 10) {
            $i++;
            echo $i;
            //var_dump($post);
            sleep(1);
        }
    });

    //Task::async("\\app\\lib\\Task");
    $task=new \app\lib\Task($post,1);
    Task::async($task);
    \go(function () use($post) {
        $i = 0;
        while ($i < 10) {
            $i++;
            //var_dump($post);
            \co::sleep(1);
        };
    });
    return json($post);
}

public function send()
{
    $data  = [1, 2, 3,];
    $datas = ['a', 'b1232'];
    $redt  = HttpClient::instance("http://127.0.0.1:9501")->url('index/index')->gets([
        'data'  => $data,
        'datas' => $datas,
    ]);
    var_dump($redt);
}

public function sendhtml()
{
    $data  = [1, 2, 3,];
    $datas = ['a', 'b1232'];
    $redt  = HttpClient::instance("http://127.0.0.1:9501")->url('index/index')->setContentType('html')->test([
        'data'  => $data,
        'datas' => $datas,
    ]);
    var_dump($redt);
}

public function gets($data=null,$datas=null)
{
    return json(array_merge($data,$datas));

}

### Таймер

Вот реализация интерфейса таймера:

```php
<?php
/**
 * Created by PhpStorm.
 * User: xavier
 * Date: 2018/8/15
 * Time: 下午5:45
 */

namespace app\lib;

use xavier\swoole\template\Timer as TimerC;
class Timer extends TimerC
{
    public function _initialize(...$arg)
    {
        // TODO: Implement _initialize() method.
    }

    public function run()
    {
        // TODO: Implement run() method.
        var_dump('timer');
    }
}

Нужно только настроить время для задачи таймера в конфигурации таймера:

<?php
/**
 * Created by PhpStorm.
 * User: xavier
 * Date: 2018/8/15
 * Time: 下午2:14
 * 秒 分 时 日 月 星期几
 * crontab 格式 * *  *  *  * *    => "类"
 * *中间一个空格
 * 系统定时任务需要在swoole.php中开启
 * 自定义定时器不受其影响
 */

return [
    '*/5 * * * * *'=>'\\app\\lib\\Timer',//每5秒执行一次,从第一位一次表示 秒,分,时,日,月
];

Одновременно задача таймера поддерживает выполнение в процессе задачи:

<?php
use xavier\swoole\Timer;

//支持回调
Timer::tick(1000,function(){
    
});

//поддерживает выполнение интерфейса таймера
Timer::tick(1000,'\\app\\lib\\Timer');

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

Системный таймер, в первом рабочем процессе создаёт таймер, согласно тому, нужно ли выполнять задачу по истечении срока, асинхронно отправляет задачу, а не блокирует текущий процесс. Однако необходимо настроить task_work_num.

----------------------2018-08-24-------------------------

И think-swoole официальное унифицированное пространство имён

xavier-swoole будет синхронизироваться с официальным think-swoole для обновления.

Файлы интерфейса хранятся в пространстве имён xavier\swoole\template.

Запуск пользовательской службы

Этот метод аналогичен swoole onWorkerStart.

Использование метода:

<?php
namespace app\lib;
/**
 * Создано PhpStorm.
 * Пользователь: ксавье
 * Дата: 2018/08/24
 * Время: 9:26 утра
 * Электронная почта: 499873958@qq.com
 */
использовать xavier\swoole\template\WorkerStart как Worker;
класс WorkerStart расширяет Worker
{
    публичная функция _initialize($server, $worker_id)
    {
        // TODO: Реализовать метод _initialize().
    }

    публичный метод запуска()
    {
        
    }
}

Настройте в swoole.php:

'wokerstart'=>'\\app\\lib\\WorkStart'

//Закрытый способ

'wokerstart'=>function($server, $worker_id){
    //Если обработка выполняется только в одном процессе, то можно сделать это следующим образом

    if (0==$woker_id){
        //Таким образом, он будет обрабатываться только в первом процессе woker.
    }
}

На основе SwooleTable высокоскоростной межпроцессный кэш, просто измените следующую конфигурацию, Cache может стать высокоскоростным кешем:

'cache'                  => [
        // Драйвер
        'type'   => 'Table',
        // Префикс кэша
        'prefix' => '',
        // Срок действия кэша 0 означает вечный кэш
        'expire' => 0,
],

------------------2018-10-04--------------------------------

  1. Поддержка веб-сокета.
  2. Написание тестовой библиотеки JS для веб-сокетов.

Примечание: режим веб-сокета предназначен для этапа разработки и тестирования, если вы используете команду веб-сокета для запуска службы, многие функции xavier-swoole не могут быть включены, они будут обновлены позже, чтобы объединить HTTP-сервисы и веб-сокетные сервисы.

Команда запуска:

php think swoole:server

Файл конфигурации, файл конфигурации WebsSocket — server.php, путь такой же, как у swoole.php.

<?php
вернуть [
    'host'                  => '0.0.0.0', // Адрес прослушивания
    'port'                  => 9502, // Порт прослушивания
    'mode'                  => '', // Режим работы по умолчанию SWOOLE_PROCESS
    'sock_type'             => '', // Тип сокета по умолчанию SWOOLE_SOCK_TCP
    'app_path'              => getcwd() . '/application', // Путь приложения Если включено 'daemonize'=>true, необходимо установить (используя абсолютный путь)
    'file_monitor'          =>

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

С расширением SWOOLE для thinkphp5.0. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/xavier007-xavier-swoole.git
git@api.gitlife.ru:oschina-mirror/xavier007-xavier-swoole.git
oschina-mirror
xavier007-xavier-swoole
xavier007-xavier-swoole
master