《Legends of the Fall(燃情岁月)》在IMDB上并不是一部高分电影(7.4),但在豆瓣上排进了Top 200(现在是No.104),在观众中的评价也比较分裂,喜欢的人认为这是一部非常优秀的史诗电影,其对于人内心世界的探索非常深刻;而不喜欢的人则对片中主要角色之间的感情纠葛表示不能接受,不认同其表达的价值观。

先按下三兄弟对一个女人这种比较混乱的爱情不表,这部电影是很优秀的,2个小时讲了一个完整而有深度的故事,加上超一流的配乐(The ludlows),全片掌握有度的节奏,结局的高潮和优秀剪辑,没有毛病。主要的争论在于观众对于电影所要表达的价值观的解读。

首先,我们说《燃情岁月》是一部史诗片,史诗并不一定是它场面宏达,故事宏伟,要讲述英雄人物的历史命运,《燃情岁月》只讲述了20世纪西部草原三个兄弟的故事,但它的时间跨度大,以小见大讲述了这段时间世界价值观念的变化,同时借力印第安人元素探索人物的内心世界。

影片基本讲述了主角三兄弟的一生,很多人看完觉得故事很荒诞,怎么会有这样的人生:三兄弟Alfred, Tristan, Samuel在大草原无忧无虑一起长大,手足之情不用多说,但是老三Samuel的未婚妻的到来让alfred和tristan都内心骚动了(感情大草原只有Susannah一个适龄女青年了?),狗血不,就问你虐不虐。更虐的是,老三一心要去参加一战保卫文明世界,两位大哥陪着去保护老三,结果老三惨死异乡,这就有点尴尬了。先回家的Alfred按耐不住和Susannah说,“虽然 Samuel死了,虽然你不能像爱Samuel一样爱我,但是我们在一起应该能过得很幸福”,这是什么逻辑我是没看懂了。但是女主Susannah其实一开始见到老二Tristan的时候就有点来电,而初见Alfred的时候他们对于改革的思想分歧可以看出Susannah和Alfred不是一个世界的人。Tristan从战场回来之后,和女主迅速走到一起,老大Alfred只能离开家去城市发展。

大概的感情纠葛就是这样,是有那么一点狗血和不现实,但是电影所以这么拍,很多时候并不是只考虑在现实世界可不可能发生,更重要的是创作者想要表达什么样的主题。往大了讲是传统价值观和新世纪价值观的冲突,但这太空洞相当于什么都没说。只看这几个人的感情,大概可以看出来,作品要表现的大概是感情,或者爱情最原始的状态是什么,抛去”文明世界”对于爱情的探索越来越复杂的理性外衣,感情就是荒诞的,对于一个人同时爱上多个人,多个人爱上一个人这种似乎是荒诞的事情,其实没有什么荒诞的了,至甚认为这样很荒诞的文明社会不是更荒诞一些?

感情线来说,Susannah和Alfred结婚了,Alfred成为了国会议员,Tristan回到草原和小Isabel结婚安定下来。看似风光无限,但Susannah终究和Alfred不是一个世界的人,最终剪发后饮弹自杀,而Isabel也因中了流弹而死去。最终最美好的那些人都埋葬在了大草原。

很多人喜欢这个电影是迷上了Tristan的放荡不羁和追求自由的狂野,一味称赞这样的品质,恨不能自己也能像Tristan那样放荡不羁爱自由一回,但是通常画风一转就开始批判Tristan的不负责任。我们是生活在社会中的一员,不可能像Tristan那样不负责任的,虽然Tristan多受神的眷顾,但是他的一生却为他的不羁付出了惨重的代价,包括Susannah的悲剧,Isabel的死。很多人都认为自己的心中也有一头熊,代表自己要追求的野性,代表自己未泯的自由向往,但是他们却很早就没有考虑过自由的代价了,心中的那头熊早已死去了,却一直安慰自己还能追求自由。其实,看起来Tristan是放荡不羁追求自由的,实际上,更多的是也逃避。放不下Samuel的死,负担不了Susannah的爱,有些东西无法承受了,便以自由的名义逃避。现实中这种逃避有的是自杀,有的是抑郁,有的是隐姓埋名,有的是Tristan的离家出走。Tristan回到家的那刻代表他不再逃避了,愿意承担某种责任了,但是物是人非这样的事情总是会发生的,所以就有那么多的悲剧了。

