Расширение 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-------------------------
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--------------------------------
Примечание: режим веб-сокета предназначен для этапа разработки и тестирования, если вы используете команду веб-сокета для запуска службы, многие функции 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 )