闲话三两句
一又回魔都了,目前趋于稳定。 二我家大美丽也来了。 三自己的电脑刷成了 linux,目前还在探索中。 四节日快乐呀!
win10 子系统(wsl2)运行 laradock
没忍住,把家里的电脑更新到了预览版,然后体验了一下 wls2,相对于 wsl1,使用 docker 简直不要太简单。 更新 wsl2开个命令行: 12wsl --set-version Ubuntu 2wsl --set-default-version 2 下载docker wsl2 版 docker 下载 配置下载完成后,先勾选 wsl2。 然后直接重启 docker。 重启完成后,勾选你的发行版子系统。 然后再次重启 docker。 测试12bashdocker -v 重装好像把我之前的镜像都给弄没了,切到 laradock 重新下载。 正常访问,打完收工。
win10 子系统(wsl1)运行 laradock
子系统出来挺长时间了,看看配置,公司的渣机也就能玩玩wsl1,也就是第一代子系统。 算了,就这么鼓捣吧。 子系统选择 Ubuntu。 安装子系统略 配置 docker官网配置手册 先卸载旧版docker: 1sudo apt-get remove docker docker-engine docker.io containerd runc 然后再继续安装: 12345678910111213141516171819202122232425262728# 更新索引sudo apt-get update# 安装软件,允许 apt 通过 https 访问存储库sudo apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ software-properties-common# 添加Docker的官方GPG密钥curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -# 设置存储库sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"# 安装 docker 客户端sudo apt-get install docker-ce# 赋权sudo usermod -aG docker $USER# 安装 docker-composesudo apt install docker-compose 关联 wsl 到 docker-for-windows在 wsl 中运行 1echo "export DOCKER_HOST=tcp://localhost:2375" >> ~/.bashrc && source ~/.bashrc wsl 目录挂载wsl 目录挂载默认在 /mnt/c,跟 docker-for-windows 的工作方式不一致,因此需要做下调整。 12345sudo vi /etc/wsl.conf[automount]root = /options = "metadata" 保存以后,重启 wsl。 启动laradock在 windows 的 laradock 目录中打开命令行,运行 bash 即可快速进入 wsl 中的对应目录,然后再执行 docker-compose up 命令就能启动服务。 启动完以后,宿主机直接访问即可。 如果配置虚拟域名,一样是在宿主机的 hosts 添加。
在 laravel vue 中使用 svg 图标
在 laravel vue 中使用 svg 图标 安装扩展组件:123npm install laravel-mix-svg-vueoryarn add laravel-mix-svg-vue 在 webpack.mix.js 中添加引用:12345const mix = require('laravel-mix');require('laravel-mix-svg-vue');mix.js('resources/js/app.js', 'public/js') .svgVue(); 在 app.js 中引用组件1234import Vue from 'vue';import SvgVue from 'svg-vue';Vue.use(SvgVue); svg 使用:1<svg-vue icon="avatar"></svg-vue> 默认配置123456789{ svgPath: 'resources/svg', extract: false, svgoSettings: [ { removeTitle: true }, { removeViewBox: false }, { removeDimensions: true } ]} 参数 类型 默认值 说明 svgPath String resources/svg svg 图标路径 extract Boolean false 将 svg 与主包分离 svgoSettings Array [{ removeTitle: true }, { removeViewBox: false }, { removeDimensions: true }] svgo 相关设置 缺点好像是不能通过参数动态改变 svg 内容,没试出来,不知道什么原因。
在 laradock 环境中使用 laravel-swoole 的 websocket
之前写了一篇 在 laradock 环境中使用 laravel-swoole 加速你的 laravel 应用 的博客,算是敲开了 laravel-swoole 的大门,今天就继续研究下期中的 websocket 功能。 安装 laravel-swoole这里就不写了,参考上篇。 配置 socket编辑 laravel env 文件,写入如下一行: 1SWOOLE_HTTP_WEBSOCKET=true 然后执行 php artisan swoole:http infos 查看状态 1234567891011121314151617+-----------------+-----------------------------------------------------+| Name | Value |+-----------------+-----------------------------------------------------+| PHP Version | 7.2.21-1+ubuntu16.04.1+deb.sury.org+1 || Swoole Version | 4.4.4 || Laravel Version | 5.8.33 || Listen IP | workspace || Listen Port | 1215 || Server Status | Online || Reactor Num | 2 || Worker Num | 2 || Task Worker Num | 2 || Websocket Mode | On || Master PID | 326 || Manager PID | 327 || Log Path | /var/www/laravel-learn/storage/logs/swoole_http.log |+-----------------+-----------------------------------------------------+ 可以看到 Websocket Mode 一项已经打开了。 编辑 socket 路由在 routes/websocket.php 中: 1234567891011121314Websocket::on('connect', function ($websocket, Request $request) { // called while socket on connect $websocket->emit('message', 'welcome');});Websocket::on('disconnect', function ($websocket) { // called while socket on disconnect $websocket->emit('message', 'server is gone, bye~');});Websocket::on('example', function ($websocket, $data) { $websocket->emit('message', $data);}); 此文件修改后需要重启 swoole:http。 前端连接 socket因为 laravel-swoole 使用的是 Socket.io,所以这里也采用这个。 12345678910111213141516<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.js"></script><script type="text/javascript"> var socket = io('http://study.test:8080/', {transports: ['websocket'], reconnection: true}); socket.on('connect', function () { socket.emit('example', 'hi'); socket.on('disconnect', function () { console.log('disconnect'); }); socket.on('message', function (msg) { console.log(msg) }); });</script> 配置 nginx如果你用的 swoole 版本为 4.4.4,那么还需要对上篇文章中的 nginx 配置做个小修改,即添加一行: 1proxy_http_version 1.1; 完整配置就不贴了,把这一行加在 proxy_pass http://swoole-http$suffix; 这一行前后都行。 如果没有这一行的话,而且怎么也没反应的话,记得去 log 中找具体报错。 emmm,文档没写,在 issue 里扒出来的……
python 内存溢出的解决方法
运行在服务器上的数据同步脚本突然出现已杀死,谁把你杀了,咋就突然被杀了??? 系统日志切换到 var/log/ 查看 messages,发现是 Out of memory: Kill process 13678 (python3) score 906 or sacrifice child 原因分析这就奇怪了,数据同步脚本每次运行完都会释放内存的,而且已经从常开的死循环改成了 BlockingScheduler 的定时任务,按理说不应该消耗大量内存。 数据同步没问题,那就只能是其他程序消耗了,想起来这里不紧运行了数据同步,还有一个 laravel 项目和一个 django 项目,laravel 为 django 提供接口,问题很有可能就出现在 django! 运行 top 查看 python 的内存消耗,然后通过 laravel 调用一下接口,发现内存确实上涨并且一直没有释放。 罪魁祸首终于找到了! 问题解决经过一番查询,django 引发内存泄漏一般有两种情况,一个是直接访问 django 的数据库接口时没有主动释放游标,另一个就是设置了 debug 模式,这个项目因为还在开发,所以 debug 模式确实开着。 改掉以后再试,果然内存不再飙升。 线上环境一定要慎重啊!
2019 年学习清单
laradock laravel 内置 vue 的用法 laravel 事件 laravel 队列 laravel 内置测试模块 laravel 广播系统 laravel 消息通知 composer 扩展包开发 php travis ci 可持续集成 swoole 深入学习 trait 的实际应用 php 代码分析工具 PHPStan 的研究与学习 laravel 最新版项目实战 deep learning 卷积网络预测股票涨跌 laravel-swoole laravel-admin
在 laradock 环境中使用 laravel-swoole 加速你的 laravel 应用
在 laradock 环境中使用 laravel-swoole 加速你的 laravel 应用。 安装laravel-swoole12composer require swooletw/laravel-swoolephp artisan vendor:publish --tag=laravel-swoole 开放 workspace 端口在 laradock/workspace/Dockerfile 最后添加一行: 1EXPOSE 1215 然后重新 build workspace 容器。 修改 nginx 配置123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657upstream swoole-http { server workspace:1215;}map $http_upgrade $connection_upgrade { default upgrade; '' close;}server { listen 80; listen [::]:80; # For https # listen 443 ssl; # listen [::]:443 ssl ipv6only=on; # ssl_certificate /etc/nginx/ssl/default.crt; # ssl_certificate_key /etc/nginx/ssl/default.key; server_name study.test; root /var/www/laravel-learn/public; index index.php index.html index.htm; location = /index.php { # Ensure that there is no such file named "not_exists" # in your "public" directory. try_files /not_exists @swoole; } location / { try_files $uri $uri/ @swoole; } location @swoole { set $suffix ""; if ($uri = /index.php) { set $suffix "/"; } proxy_set_header Host $http_host; proxy_set_header Scheme $scheme; proxy_set_header SERVER_PORT $server_port; proxy_set_header REMOTE_ADDR $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; # IF https # proxy_set_header HTTPS "on"; charset utf-8; proxy_pass http://swoole-http$suffix; }} 然后重启 nginx 修改 laravel env123SWOOLE_HTTP_HOST=workspaceSWOOLE_HTTP_DAEMONIZE=trueSWOOLE_HOT_RELOAD_ENABLE=true 启动 swoole1php artisan swoole:http start | stop | restart | resload 开发环境热更新调整 swoole_http 中 max_request = 1
在 docker 容器中安装 zend guard
在 docker 容器中安装 zend guard。 进入容器1docker-compose exec php-fpm bash 更新环境12apt-get updateapt-get install wget -y 下载文件1wget http://downloads.zend.com/guard/7.0.0/zend-loader-php5.6-linux-x86_64_update1.tar.gz 解压1tar -xzvf zend-loader-php5.6-linux-x86_64_update1.tar.gz 查看扩展路径在 php-info 中搜索路径: 1extension_dir 移动扩展包并使之生效12cp *.so /usr/local/lib/php/extensions/no-debug-non-zts-20131226docker-php-ext-enable ZendGuardLoader 安装成功重启环境。
在vue中使用laravel-permission的@can标签
1. 在需要权限校验的 model 中新增方法12345678910public function getAllPermissionsAttribute() { $permissions = $this->getAllPermissions(); $permission_names = []; collect($permissions)->map(function ($permission) use (&$permission_names) { $permission_names[] = $permission->name; }); return $permission_names;} 2. 在 app.blade 中存储当前用户的所有权限1234567<script> @auth window.Permissions = @json(Auth::user()->allPermissions); @else window.Permissions = []; @endauth</script> 3. 新建 vue component123456789<script> export default { methods: { $can(permissionName) { return Permissions.indexOf(permissionName) !== -1; } } };</script> 4. 在 app.js 注册 vue 组件12import auth from './components/AuthComponent';\Vue.mixin(auth); 5. 在vue中使用1<a v-if="$can('admin.admins.delete')" class="text-danger" @click="dataDelete(admin)">
