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

OSCHINA-MIRROR/deepziyu-yii2-swoole

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 7.7 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 15.03.2025 14:09 c6b4fd1

yii2-swoole

Создан для предоставления возможности асинхронной работы с использованием корутин в фреймворке Yii2.

При дальнейшем развитии плагин будет использовать [фреймворк Swoft], который обеспечит реализацию новых функций. Уверены, что Swoft станет отличным следующим поколением фреймворка.

Этот плагин использует корутины из библиотеки swoole (v2.0) для модификации основных компонентов Yii2 таким образом, чтобы разработчики могли пользоваться возможностями асинхронного ввода-вывода без необходимости изменения бизнес-логики.

Основные характеристики

  • Корутина для MySQL клиента и пула соединений, поддерживающая работу с главным сервером и репликами, а также транзакции.

  • Корутина для Redis клиента и пула соединений, а также кэширование (в настоящее время не планируется поддержка транзакций).

  • Корутина для HTTP клиентской части, основанная на Swoft.

  • Компонент кэширования на основе swoole_table.

  • Асинхронный компонент логирования файлов.

  • Разделение бизнес-логики от основного процесса Swoole.

Установка

Требования к окружению

  1. hiredis
  2. composer
  3. PHP7.x
  4. Swoole2.1 с активированной поддержкой корутин и асинхронного Redis

Установка Swoole

Установка через Composer

  • В файле composer.json вашего проекта добавьте зависимость:```json { "require": { "deepziyu/yii2-swoole": "*" } }

- Выполните команду установки: `$ php composer.phar update` или `$ composer update`.

## Настройка

Вы можете воспользоваться примером конфигурации из [этого демонстрационного проекта].

Создайте новый файл запуска.

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

Пример конфигурации `swoole.php`:

```php

defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
defined('WEB_ROOT') or define('WEB_ROOT', dirname(__DIR__) . '/web'); // путь до директории web, где находятся статические файлы пользователя
```require(__DIR__ . '/../../vendor/autoload.php');
``````markdown
$config = [
    'id' => 'api-test-hello',
    'setting' => [
        // конфигурация swoole_server.
        // @see Другие параметры см. https://wiki.swoole.com/wiki/page/274.html
        'daemonize' => 0,
        'worker_num' => 2,
        'task_worker_num' => 1,
        'log_file' => __DIR__.'/../runtime/logs/swoole.log',
        'log_level' => 0,
        'chroot' => '/',
    ],
    'cacheTable' => function () {
        // swoole_table следует запустить заранее, размер должен быть степенью двойки
        return deepziyu\yii\swoole\cache\SwooleCache::initCacheTable(1024);
    },
    'bootstrap' => [
        'class' => 'deepziyu\yii\swoole\bootstrap\YiiWeb',
        'config' => function() {
            // использование замыкания позволяет отложить загрузку
            // возвращает конфигурацию различных компонентов Yii
            require_once(__DIR__ . '/../../vendor/autoload.php');
            require_once(__DIR__ . '/../../yii-swoole/Yii.php');
            require(__DIR__ . '/../config/bootstrap.php');

Обратите внимание, что в данном примере были использованы знаки равно (=) вместо двоеточий (:) для синтаксической корректности в контексте русского языка при условии, что это возможно в вашей среде выполнения. В реальном коде PHP должны использоваться двоеточия (:) для указания значений массива.```markdown

Конфигурация```php

$config = yii\helpers\ArrayHelper::merge( require(DIR . '/../config/main.php'), require(DIR . '/../config/main-local.php'), [ 'components' => [ 'errorHandler' => [ 'class' => 'deepziyu\yii\swoole\web\ErrorHandler' ], 'cache' => [ 'class' => 'deepziyu\yii\swoole\cache\SwooleCache', ], ], ] );

return $config;


## Запуск

```bash
php swoole.php start|stop|reload|reload-task

Пример использования HTTP-клиента

Для использования HTTP-клиента обратитесь к документации Swoft.

В планах

  • Поддержка транзакций в MysqlPool (уже реализовано).
  • Поддержка главного и вторичного сервера в MysqlPool (уже реализовано).
  • Когда пул соединений заполнен, используется sleep() для ожидания, если количество попыток превышено, выбрасывается исключение.

Известные ошибки

  • Итератор может вызвать приостановку корутины.

    Код с ошибкой:

    $models = User::find()->each(10);
    foreach ($models as $model) { // Корутина будет приостановлена здесь
         $data[] = $model->toArray();
    }

Устранённые ошибки

  • При создании нового объекта ActiveRecord вызывается магический метод __set(), который использует корутинный клиент, что приводит к двум проблемам:

    1. Первое создание объекта приводит к приостановке корутины.

    2. Если SQL запрос завершается ошибкой, это приведёт к завершению работы процесса.

    Код с ошибкой:

    class OneModel extends ActiveRecord {
        public static function tableName() {
           return 'some-table does not exist';
        }
    }
    // Завершение работы процесса
    $model = new OneModel([
        'some-attribute' => 'some-value',
    ]);
    ```## Ссылки
    

Репозиторий gitee

Репозиторий GitHub

Чат и помощь

Группа QQ для Swoft Framework: 548173319

Опубликовать ( 0 )

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

1
https://api.gitlife.ru/oschina-mirror/deepziyu-yii2-swoole.git
git@api.gitlife.ru:oschina-mirror/deepziyu-yii2-swoole.git
oschina-mirror
deepziyu-yii2-swoole
deepziyu-yii2-swoole
master