资讯专栏INFORMATION COLUMN

swoole——从入门到放弃(二)

awokezhou / 3397人阅读

摘要:从入门到放弃二一异步毫秒定时器设置一个间隔时钟定时器,与定时器不同的是定时器会持续触发,直到调用清除。是一次性函数,执行完成后就会销毁最大不超过使用定时器来删除定时器。

swoole——从入门到放弃(二) 一、异步毫秒定时器

swoole_timer_tick:设置一个间隔时钟定时器,与after定时器不同的是tick定时器会持续触发,直到调用swoole_timer_clear清除。int swoole_timer_tick(int $ms, callable $callback, mixed $user_param)

$ms:单位毫秒

$callback

function callbackFunction(int $timer_id, mixed $params = null);

$timer_id:定时器的ID,可用于swoole_timer_clear清除此定时器

$params:由swoole_timer_tick传递的第三个参数

$user_param:用户参数,该参数会被传递到callbackFunction中,如果有多个参数可以使用数组的形式,也可以使用匿名函数的use语法传递到回调函数中

swoole_timer_after:在指定的时间后执行函数,需要1.7.7或更高版本。int swoole_timer_after(int $after_time_ms, mixed $callback_function, mixed $user_param);

是一次性函数,执行完成后就会销毁

$ater_time_ms:最大不超过86400000

swoole_timer_clear:使用定时器ID来删除定时器。bool swoole_timer_clear(int $timer_id)

$timer_id:定时器ID,调用swoole_timer_tickswoole_timer_after后会返回一个整数的ID

只能用来清除当前进程的定时器

swoole中定时器的例子:
# 先打印start,每隔2s打印tick回调函数中的内容,打印start后5s打印after中的内容
swoole_timer_tick(2000, function($timer_id,) {
    echo "2s : timer_id-{$timer_id}";
});
$data = ["name" => "ronaldo"];
swoole_timer_after(5000, function($timer_id) use ($data) {
    print_r("5s : data - {$data}");
});
echo "start";
二、异步文件系统

swoole_async_readfile,异步读取文件内容

函数风格:swoole_async_readfile(string $filename, mixed $callback);

命名空间风格:SwooleAsync::readFile(string $filename, mixed $callback);

文件不存在会返回false

成功打开文件立即返回true

数据服务完毕后会回调指定的callback函数

callback参数:$filename$content

swoole_async_readfile会将文件内容全部复制到内存,所以不能用于大文件的读取,如果想读取大文件,使用swoole_async_read
swoole_async_readfile最大可读取4M的文件,受限于SW_AIO_MAX_FILESIZE
// 异步读取文件
$result = swoole_async_readfile($filename, function ($filename, $content) {
    echo "filename : {$filename}" . PHP_EOL;
    echo "content : {$content}" . PHP_EOL;
});

echo "start".PHP_EOL;
var_dump($result);

swoole_async_writefile,异步写文件

函数风格:swoole_async_writefile(string $filename, string $fileContent, callable $callback = null, int falgs = 0);

命名空间风格:SwooleAsync::writeFile(string $filename, string $fileContent, callable $callback = null, int falgs = 0);

$filename:文件名,必须有写权限,文件不存在会自动创建。打开文件失败会返回false

$fileContent:最大可写入4M

$callback:可选

$falgs:写入选项,使用FILE_APPEND表示追加到文件末尾

如果文件已存在,底层会覆盖旧的文件内容

常用于写日志
// 异步写文件
$content = date("Y-m-d H:i:s") . PHP_EOL;
$filename = __DIR__ . "/test.txt";
SwooleAsync::writeFile($filename, $content, function ($filename) {
    echo "write {$filename} success" . PHP_EOL;
}, FILE_APPEND);

echo "start" . PHP_EOL;
三、异步Mysql
1、swoole_mysql->connect(array $serverConfig, callable $callback)
// 回调
function callback(swoole_mysql $db, bool $result);
// 配置
$serverConfig= array(
    "host" => "127.0.0.1",
    "user" => "root",
    "password" => "123456",
    "database" => "test",
    "charset" => "utf8",
);
2、function swoole_mysql->query($sql, callable $callback);

function callback(swoole_mysql $link, mixed $result);

执行失败,$resultfalse,读取$link对象的error属性获得错误信息,errno属性获得错误码

执行成功,SQL为非查询语句,$resulttrue,读取$link对象的affected_rows属性获得影响的行数,insert_id属性获得Insert操作的自增ID

执行成功,SQL为查询语句,$result为结果数组

3、异步连接mysql 的一个小实例
class AsyncMysql {

    private $dbSource = null;
    private $dbConfig = null;
    public function __construct()
    {
        $this->dbSource = new swoole_mysql;
        $this->dbConfig = [
            "host" => "127.0.0.1",
            "port" => 3306,
            "user" => "root",
            "password" => "123456",
            "database" => "test",
            "charset" => "utf8", //指定字符集
            "timeout" => 2,  // 可选:连接超时时间(非查询超时时间),默认为SW_MYSQL_CONNECT_TIMEOUT(1.0)
        ];
    }

