协程函数
创建协程
Swoft 框架中一定不要直接使用 Swoole 提供的
go
函数创建协程,否则会导致请求和上下文丢失导致一些奇葩问题。
方法一
use Swoft\Co;
Co::create(function(){
// to do
});
方法二
sgo(function(){
// todo
});
Sgo
函数使用和 SwooleGo
函数完全一样,切记框架中只能使用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);
参数说明:
- $filename:带完整路径的文件名称
记住,在携程内部读取文件,请使用这种方式
下面引用官方的任务介绍
某些场景对主流程没有依赖,可以直接使用任务来实现类似这些功能。框架为开发者提供了 协程 和 异步 两种任务。切记无论是 协程任务 还是 异步任务,任务里面操作都 只支持协程,且只能使用框架封装的所有 IO 操作(数据库、缓存…)
写文件
写入成功返回 true,失败返回 false。
use Swoft\Co;
$fileName = 'file.txt';
$data = Co::writeFile($fileName, 'Swoft Framework');
参数说明:
- $filename:带完整路径的文件的名称,须有可写权限。文件不存在时会自动创建,打开文件失败会直接返回 false
- $data:写入内容,大小限制为 4M
- $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 内每个操作可执行的业务不存在上限,根据实际业务而定。
参数说明:
- $requests:多个操作集合。requests 支持多种格式,支持以下3种
- 对象方法
- 对象静态方法
- 闭包函数
- $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);
参数说明:
- $msec 周期执行的时间,单位是毫秒
- $callback 回调函数
- $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);
参数说明:
- $msec 延迟时间,单位是毫秒
- $callback 回调函数
- $params 传递的参数,会原封不动的传递给回调函数。
$afterid 就是返回的任务 id 可用于 \Swoft\Timer::clear 终止延迟任务.
clear
终止定时任务
\Swoft\Timer::clear($id);
参数说明:
- $id Tick 函数或者 After 函数返回的 ID 值,终止定时任务。