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_tick
和swoole_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);
- 命名空间风格:
Swoole\Async::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);
- 命名空间风格:
Swoole\Async::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';
Swoole\Async::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);
- 执行失败,
$result
为false
,读取$link
对象的error
属性获得错误信息,errno
属性获得错误码 - 执行成功,SQL为非查询语句,
$result
为true
,读取$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 "执行非查询语句\n";
var_dump($db->affected_rows);
} else { // sql为查询语句
echo "执行查询语句\n";
print_r($result);
}
$db->close();
});
});
}
}
$obj = new AsyncMysql();
$obj->execute(1, 'ronaldo7');
echo "start\n";
异步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} \n";
// $redis->set('name1', 'ronaldo', function (swoole_redis $redis, $result) {
// echo "set : {$result} \n";
// $redis->close();
// });
$redis->keys('*', function (swoole_redis $redis, $result) {
var_dump($result);
$redis->close();
});
});
echo 'start' . PHP_EOL;