Laravel 5.1事件系统

事件系统有啥用?

  • 解耦,抽出与核心业务关联不大的代码逻辑
  • 异步执行耗时长任务,加快页面响应速度

事件使用样例

现在需要完成这样一件事,当一个图片被用户收藏到一个专辑内时,专辑的封面会自动根据最新的4张图片来生成一个新的专辑封面。因为所有的图片均存储在第三方云存储上,每次都需要下载回来4张图片,在服务器上处理后再回传到云存储上,所以采用Laravel的事件系统来做。

创建事件触发器

php artisan make:event imageAddedToAlbum

这个时候会在app/Events里面生成对应的imageAddedToAlbum.php文件,当然手工创建也可以

阅读全文 »

requireJS实战

为什么需要requireJS

  • 减少网络请求数
  • 压缩js, css减轻服务器负担(当然了,小站点压缩不压缩问题不大)
  • 混淆代码,增加扒站的成本

代码结构

├── build.js // r.js 配置文件
├── r.js // 分发工具
├── src //本地开发目录
│   ├── css
│   │   ├── website.css
│   │   ├── reset.css
│   └── js
│   ├── app
│   │   ├── some_page.js //页面内前端实现逻辑
│   ├── common.js // 通用配置
│   ├── config.js // 用于后端传递数据到前端
│   ├── some_page.js // requireJS 的data-main 域所指定的文件,此文件主要调用通用配置+上面具体实现的some_page.js模块
│   ├── lib
│   │   ├── jquery
│   │   │   └── 1.8.3
│   │   │   └── jquery-1.8.3.js
│   │   ├── layer
│   │   │   ├── extend
│   │   │   │   └── layer.ext.js
│   │   │   ├── layer.min.js
│   │   │   └── skin
│   │   │   ├── default
│   │   │   │   ├── icon_ext.png
│   │   │   │   ├── textbg.png
│   │   │   │   ├── xubox_ico0.png
│   │   │   │   ├── xubox_loading0.gif
│   │   │   │   ├── xubox_loading00.gif
│   │   │   │   ├── xubox_loading1.gif
│   │   │   │   ├── xubox_loading3.gif
│   │   │   │   └── xubox_title0.png
│   │   │   ├── layer.css
│   │   │   └── layer.ext.css
│   │   └── webuploader
│   │   ├── README.md
│   │   ├── Uploader.swf
│   │   ├── webuploader.css
│   │   ├── webuploader.custom.js
│   │   ├── webuploader.custom.min.js
│   │   ├── webuploader.fis.js
│   │   ├── webuploader.flashonly.js
│   │   ├── webuploader.flashonly.min.js
│   │   ├── webuploader.html5only.js
│   │   ├── webuploader.html5only.min.js
│   │   ├── webuploader.js
│   │   ├── webuploader.min.js
│   │   ├── webuploader.noimage.js
│   │   ├── webuploader.noimage.min.js
│   │   ├── webuploader.nolog.js
│   │   ├── webuploader.nolog.min.js
│   │   ├── webuploader.withoutimage.js
│   │   └── webuploader.withoutimage.min.js
│   ├── other_page.js
├── dist //线上分发的目录
│   ├── css
│   │   ├── website.css //多个CSS同时也会压缩成一个
│   └── js
│   ├── some_page.js // 将所有依赖压缩在此文件内
├── img // 图片目录
阅读全文 »

vsftpd虚拟用户配置

需求点

每一个站点目录,需要一个有一个独立的FTP用户可以访问,上传及修改代码,如下所示

/home/wwwroot/website1    FTP用户: website1
/home/wwwroot/website2 FTP用户: website2
/home/wwwroot/website3 FTP用户: website3

所需条件

  • 一个新建用户(这个是系统内真实存在的用户)
  • PAM(Pluggable Authentication Modules)(这个来生成多个不同的虚拟用户)

vsftpd 安装

sudo yum install vsftpd

默认centos 6.5下,安装的版本为2.2.2

阅读全文 »

程序员的呐喊小记

摘除书中的几点有意思的

  1. 大学毕业(或者高中毕业)的时候,你会有两个选择:要么继续深造,要么停止学习。
  2. 不想学习,因为学习很难。
  3. 自由派:all errors are warnings, 保守派:all warnings are errors.
  4. 菜鸟才需要代码着色
  5. 驱使大家去做正确的事的动因是感激,这超过了所有因素,甚至你所有的因素加在一起还要多。你会忍不住想做的更好,因为Google对你的照顾无微不至,让人觉得好像欠了它似的。
  6. 项目管理技术更需要润滑油而不是汽油。

使用xhprof对PHP代码进行性能分析

xprof PHP扩展安装

参考php常用扩展安装

xhgui 的安装

xhgui 在国内安装会有点小困难,需要折腾以下玩意:

  • composer 国内网络环境比较恶心,你懂的
  • mongodb 服务端,就是数据库
  • mongodb 客户端,就是php扩展
阅读全文 »

Nginx防CC攻击

