class SwooleTest
{
private $host = "0.0.0.0";
//tcp连接
public function tcp()
{
$serv = new swoole_server($this->host, 9505);
//监听连接进入事件
$serv->on('connect', function ($serv, $fd) {
echo "Client: Connect.\n";
});
//监听数据接收事件
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
$serv->send($fd, "Server: " . $data);
});
//监听连接关闭事件
$serv->on('close', function ($serv, $fd) {
echo "Client: Close.\n";
});
//启动服务器
$serv->start();
}
//http连接
public function http()
{
$ser = new swoole_http_server($this->host, 9503);
$ser->on('request', function ($request, $respond) {
$respond->header("Content-Type", "text/html;charset=utf-8");
$respond->end('hello world');
});
$ser->start();
}
//websocket
public function websocket()
{
$server = new swoole_websocket_server("0.0.0.0", 9504);
$server->on('open', function (swoole_websocket_server $server, $request) {
echo "server: handshake success with fd{$request->fd}\n";
});
$server->on('message', function (swoole_websocket_server $server, $frame) {
echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
$server->push($frame->fd, "this is server");
});
$server->on('close', function ($ser, $fd) {
echo "client {$fd} closed\n";
});
$server->on('open', function (swoole_websocket_server $ws, $request) {
$ws->push($request->fd, 'welcome you');
});
$server->start();
}
//定时器间隔执行任务
public function timer()
{
static $count = 0;
swoole_timer_tick(2000, function ($timer_id) use (&$count) {
if ($count == 3) {
swoole_timer_clear($timer_id);
}
$count++;
echo '执行' . $count . "\n";
});
// swoole_timer_after(1000,function($timer_id){
// echo '执行\n';
// });
}
//tcp异步执行任务
public function asyncTcp()
{
$server = new swoole_server($this->host, 9502);
//设置异步进程的工作数量
$server->set(array(
'task_worker_num' => 4
));
//投递异步任务
$server->on('receive', function (swoole_server $server, $fd, $from_id, $data) {
$task_id = $server->task($data); //投递任务
});
//处理异步任务
$server->on('task', function (swoole_server $server, $task_id, $from_id, $data) {
echo "异步执行 ID :" . $task_id . "from_id:" . $from_id;
$server->finish($data);
});
//处理结果
$server->on('finish', function ($server, $task_id, $data) {
echo "执行完成 task_id:$task_id,data:$data";
});
$server->start();
}
}
class SwooleProcess{
/**
swoole_process提供了基于unixsock的进程间通信,使用很简单只需调用write/read或者push/pop即可
swoole_process支持重定向标准输入和输出,在子进程内echo不会打印屏幕,而是写入管道,读键盘输入可以重定向为管道读取数据
配合swoole_event模块,创建的PHP子进程可以异步的事件驱动模式
swoole_process提供了exec接口,创建的进程可以执行其他程序,与原PHP父进程之间可以方便的通信
*/
public function test() //创建进程
{
$process = new swoole_process([$this,"doProcess"]);
$pid = $process->start();
$process = new swoole_process([$this,"doProcess"]);
$pid = $process->start();
$process = new swoole_process([$this,"doProcess"]);
$pid = $process->start();
swoole_process::wait();
}
//进程间管道通信
public function pipe()
{
$workers = [];
$worker_num = 3;
for ($i = 0; $i < $worker_num; $i++){
$process = new swoole_process([$this,"doProcess2"]);
$pid = $process->start();
$workers[$pid] = $process;
}
foreach ($workers as $worker){
swoole_event_add($worker->pipe,function($pipe) use ($worker){
$data = $worker->read();
echo "接收到数据".$data."\n";
});
}
}
function doProcess2(swoole_process $worker)
{
$worker->write("PID:".$worker->pid); //子进程向管道写入信息z
}
function doProcess(swoole_process $worker)
{
echo "PID".$worker->pid."\n";
}
/**
* 进程每隔一段时间异步的触发一个函数
*/
public function signal()
{
//触发函数
swoole_process::signal(SIGALRM,function (){ //异步执行,10次停止
static $times = 1;
if ($times == 10){
swoole_process::alarm(-1);
}
echo $times++;
});
swoole_process::alarm(100* 1000); //代码不提示
//定时信号
}
}
class Lock
{
/**
* 测试失败,有时间了需要重新安装扩展
*
*/
public function test()
{
//文件锁/读写锁/互斥锁/信号量/自旋锁 --- 查
$lock = new swoole_lock(SWOOLE_MUTEX);
$lock->lock(); //开始锁定进程
if (pcntl_fork() > 0){ //创建子进程
sleep(1);
$lock->unlock();
}else{
echo "子进程获取锁";
$lock->lock();
echo "子进程获取锁";
$lock->unlock();
exit("子进程退出");
}
echo "主进程释放锁";
unset($lock);
sleep(1);
echo "子进程退出";
}
}
/**
* 异步IO
* Class SwooleAsyncFile
*/
class SwooleAsyncIO{
public function test()
{
//文件异步读取
swoole_async_readfile('test.txt',function ($filename,$content){
echo $content;
});
//最大4M,异步写入文件
swoole_async_writefile('test.txt',"需要写入的文件内容",function($filename){
echo $filename;
},FILE_APPEND);
}
//异步事件,异步的从www.qq.com获取内容
public function test2()
{
$fp = stream_socket_client("tcp://www.qq.com:80",$error,$errstr,30);
fwrite($fp,"GET / HTTP/1.1 \r\nHost:www.qq.com\r\n\r\n"); //用tcp连接发起http请求
swoole_event_add($fp,function($fp){
$resp = fread($fp,8192);
var_dump($resp);
swoole_event_del($fp); //删除任务
fclose($fp);
});
}
//异步mysql操作
public function test3()
{
$config = [
'host' => '127.0.0.1',
'user' => 'root',
'password' => '123456',
'database' => 'mysql',
'charset' => 'utf8'
];
$db = new swoole_mysql();
$db->connect($config,function(swoole_mysql $db,$r){
if ($r === false){
var_dump($db->connect_errno,$db->connect_error);
die('失败');
}
$sql = 'show tables';
$db->query($sql,function(swoole_mysql $db, $r){
if ($r === false){
var_dump($db->error);
die('操作失败');
}elseif ($r === true){
var_dump($db->affected_rows,$db->insert_id);
}
});
});
}
}
网友评论