    public function execute($id, $name)
    {
        // 连接mysql
        $this->dbSource->connect($this->dbConfig, function ($db, $result) use ($id, $name) {
            if ($result === false) {
                var_dump($db->error, $db->errno);
                die;
            }
            $sql = "UPDATE `student` SET `name` = "{$name}" WHERE `id` = {$id}";
            $db->query($sql, function ($db, $result) {
                if ($result === false) {
                    var_dump($db->connect_error);
                } elseif ($result === true) { // sql为非查询语句
                    echo "执行非查询语句
";
                    var_dump($db->affected_rows);
                } else { // sql为查询语句
                    echo "执行查询语句
";
                    print_r($result);
                }
                $db->close();
            });
        });
    }
    
}

$obj = new AsyncMysql();
$obj->execute(1, "ronaldo7");
echo "start
";
异步Redis

redis服务安装

redis服务

去redis官网下载redis包

tar -zxvf redis-4.0.9.tar.gz

cd redis-4.0.9

make

cd src

./redis-server,即可开启redis服务

./redis-cli,可连接redis服务

hiredis库

hiredis下载地址

unzip hiredis-0.13.3.zip

如果你没有unzip,可以执行yum install -y unzip zip

cd hiredis-0.13.3.zip

make -j

sudo make install

sudo ldconfig

编译swoole需要加入-enable-async-redis

cd swoole

./configure --with-php-config=/opt/soft/php/bin/php-config --enable-async-redis

make clean

make -j

sudo make install

查看安装是否成功

查看swoole是否存在:php -m

如果不存在的话vim ~/.bash_profile

加入一行:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

再:source ~/.bash_profile,即可

查看异步的redis是否支持:php --ri swoole

如果存在:async redis client => enabled,表明支持

redis常用方法

function swoole_redis->__construct(array $options = null);

$option配置选项数组,默认为null

function swoole_redis->connect(string $host, int $port, callable $callback);

$host:redis服务器的主机IP

$port:redis服务器的端口

$callback:回调函数

function onConnect(swoole_redis $redis, bool $result);

$result:连接成功为true,连接失败为false,可以读取$redis->errCode获得错误码,读取$redis->errMsg获得错误消息

function swoole_redis->close();

异步redis实例
$redisClient = new swoole_redis();
$redisClient->connect("127.0.0.1", 6379, function (swoole_redis $redis, $result) {
    echo "connect : {$result} 
";
//    $redis->set("name1", "ronaldo", function (swoole_redis $redis, $result) {
//        echo "set : {$result} 
";
//        $redis->close();    
//    });
    $redis->keys("*", function (swoole_redis $redis, $result) {
        var_dump($result);
        $redis->close();
    });
});

echo "start" . PHP_EOL;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30789.html

相关文章

  • swoole——入门放弃

    摘要:从入门到放弃二一异步毫秒定时器设置一个间隔时钟定时器,与定时器不同的是定时器会持续触发,直到调用清除。是一次性函数,执行完成后就会销毁最大不超过使用定时器来删除定时器。 swoole——从入门到放弃(二) 一、异步毫秒定时器 swoole_timer_tick:设置一个间隔时钟定时器,与after定时器不同的是tick定时器会持续触发,直到调用swoole_timer_clear清...

    tinyq 评论0 收藏0
  • swoole——入门放弃(三)

    摘要:从入门到放弃三一进程子进程创建成功后要执行的函数重定向子进程的标准输入和输出。默认为阻塞读取。是否创建管道,启用后,此选项将忽略用户参数,强制为。 swoole——从入门到放弃(三) 一、进程 swoole_process SwooleProcess swoole_process::__construct(callable $function, $redirect_stdin...

    王笑朝 评论0 收藏0
  • swoole——入门放弃(三)

    摘要:从入门到放弃三一进程子进程创建成功后要执行的函数重定向子进程的标准输入和输出。默认为阻塞读取。是否创建管道,启用后,此选项将忽略用户参数,强制为。 swoole——从入门到放弃(三) 一、进程 swoole_process SwooleProcess swoole_process::__construct(callable $function, $redirect_stdin...

    rottengeek 评论0 收藏0
  • swoole——入门放弃(一)

    摘要:进程可以使用函数向进程投递新的任务。当前的进程在调用回调函数时会将进程状态切换为忙碌,这时将不再接收新的,当函数返回时会将进程状态切换为空闲然后继续接收新的。当进程投递的任务在中完成时,进程会通过方法将任务处理的结果发送给进程。 swoole——从入门到放弃(一) 一、swoole的源码包安装 下载swoole源码:git clone https://gitee.com/swoole...

    morgan 评论0 收藏0

发表评论

0条评论

awokezhou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<