月度归档:2018年10月

Laravel 5.6 中优雅的管理 swoole 进程

1. 创建自定义artisan命令
php artisan make:command SwooleManger //默认在app/Console/Commans目录下创建SwooleManger.php文件。

    <?php
    namespace App\Console\Commands;    
    use Illuminate\Console\Command;
    use Illuminate\Support\Facades\App;
    class SwooleManger extends Command
    {
        private $server;

        private $pid_file;
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'swoole {action}';

        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'start or stop the swoole process';

        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
            parent::__construct();
            $this->pid_file =  __DIR__.'/../../../storage/swoole_websocket.pid';
        }

        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function handle()
        {
            //获取传递的操作
            $arg = $this->argument('action');

            switch ($arg){
                case 'start':
                    //检测进程是否已开启
                    $pid = $this->getPid();
                    if($pid && \Swoole\Process::kill($pid,0))
                    {
                        $this->error("\r\nprocess already exist!\r\n");
                        exit;
                    }

                    $this->server = new \swoole_websocket_server("0.0.0.0", 9501);
                    $this->server->set([
                        'worker_num'=>8,
                        'daemonize' =>1,
                        'max_request'=>1000,
                        'dispatch_mode'=>2,
                        'pid_file' =>$this->pid_file,
                    ]);

                    //绑定操作类回调函数
                    $app = App::make('App\Handles\SwooleWebSocketHandle');

                    $this->server->on('open',array($app,'onOpen'));

                    $this->server->on('message',array($app,'onMessage'));

                    $this->server->on('close',array($app,'onClose'));

                    $this->info("\r\nprocess created successful!\r\n");

                    $this->server->start();
                    break;

                case 'stop':
                    if(!$pid = $this->getPid())
                    {
                        $this->error("\r\nprocess not started!\r\n");
                        exit;
                    }
                    if(\Swoole\Process::kill((int)$pid))
                    {
                        $this->info("\r\nprocess close successful!\r\n");
                        exit;
                    }
                    $this->info("\r\nprocess close failed!\r\n");
                    break;

                default:
                    $this->error("\r\noperation method does not exist!\r\n");
            }

        }

        //获取pid
        private function getPid()
        {
            return file_exists($this->pid_file) ? file_get_contents($this->pid_file) :false;
        }
    }

以上命令定义完成可使用artisan来管理swoole websocket服务的开启和关闭

php artisan swoole start  //开启
php artisan swoole stop //关闭

2.使用Handles类来处理swoole的事件处理

//在SwooleManger中使用了 
$app = App::make('App\Handles\SwooleWebSocketHandle'); //将SwooleWebsocketHandle注入到SwooleManger中

使用$this->server->on 注册事件回调函数,创建App\Handles\SwooleWebSocketHandle文件实现webSocket的事件即可

centos7安装mysql8.0

1.下载解压安装

wget http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-8.0/mysql-8.0.12.tar.gz
 tar -xvf mysql-8.0.12.tar.gz

2.创建mysql用户和用户组

sudo groupadd mysql
sudo useradd -s /sbin/nologin -g mysql -r mysql  //不允许登录

3.编译安装

cd mysql-8.0.12
sudo cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_DATADIR=/data 
-DSYSCONFDIR=/usr/local/mysql/etc 
-DMYSQL_TCP_PORT=3306 
-DDOWNLOAD_BOOST=1 
-DWITH_BOOST=/usr/local/mysql-8.0.11/boost

make && make install

4. 初始化及修改目录权限

bin/mysqld --initialize --user=mysql --datadir=/data/mysql/
#执行初始化时会产生一个随机密码,需要拷贝【l(akwnBsb2kN】
bin/mysql_ssl_rsa_setup
chown -R mysql:mysql /usr/local/mysql
chown -R mysql:mysql /data/mysql
chmod 755 /usr/local/mysql -R
chmod 755 /data/mysql -R
#注意:配置文件中的pid文件和日志文件目录需要设置权限给mysql写入

5. 使用随机密码登录

sudo bin/mysqld_safe --user=mysql & 
bin/mysql -u root -p #登录后修改密码
alter user "root"@"localhost" identified by '123qwe4r';
#远程访问
use mysql;
update user set Host='%' where User='root';
flush privileges;

6. 连接报错

#这个错误出现的原因是在mysql8之前的版本中加密规则为mysql_native_password,而在mysql8以后的加密规则为caching_sha2_password。
#修改配置文件my.conf
default_authentication_plugin= mysql_native_password
#修改完重启mysql服务修改用户密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
#设置密码规则
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';  
#更新一下用户的密码 
FLUSH PRIVILEGES; #刷新权限

7. 拷贝启动文件

sudo cp /usr/lib/systemd/system/mysql.server /etc/init.d/mysqld
#systemctl管理mysql启动
sudo vim /usr/lib/system/system/mysql.service #加入以下内容
[Unit]
Description=redis-server
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/etc/init.d/mysqld start
ExecStop=/etc/init.d/mysqld stop
[Install]
WantedBy=multi-user.target