什么是CC攻击

CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包,造成对方服务器资源耗尽,一直到宕机崩溃。

简单的Nginx防CC方式

使用nginx提供给我们的limit_req_module模块来限制单个IP的请求次数

实验

Nginx配置

http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
limit_req zone=one burst=1 nodelay;
}
}
阅读全文 »

入手ESL Podcast

关于收集癖好

大学那会儿,在学习到一个新的东西的时候,有一个现在看来非常不好的习惯,就是各种收集资料,把网上别人推荐的东西
全部下载回来,然后再开始学习。花好几个小时收集这些资料的过程是非常兴奋的,感觉像捡到宝似的。但是呢,等收集完就发现没过多久
学习就断了,木有再继续学习下去。木有错,这是病,得治。

怎么治

花钱治,尝试性的买了1个月的ESL Podcast来继续断了又学、学了又断的英语,$10/月,省去天天到处找最新版的下载地址,也不去折腾ESL前
几年出的Podcast 和那些需要money的文档,改掉收集的不良癖好。如果学到后面真的发现很有用,再花$60把原先的都买下来就是了。不折腾。

总结

戒癖保平安,花钱不折腾。望儿富二代,砖头搬起来。

一次laravel权限排错过程

问题

因为是使用vagrant开发,代码目录的挂载情况是这样子的:

~/Documents/dev/meitubar[物理机] <=> /home/wwwroot[vagrant虚拟机]

无论在虚拟里面如何chmod或chown都无法改变app/storage的权限和归属,后面直接用将物理机的目录修改成777,权限终于是变了,但是在Laravel的
app/storage/sessions 里面新生成的文件,照样没有写入权限,表示很无奈。

排查

第一步

首先看下nginx的执行用户是谁

[vagrant@localhost app]$ sudo lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 4253 root 7u IPv4 19510 0t0 TCP *:http (LISTEN)
nginx 4255 www 7u IPv4 19510 0t0 TCP *:http (LISTEN)
nginx 4256 www 7u IPv4 19510 0t0 TCP *:http (LISTEN)
nginx 4257 www 7u IPv4 19510 0t0 TCP *:http (LISTEN)
nginx 4258 www 7u IPv4 19510 0t0 TCP *:http (LISTEN)
nginx 4259 www 7u IPv4 19510 0t0 TCP *:http (LISTEN)

第一个进程为nginx的Master进程,下面5个为Worker进程
5个Worder进程,可以在nginx.conf里面配置 worker_processes 5; 来调整worker的数量
关于master 与 worder 可以参考初探nginx架构

阅读全文 »

14已死15起舞

2014

年底了,是时候总结下这一年来做的事情了。

  • 跳槽到ND
  • meitubar 开发持续进行中,已开发3月有余
  • 开始早起
  • 中断几个月的练字重新开始,早起第一件事就是练字半小时,很有效的防止了拖延症的影响
  • 平潭走了一回
  • Mac book pro retina 入手
  • 养成购买正版软件及游戏的习惯
  • 见了未来的岳父
  • 入手独轮车
  • 开始锻炼【可耻的又断了】
  • 认真把日常所学整理到blog上
  • 学习和使用Laravel,主要是配合meitubar的开发
  • 带她入了前端的深坑
  • PHP 更加熟悉,但是理解不深,一个熟练工罢了
  • 入了Linode JP 服务器,学习与折腾都上到一个层次
  • 被多年不联系的同学,骗走千把块钱,记下,给自己长个记性

2015

稍稍展望下2015

  • 有一个自己的开源项目
  • meitubar 上线并迁移到国内服务器
  • 学习一个编译型的语言,暂定Golang
  • 早起、锻炼、练字,这三项基本国策认真落实
  • Make more money,有钱才能干更多的事,不是么?
  • 到一个更远的地方游一把,她已经都提了N次的济州岛了
  • 买个Mac air + Ipad 给她
  • 提升服务器管理技能
  • 多和朋友联系
  • Web 安全学习,基础的攻防要明白原理
  • 学习算法
  • 捐助贫困儿童,这个想法来源于这篇帖子的11楼:今年你都败了什么提升幸福感的东西?
  • 考驾照
  • 结婚【这个应该是最难的】

一步一个脚印,2015 走起…

vim折腾记

原因

公司机器自从安装了Mac Yosemite后,就略卡了,虽然配置挺OK。平时都用强大的phpstorm,这玩意确实非常棒。但是无奈卡,尝试着先换MacVim来写代码。

插件管理

使用Vim必不可少的是从海量的Vim插件中寻找适合自己的,那么这个时候对vim插件进行管理的插件就非常有必要了。

关于这3个插件管理器的区别可以参考这里:what are the differences between Vundle and NeoBundle?

按照发展的时间排序:pathogen -> vundle -> neobundle
当然了vundle和neobundle都在迅速的发展中,目前使用vundle来管理插件,相当的方便,具体的安装方法参数 上面的github地址,说的都非常清楚了。

阅读全文 »