Tristan抛弃Susannah出去“探究内心世界”的时候,Alfred回家正好看到Susannah收到Tristan的信说“all we had is dead as i am dead”那一段,Alfred对Susannah说:“Susannah, you deserve to be happy”。实际上,我们认为那些 deserve to be happy 的人过得并不那么happy。

之前一直使用shadowsocks-qt5的ss客户端,但是最近不知道怎么回事,一启动它过几秒就崩溃,重装也没有效果,只好写两个脚本控制了。

首先需要安装sslocal的包:

sudo dnf install python-pip
sudo pip install shadowsocks

安装了shadowsocks后就可以用 sslocal命令来连接shadowsocks服务器了,还需要一个关闭连接,我们可以使用ps -aux|grep + kill -9 pid 来实现。具体的脚本见下:

启动脚本

启动要考虑关闭之前存在的连接,并且我的sever同时有ipv4和ipv6服务,可通过命令行参数选择连接到ipv6。具体脚本如下:

#! /bin/sh

ip=*7*.***.*7.*7
ip6=2**:f7**:4*:c**::****:****

if [[ $# -eq 1 && $1 -eq 6 ]]; then
ip=$ip6
fi

# close existed sslocal proc
# may need change the path, or add bash to PATH
~/bin/bashes/close-ss
echo "connecting at $ip"
sslocal -s $ip -p 18989 -l 1080 -k password -t 600 -m aes-256-cfb &>>/path/to/log/ss.log &

echo "done with: $?"

在连接脚本中使用了关闭功能,因为对于一个新的连接需要先关闭之前的连接

关闭连接

关闭连接使用ps查找到pid,再调用kill关闭进程,也可以将pid写到一个文件,都差不多,具体如下:

#! /bin/sh
procs=`ps aux|grep sslocal`
count=`echo "$procs"|wc -l`

if [[ count -eq 1 ]]; then
echo "no ss-local runs"
exit;
fi

pid=`echo "$procs"|head -1 |awk '{print $2}'`
echo "closing by pid: $pid"

kill -9 $pid

if [ $? -eq 0 ]; then
echo "result: success"
# clean log file
: > /path/to/log/ss.log
else
echo "fialed to close sslocal"
fi

++ update @2017-02-10 ++
关闭sslocal的时候,之前使用的是ps+grep找出pid,实际上可以用pgrep更快更方便地找出来,更新后的代码如下:

#! /bin/sh
procs=`pgrep sslocal`
if [[ -z $procs ]]; then
echo "no ss-local runs"
exit;
fi

for pid in $procs; do
echo "closing by pid: $pid"
kill -9 $pid
done

if [ $? -eq 0 ]; then
echo "result: success"
: > ~/tmp/ss.log
else
echo "fialed to close sslocal"
fi

可以将两个脚本的目录放到 PATH 里面,分别命名为sssclose-ss,这样就可以通过下面的命令启动和关闭shadowsocks的客户端了:

# 启用默认ipv4连接
sss

# 启用ipv6连接
sss 6

# 关闭连接
close-ss

还是很方便的。

最近忙些什么呢
追了几部剧
新出的《西部世界》是一部科幻剧
大有要超越《权力的游戏》的潜力
权力的游戏到第六季已经显得有点力不从心了
没有了马丁大爷的帮助,编剧在很多地方出现漏洞
尤其是龙母线,已经崩坏得厉害
很多情节都莫名其妙,高庭线,北境线,沙蛇线基本全线崩坏
GOT已经不再是曾经的神剧了,现在看来极有可能烂尾
当然不会像其他剧那样的烂尾,HBO还是能保证基本的水准的
只是相比前三季,没有原著支撑后,水平下降的厉害
而新出的这个西部世界,设定极其宏大,要探讨的问题也很深邃
从第一集的水准来看,具备成为下一部神剧的基础
可以期待一下

另外补了英剧《Black Books》
这个剧之前看过一两集
最近再看,发现非常精彩
经典的英式喜剧,有点 IT 狂人的味道
其实前两周还看了两集TBBT(The Big Bang Thoery),第九季
从第五季后就没追TBBT了
TBBT真的是烂尾的厉害,卖萌耍宝,偶尔还能出一两个段子
但整体水平不行了,赶紧结束这个系列吧
一般来说,很少有超过6季还能保持水准的
Black Books基本能从头笑到尾,三季的长度也很合适
英剧的幽默和美式喜剧还是很大区别的
美式情景喜剧,老友记是巅峰,其实看多了也挺没意思的
最有英式风格的大概是《30 Rock》,但是总觉得那个系列有点恶俗
补完了《Black Books》第一季,有点意思

十一还做了两件事
终于学了一下tmux,这也是一个神器
之前一直想学来着,终于花了一两天系统性地学了一下
之前对于终端复用器的理解一直不太对
这几天都是基于tmux工作,简直不要太舒服,不要太便利!
Nice Tool
喜欢终端的用户一定不能错过tmux
另外还用上了moc,music on commandline
虽然fedora下网易云音乐也可用,但播放本地音乐的能力有点弱
我还是喜欢本地音乐的,百来G的曲库的样子
moc搭配上tmux操作起来不要太方便!
还开始学了Bash,之前面百度的时候让手写一个脚本
没写出来。。因为记得不清不楚
这几天就系统地学一下经典的abs教程
嗯,以后可以用Bash做更多事情了

终于挤牙膏样挤完了《万历十五年》第二遍
这本书对我影响还挺大的
作为一个明粉,一定要多看几遍
十一开始看《枪炮,病菌与钢铁》这本书
在书架摆了几个月了
这本书副标题起的那叫一个大《人类社会的命运》
另外一本起的这么大的只有《失控》了吧
不过确实讲的是大问题,人类社会演进的方向问题
听上去就很厉害,看了几章,确实有点意思

最近心情不太好,开始抽烟
抽的是博哥推荐的一种很淡的细烟
很淡很淡,抽完一根万宝路,再抽这个,完全没有冲劲,很好
基本一天一根的样子
这几天有点感冒,一天两根的样子

放假放得面试的东西都忘记了
睡觉睡得天昏地暗
假期结束又得面试了
找工作好难
哦,前几天还去了Offer寺
当然不是我迷信,这只是《仪式过程》所讲的仪式的一部分,嗯

之前写了一片重新装了一个fedora 24的博客,那次装的时候为了系统速度比较快,把fedora装在了SSD上面,但我用的还是几年前买的三星的120GB的SSD,容量是捉襟见肘啊,只能从原来的windows系统分了35GB的空间给fedora,使用fedora自动分配后,挂载的可用空间只有29GB了,随着系统用的越来越久,剩余空间也就越来越少了,到现在只有10多G的可用空间了。幸好装Fedora的时候使用的LVM,这样可以很方便的进行扩容了。

Shrink Windows Disk

首先从windows的分区压缩一些空间出来,当然LVM是支持从不同磁盘扩容的,但是为了速度还是从SSD中压缩空间吧,这样window留70G左右,剩余40G给fedora,能压出来15G左右(因为影音类文件都放在另一个硬盘,所以45GB左右的linux空间可以用比较长时间了)。
但是windows压缩空间有一个限制,那就是使用系统的压缩空间时,如果有一些不可移动文件占据了空间,那就只能从没有这类文件的位置开始压缩空间。。也就是说虽然C盘有30G的剩余空间,却不能压缩出30G,像我的情况就只能压缩出6G。。。这时候可以自己捣鼓也可以使用一个软件 AOMEI Partition Assistant 进行扩容,使用非常方便。但是!有一个问题,那就是需要重启进入一个XXX PreOS的界面自动重新分区,双系统重新分区后。。会导致Grub引导失效,只能进入 Grub Rescue 界面。

修复引导

还好Grub的修复还是有很多路子的,也许可以从Grub Recue中捣鼓,但是更方便的做一个Fedora Linux进入系统重新安装grub。

阅读全文 »

外部排序笔记

nothing here

大概两年前用过很长一段时间的fedora+win7的双系统,最早用的fedora版本还是14、15的样子,长期使用过18-20,后面几代都只在虚拟机里试玩了一下,因为配置起来一套顺手的桌面其实很麻烦,f24之后一直想再装一下fedora,在virtual box里面玩了一会觉得太卡就决定装双系统,花了两天时间基本弄得顺手了。

在今年,我的windows下的工具大多更换了,从印象笔记到为知笔记,同步使用了坚果云,音乐一直是网易云音乐,幸好这些工具都有linux版本的,装起来倒也不太费事,使用也还顺手。配置这个系统主要是一下几个方面:

  • gnome shell theme. 就是gnome的主题,包括gtk主题,shell主题,图标等等,我现在使用 zukitre的gtk+主题, shadow的Icons, OSX-EICap的cursor, Zuki-shell的shell theme。这些都是在gnome-tweak-tool里面配置
  • gnome-extension. 就是gnome-shell的扩展,这个非常重要,gnome的扩展性非常强,一些常用的扩展可以极大的方便操作,最常用的包括:applications menu, background logo, caffeine, coverflow alt-tab, dynamic top bar, launch new instance, media player indicator, openweather, place status indicator, simple dock, suspend button, topiconcs, user themes等
  • 输入法,切换到fcitx和rime,除了sublime外基本都可以正常使用
  • 工具类:网易云音乐,坚果云同步,为知笔记,WPS,mysqlworkbench, chrome,shadowsocks,vlc player,Atom, 甚至texstudio都有很好的支持
  • 鼠标手势,在windows下习惯了 Wgesture的全局手势,一开在fedora下很不习惯,后来找到一个开源的 easystroke gesture recognition的软件,使用和Wgesture基本差不多,非常非常方便
  • 使用Roxterm替换gnome的terminal,roxterm是我最喜欢的一个终端工具,定制之后非常方便

最后的效果:

下面是安装时记录的一些问题,确实从头开始配置各种工具容易遇到非常多的问题,这里也是遇到一个记录一下,记得比较乱也不整理了,到时候再遇到能找到就可以了:

阅读全文 »

最近公司部署在阿里云上的服务器被恶意攻击了,大概几百台肉鸡不停地向某个接口发送请求。由于一些各种原因,过多的请求导致服务器CPU占用率几乎是一直在100%。虽然应用勉强还能使用,但是这样被请求服务器真是压力非常大。

由于公司现在还没有专职的运维去处理这些请求所以只好自己动手先做一些限制,大概两个思路:

  1. 对接口的请求限速
  2. 2.封禁一批IP

基础环境

先记录一下服务器的基本环境,双核,4G内存,Ubuntu 14.04,现在的web server是lighttpd,数据库是mysql。

接口限速

由于现在部署的代码使用旧的框架,本身没有对接口限速的功能,只能从web server方面入手。

现在的web server是lighttpd,lighttpd的特点是轻快,内存占用小,但是模块化不是很好,似乎在lighttpd上面做 rate limiting 不是那么方便,我觉得可以使用使用一个围魏救赵的方案:

搭建一个nginx作为前端server,在nginx这里做rate limit,nginx把请求发送到lighttpd,lighttpd不对外暴露端口,只接受来自nginx的请求。

在lighttpd的配置文件(/etc/lighttpd/lighttpd.conf)中加上

server.port = 80001

重启lighttpd,记得在防火墙中Drop所有8001端口的请求。

安装好nginx(推荐编译安装openresty)后,配置转发如下:

upstream lighttpd {
server 127.0.0.1:8001
}

server
{
...
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://lighttpd;
}
}

启动nginx后,原来所有的请求都会发送到nginx了,而对用户来说,感觉不到任何的变化。

有了nginx之后我们可以使用 ngx_http_limit_req_module 这个模块做限速了,具体内容可以参考nginx的文档。

定义限制请求域

rate limit首先要定义一个或多个zone,然后在特定的context使用它们。这些定义一般定义在http上下文中。

http {
## 对每一个IP的请求限制为1次每秒
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;

## 对一个server_name下的请求限制为10次每秒(这个数值有点低,一般会改大很多)
limit_req_zone $server_name zone=perserver:10m rate=10r/s;
}

使用请求限制

可以在 http, server,location 上下文使用上面定义的域,使用方法如下:

server {
...
limit_req zone=perip burst=5 nodelay;
limit_req zone=perserver burst=10;

location /api {
limit_req zone=perip burst=3 nodelay;
}
}

限速的配置是可继承的,当前级别没有配置就会从父级配置中继承:

These directives are inherited from the previous level if and only if there are no limit_req directives on the current level

关于 nodelay的配置,说明如下:

If delaying of excessive requests while requests are being limited is not desired, the parameter nodelay should be used

IP 限制

第二个思路是找出频繁请求的那些IP,在防火墙或者 web server 级别做限制,拒绝它们的请求。

首先通过请求日志(access_log)找出请求次数最多的前50个IP:

awk '{print $1}' /path/to/web-server-log/access.log | sort|uniq -c | sort -nr | head -n 50

我只是在nginx或者lighttpd层做限制,iptables在我手上很容易玩坏,不是很熟悉,就在web server做配置了:

nginx限制IP访问

nginx的配置很简单,在指定上下文deny掉指定的IP就可以了,如下:

location / {
deny 192.168.1.2;
allow 192.168.1.1/24;
allow 127.0.0.1;
deny all;
}

lighttpd限制IP访问

lighttpd的限制也非常方便,只不过要先对上面获得的50个ip做一些简单的处理,然后在ilghttpd.conf中加入下面的配置:

$HTTP["remoteip"] != "1.231.2.1|23.24.54.213|ip-3|ip-4|more-ip" {
url.access-deny = ( "" )
}

总结

第一种方法应该是更好的,或者说是必须的,但是我调了一下,限速的参数可能调太小了,导致正常的访问都不太好用了,之后需要继续调优参数。

第二种限制IP的方法也可以有,可以用一个计划任务隔一段时间就跑一批IP扔到禁止列表中,不过要是能加到iptables中,对服务器的压力就更小了,这个后面可以尝试一下。

命名空间

按照PSR的标准,应该是一个文件对应一个类,并且命名空间与文件系统路径一一对应,这样便于理解。但是也允许一个文件有多各类,甚至一个文件有多分命名空间,一个命名空间也可以分散在不同的文件/文件夹中,这都是允许的,但是不是推荐的做法。

因为命名空间和文件系统的对应关系是通过自动加载(auto_load)定义的,只要定义的spl加载器能找到要引用的类的实际文件就可以正常运行,但是最好不要使用违反PSR标准的命名空间。这不利于源代码的管理和调试。

面向接口编程

接口是两个对象的共同遵循的规约,它使得对象不在依赖于另一个对象是什么,而只依赖于它能做什么。面向接口使得我们能使用那些实现了某种接口的第三方代码。这样我们不需要知道第三方代码是怎么实现的,只要知道它们能做那些事就可以了。

Traits

Traits是PHP 5.4 引入的新特性。最初看到这个概念的时候觉得有点困惑,因为其他的语言基本没有traits的概念(Ruby有相似的概念)。Traits用来实现更细化的代码复用,它的行为更像类,但是看起来很像接口,但它并不是类或者接口。

Traits可以看作是类的部分实现(partial class implementaion),它能被用于多个PHP类中。在类的内部使用 use 关键字引入traits即可以把traits实现的功能加入该类中。

traits用来解决经典单继承模型难以解决的问题:两个不存在关联的类共享相似的行为。通过复杂的类型设计或者模式可以实现,但是这样的类型系统通常要非常复杂不利于理解,因为要为两个不相关的类设计一个本不存在的祖先类,而traits可以非常方便的在两个不相关的类中共享实现:通过把trait引入类中就可以了。

traits的使用和类很相似,通过trait关键字定义:

trait GeoTraits {
protected $lnt;

public function getLnt() {
...
}
// trait implementation
}

直接在类中使用traits:

class GeoClass {
use GeoTraits;
// other parts of this class
}

traits、类和接口都通过use关键字引入,不过traits是在类的内部引入,作为类实现的一部分使用的。

tratis的使用更像是一个预处理过程,PHP解释器会在编译期直接复制traits的内容到类中,解释器并不能保证这一行为不会导致代码的不兼容。所以要注意,如果在traits中使用了不是在trait中定义的属性或方法(即是定义在使用trait的类中的属性或方法)时,要保证这些属性或者方法是存在的。

Generators

Generator是PHP5.5引入的特性,到现在还很少被使用。Generator可以看作一个简单的遍历器(iterator)。generator不需要实现Iterator接口,而是在需要时计算、产生(yield)遍历的值。PHP的遍历器是实现计算好的数据集,而generator是在使用时返回值的,对于大量的数据集这样可以节省很多开销。

注意generator是一个只能遍历一遍的单向遍历器,不能回退,不能直接定位到某个元素。generator就是一个使用了yield关键字的普通函数。这个函数可以使用一次或者多次yield

function simpleGenerator() {
yield "val1";
yield "val2";
yield "val3";
}

foreach simpleGenerator() as $val {
echo $val;
}

调用一个generator函数会返回一个Generator类的对象,这个对象能使用foreach遍历,在每一次遍历中,generator会计算下一个值,因为是在请求值时才计算下一个返回的值,所以在处理很大的数据集时,generator并不需要使用很多的内存。比如:

function rangeGenerator($len) {
for ($i=0; i<$len; $i++) {
yield $i;
}
}

foreach (rangeGenerator(1000000) as $i) {
echo $i, PHP_EOF;
}

这里就并不需要分配一个 1000000 大小的数组,generator也可以用来读取大文件,而不是把整个文件读入内存中,下面是读取一个csv文件的示例:

function getRows( $file) {
$handle = fopen( $file, ' rb' ) ;
if ( $handle === false) {
throw new Exception( ) ;
}
while ( feof( $handle) === false) {
yield fgetcsv( $handle) ;
}
fclose( $handle) ;
}

foreach ( getRows( ' data. csv' ) as $row) {
print_r( $row) ;
}

其中fgetcsv是php提供的函数。

在有些时候generator能简化一些任务,当然不实用generator也可以实现所有的功能。

Closure/闭包

闭包和匿名函数都是PHP 5.3中引入的。然而很多开发者现在仍很少使用php的闭包和匿名函数。可能这些特性看起来就比较复杂吧。

php的闭包和js的闭包很相似,可以用相同的思路去理解。匿名函数其实是比较常见的,匿名函数可以被赋给一个变量,或者像一个对象一个传递。匿名函数常用来作为方法的回调。

闭包和匿名函数本理论上是两个不同的东西,但是PHP中把它们混为一谈了。PHP的闭包和匿名函数使用相同的语法,它们实际上是伪装为函数的对象,它们都是 Closure 类的实例, 闭包是一等值类型,就和 String和Integer一样。

PHP变量后面使用 () 时,如 $var() 这样的调用会尝试调用 __invoke() 魔术方法。

前面说过,匿名函数常作为方法的回调参数,如 array_mappreg_replace_callback()

PHP中的闭包使用和JS有很大不同,虽然都是闭包的理论。PHP的闭包需要使用 bindTo() 方法或者 use 关键字使用。PHP的闭包有一个状态附着(attach state)的概念,也就是必须手动将状态/变量(state)附着到一个闭包对象上(使用闭包的bindTo()方法)。一种更常用的方法是使用use关键字。

function enclosePerson($name) {
return function ($doComande) use ($name) {
return sprintf('%s %s', $name, $doCommand);
};
}

$clay = enclosePerson('Clay');
echo $clay('get me sweet tea');

从上面可以看出,需要手动将变量绑定到闭包中才可以在闭包内使用外部的变量。这和JS很不一样。上面的函数返回的是一个 Closure 对象实例,所以 $clay 有自己的属性和方法,常用的如 __invoke()bindTo() 方法。 bindTo方法有一些特殊的用法,如可以讲一个闭包对象绑定到另外的对象上。这样闭包可以访问该对象的成员对象(包括protected和private)的。

在PHP框架中的路由映射中常用bindTo方法,将匿名的路由回调函数绑定到应用对象(application object)上。

OPcache

从PHP 5.5开始集成了字节码缓存,那就是Zend OPcache。字节码缓存会存储预先编译的PHP字节码,这意味着解释器不需要在每次请求的时候都去读取、解析和编译PHP代码,而是直接读取预编译的字节码直接执行,这可以节省很多时间开销,提升性能。

旧的PHP默认没有开启OPcache,使用 --enable-opcache编译选项开启,然后在php.ini配置中,添加扩展: zend_extension=/path/to/opcache.so。注意如果需要使用xdebug的话,需要将opcache在xdebug之前加载。

OPcache的常用配置项包括

# 在开发环境这个选项设置为1,生产环境可以设置为0
opcache.validate_timestamps=1
opcache.revalidate_freq=0

内置Web Server

php -S localhost:4000

在项目目录使用上面的命令,可以启动内置的服务器

  1. 关于路由,见一个请求转发到控制器:
Route::get('/', function () {
return view('welcome');
});

// Controller_Class_Namw@function
Route::get('user/info', 'UserController@info');

// or as:
// Route::get('user/info', [
// 'as'=>'userinfo', 'uses' => 'UserController@info'
// ]);

Route::get('phpinfo', function() {
return phpinfo();
});
  1. Controller需要使用命令生成,不能自己新建文件生成:
php artisan make:controller nameController --plain
  1. 获得某个Route的url: $url = route('userinfo'),参数为路由别名。或者使用action方法,获得控制器下action的连接,$url = action('UserContrller@info'); Route::currentRouteAction() 可以获得当前的控制器和行为(action)
  2. 在 Route 中可以指定中间件,使用 middleware 键指定控制器的中间件,也可以在控制器的构造器中指定中间件: $this->middleware('auth');;
  3. Laravel提供隐式控制器,通过单个路由处理控制器的各种行为,有点类似于Yii的默认路由。 Route::controller('user', UserController); 不过要在控制器中加入方法,方法的名称应由它们所响应的 HTTP 动词作为开头,紧跟着首字母大写的 URI 所组成, 如 getIndex 会处理 get 请求的 index(默认) 动作。

这两年买了不少书,现在有的和正在看的一些书在这里列个清单。

外语

  1. 《大家的日语》 第一册 外研社
  2. 《标准日本语》 初级
  3. 《日语学习入门》
  4. 《赖世雄经典英语语法》

IT

  1. 《Python基础教程 第2版》 邮电出版社
  2. 《深入浅出NodeJS》 邮电出版社
  3. 《数据结构与算法分析–C语言描述》 机械工业出版社
  4. 《数据库系统基础教程》 机械工业出版社
  5. 《白帽子讲Web安全》 电子工业出版社
  6. 《MySQL入门很简单》 清华大学出版社
  7. 《计算机网络 第5版》 谢希仁 电子工业出版社
  8. 《Vim使用技巧》 邮电出版社
  9. 《精通正则表达式》 电子工业出版社
  10. 《人月神话》 清华大学出版社
    阅读全文 »