swoft2 教程系列-公共函数

协程函数

创建协程

Swoft 框架中一定不要直接使用 Swoole 提供的  go  函数创建协程,否则会导致请求和上下文丢失导致一些奇葩问题。

方法一

use Swoft\Co;

Co::create(function(){
 // to do
});

方法二

sgo(function(){
 // todo
});
Sgo  函数使用和 Swoole  Go  函数完全一样,切记框架中只能使用  Sgo  函数,不能直接使用  Go  函数

我们推荐使用sgo

获取协程ID

获取当前协程 ID,-1 为非协程环境:
use Swoft\Co;

$id = Co::id();

获取顶级协程

获取顶级(最外层)协程 ID:
use Swoft\Co;

$id = Co::tid();

读文件

读取成功返回字符串内容,读取失败返回 false,可使用 swoole_last_error 获取错误信息。`readFile 方法没有文件大小限制,读取的内容会存放在内存中,因此读取大文件时会占用大量内存
use Swoft\Co;

$fileName = 'file.txt';
$data = Co::readFile($fileName);

参数说明:

  1. $filename:带完整路径的文件名称

记住,在携程内部读取文件,请使用这种方式

下面引用官方的任务介绍

某些场景对主流程没有依赖,可以直接使用任务来实现类似这些功能。框架为开发者提供了 协程 和 异步 两种任务。切记无论是 协程任务 还是 异步任务,任务里面操作都 只支持协程,且只能使用框架封装的所有 IO 操作(数据库、缓存…)

写文件

写入成功返回 true,失败返回 false。

use Swoft\Co;

$fileName = 'file.txt';
$data = Co::writeFile($fileName, 'Swoft Framework');

参数说明:

  1. $filename:带完整路径的文件的名称,须有可写权限。文件不存在时会自动创建,打开文件失败会直接返回 false
  2. $data:写入内容,大小限制为 4M
  3. $flags:为写入的选项,默认会清空当前文件内容,可以使用 FILE_APPEND 表示追加到文件末尾
因为文件写入内容有大小限制,所以可以把大文件切片,循环写入,把 flag 设置成 FILE_APPEND 代表追加.

并发

框架底层通过协程通道,封装了一套混合 IO 并发操作的方法,一般用于没有依赖的多个流程。
use Co\Http\Client;
use Swoft\Co;

/**
 * Class CoTest
 *
 * @since 2.0
 */
class CoTest
{

 public function testMulti()
 {
        $requests = [
 'method' => [$this, 'requestMethod'], //对象方法使用
 'staticMethod' => self::requestMehtodByStatic(), //类静态方法使用
 'closure' => function () { //闭包使用
                $cli = new Client('www.baidu.com', 80);
                $cli->get('/');
                $result = $cli->body;
                $cli->close();

 return $result;
 }
 ];

        $response = Co::multi($requests,1000);
 }

 public function requestMethod()
 {
        $cli = new Client('www.baidu.com', 80);
        $cli->get('/');
        $result = $cli->body;
        $cli->close();

 return $result;
 }

 public static function requestMehtodByStatic()
 {
        $cli = new Client('www.baidu.com', 80);
        $cli->get('/');
        $result = $cli->body;
        $cli->close();

 return $result;
 }
}

并发执行结果按照 requests 数组中 key 对应关系返回。如果某个 key 对应的值为 false,意味着该操作执行失败。requests 内每个操作可执行的业务不存在上限,根据实际业务而定。

参数说明:

  1. $requests:多个操作集合。requests 支持多种格式,支持以下3种
  • 对象方法
  • 对象静态方法
  • 闭包函数
  1. $timeout:超时时间,默认永不超时

通用函数

env。

获取环境变量的值
function env(string $key = null, $default = null): mixed 

alias

获取路径别名的值
function alias(string $key): string

bean

从容器中获取bean对象,等同于 \Swoft::getBean()
function bean(string $key): object

config

获取应用配置的值
function config(string $key, $default = null): mixed

server

获取服务实例,包括 HTTP Server 和 WebSocket Server。
function server(): \Swoft\Server\Server

context

获取上下文对象。
function context(): ContextInterface

vdump

打印数据,跟 var_dump 一样,只是会在前面多打出调用的位置,方便调试。
function vdump(...$vars)

validate

数据验证。配合验证器使用,详细介绍在验证器详解中介绍.
function validate(array $data, string $validatorName, array $fields = [], array $userValidators = []): array

srun

启动协程并等待执行结束。和 sgo 的区别 sgo 执行不等待,而 srun 执行不等待下面给个示例
echo 1;
sgo(function(){
 Coroutine::sleep(3);
  echo 2;
});
echo 3 ;

//输出 3 1 2


echo 1;
srun(function(){
 Coroutine::sleep(3);
  echo 2;
 return true;
});
echo 3 ;

//输出 1 2 3

定时器

对应一些延迟执行或者周期性执行的任务,此时需要使用定时器实现。Swoft 框架中封装了一套定时器操作方式,开发者可以直接使用,切记一定要使用 Swoft 框架封装的,如果直接使用 Swoole 提供的会因为上下文,带来一系列问题。

Tick

周期性的执行一项任务,使用例子如下:

$paramOne = 1;
$paramTwo = 1;
$tickid=\Swoft\Timer::tick(1, function ($paramOne, $paramTwo) {
 // To to something
}, $paramOne, $paramTwo);

参数说明:

  1. $msec 周期执行的时间,单位是毫秒
  2. $callback 回调函数
  3. $params 传递的参数,会原封不动的传递给回调函数。
$tickid 就是返回的任务 id 可用于 \Swoft\Timer::clear 终止周期任务.

After

例如订单超时,可以延迟 10分钟执行,判断订单状态如果未付款,就把订单状态设置为超时

延迟一段时间执行任务,使用例子如下:

$paramOne = 1;
$paramTwo = 1;
$afterid=\Swoft\Timer::after(1, function ($paramOne, $paramTwo) {
 // To to something
}, $paramOne, $paramTwo);

参数说明:

  1. $msec 延迟时间,单位是毫秒
  2. $callback 回调函数
  3. $params 传递的参数,会原封不动的传递给回调函数。
$afterid 就是返回的任务 id 可用于 \Swoft\Timer::clear 终止延迟任务.

clear

终止定时任务

 \Swoft\Timer::clear($id);

参数说明:

  1. $id Tick 函数或者 After 函数返回的 ID 值,终止定时任务。
发布了543 篇原创文章 · 获赞 32 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_36691991/article/details/105045402