Создан для предоставления возможности асинхронной работы с использованием корутин в фреймворке Yii2.
При дальнейшем развитии плагин будет использовать [фреймворк Swoft], который обеспечит реализацию новых функций. Уверены, что Swoft станет отличным следующим поколением фреймворка.
Этот плагин использует корутины из библиотеки swoole (v2.0) для модификации основных компонентов Yii2 таким образом, чтобы разработчики могли пользоваться возможностями асинхронного ввода-вывода без необходимости изменения бизнес-логики.
Корутина для MySQL клиента и пула соединений, поддерживающая работу с главным сервером и репликами, а также транзакции.
Корутина для Redis клиента и пула соединений, а также кэширование (в настоящее время не планируется поддержка транзакций).
Корутина для HTTP клиентской части, основанная на Swoft.
Компонент кэширования на основе swoole_table.
Асинхронный компонент логирования файлов.
Разделение бизнес-логики от основного процесса Swoole.
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
$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-клиента обратитесь к документации Swoft.
sleep()
для ожидания, если количество попыток превышено, выбрасывается исключение.Итератор может вызвать приостановку корутины.
Код с ошибкой:
$models = User::find()->each(10);
foreach ($models as $model) { // Корутина будет приостановлена здесь
$data[] = $model->toArray();
}
При создании нового объекта ActiveRecord
вызывается магический метод __set()
, который использует корутинный клиент, что приводит к двум проблемам:
Первое создание объекта приводит к приостановке корутины.
Если SQL запрос завершается ошибкой, это приведёт к завершению работы процесса.
Код с ошибкой:
class OneModel extends ActiveRecord {
public static function tableName() {
return 'some-table does not exist';
}
}
// Завершение работы процесса
$model = new OneModel([
'some-attribute' => 'some-value',
]);
```## Ссылки
Группа QQ для Swoft Framework: 548173319
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )