Composer 对于每个包的版本都会进行稳定性检查,而低于设置的 minimum-stability 最低稳定性版本的包将不会被安装。

例如,当我们在项目中想要依赖一个尚未发布稳定版本的包时候通常会:"vendor/library": "*", 乍看上去并没有什么不妥, 但是当我们执行 composer install 或者 composer update 去下载包的时候通常会报错。

这是为什么呢?

通常我们的 composer.json 都不会显式的去设定 minimum-stability, 那么 composer 就会把他默认为 stable.

那么对于一个尚未发布版本的包来说, 明显是不符合的. 所以安装就不会成功.

所以有两个途径来解决:

  1. 设定 minimum-stabilitydev

显然这是简单粗暴的, 但是这种方法所面临的问题也很严重. 那就是我们去依赖某些开发版中的包, 这显然是我们所不想看到的.

  1. 指定依赖包的版本, 这也是最佳的解决方案
1
composer require vendor/library=dev-master

所以, 当我们尝试去依赖一个开发中的包时, 推荐使用第二种方法!

另外我们还需要知道 minimum-stability 所支持的有:

  • dev
  • alpha
  • beta
  • RC
  • stable

注意: git reset --hard会彻底删除你的变动,你可以在这之前使用 git stash 来保存变动。

1
git reset --hard HEAD~1

HEAD~1代表当前提交之前的一次提交.

或者使用 git log 找到你想revert的commit_id:

1
git reset --hard <sha1-commit-id>

如果你已经提交到了远程仓库, 可以通过以下命令来抹掉提交:

1
git push origin HEAD --force

本文讲讲用composer来进行本地开发包,和本地公用包的使用.

概要

当我们构建一个本地的类库时, 当并不想推送到packagist, 我们可以使用repositories > path

来处理。

以下目录结构为例:

1
2
3
4
5
6
- apps
\_ my-app -- 当前项目开发目录
\_ composer.json
- packages -- 本地共有库, 存放正在和已经开发好的类库
\_ my-package -- 一个叫 my-package 的类库
\_ composer.json

现在我们要在 my-app 中依赖 my-package, 那么现在我们可以:

  1. 配置 my-app/composer.json
1
2
3
4
5
6
7
8
9
10
11
{
//引入依赖
"require": {
"myrepositry/package1": "*@dev"
},
//配置 repositories
"repositories": [

{"type": "path", "url": "../../packages/my-package"}
]
}
  1. composer update

接下来就是在 my-app 目录下执行 composer update, 来使之前的配置生效!

执行成功后, 我们可以到my-app/vendor 目录下查看, 我们可以看到该类库已经加入到 my-app/vendor 了!

之后在 my-package 任何改动后我们需要在 my-app 中执行 composer remove myrepositry/package1 来移除,

然后在require进来.

1
2
3
4
5
6
7
8
9
class Test
{
private $prefix = 'Hello ';

private function hello($name)
{
echo $this->prefix, $name, PHP_EOL;
}
}

第一种方式:

1
2
3
4
$class = new \ReflectionClass(Test::class);
$method = $class->getMethod('hello');
$method->setAccessible(true);
$method->invoke(new Test(), 'Light');

第二种方式:

1
2
3
$class = new \ReflectionClass(Test::class);
$method = $class->getMethod('hello');
call_user_func($method->getClosure(new Test()), 'Light');

关于Hashids

Hashids 是一个将数字生成唯一且不连续的短码的库, 被封装了好多语言版本的库。

详细: http://hashids.org/php/

使用

1
2
3
4
5
6
7
$hashids = Yii::createObject([
'class' => 'light\hashids\Hashids'
]);

$id = $hashids->encode(100123123);
$origin = $hashids->decode($id);
var_dump($id, $origin);

详细

这个支持最长20个字的名字,只要不是空格的都当有效,取出来之后再验证是否有效用户名

1
/@[^\s]{1,20}/

如果不限长度

1
/@[^\s]+/

如果用户名只可能是英文下划线和数字

1
/@[a-z0-9_]+/i

如果还有可能是中文

1
/@[a-z0-9_\u4E00-\u9FA5]+/i/

现版本:5.5.21

更新版本: 5.6.10

查看原来安装的配置参数

执行php -v | grep config

安装

根据之前的安装配置执行:

1
2
$ ./configure --prefix=/usr/local/php5/ --with-libxml-dir --enable-cli --enable-fpm --with-mysqli --with-gettext --enable-mbstring --with-mcrypt --with-openssl --disable-debug --enable-opcache --with-pdo-mysql --with-mysql
$ make && make install

剩余工作

安装成功后, 并不意味着升级工作完成了。当我们运行 php -v 时会有错误抛出, 那是因为两个版本的扩展编译标示前后不一致,所以我们接下的来的工作就是重新编译扩展。

path/to/php5/lib/php/extensions 目录下有两个文件夹: no-debug-non-zts-20121212/ (之前版本扩展安装目录) 和 no-debug-non-zts-20131226/ (新版本扩展安装目录), 由于新升级的PHP的标示是 20131226 , 所以对应的扩展编译也要对应上。

例如, 我之前的扩展源文件目录 /usr/local/src, 我们并不是直接在之前安装的扩展目录中直接配置编译安装就可以了, 我们需要删除原来解压出来的文件, 重新解压扩展源文件, 进行扩展安装:

1
2
3
4
5
6
7
//例如重新编译安装 Imagick
$ rm -rf imagick-3.1.1
$ tar -zxvf imagick-3.1.1.tar
$ cd imgick-3.1.1
$ path/to/php5/bin/phpize
& ./configure --with-php-config=/path/to/php5/bin/php-config
$ make && make install

接下来最后就是修改 php.ini 中的 extension_dir 为新的目录.

将php加入环境变量: export PATH=$PATH:/usr/local/php5/bin

完.

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

在使用left jion时,on和where条件的区别如下:

  1. on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

  2. where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

假设有两张表:

表1 tab1:

1
2
3
4
id size 
1 10
2 20
3 30

表2 tab2:

1
2
3
4
size name 
10 AAA
20 BBB
20 CCC

两条SQL:

1
2
3
1. select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’

2. select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)

第一条SQL的过程:

1、中间表 on条件:

1
2
3
4
5
6
7
8
9
10
11
12
13
tab1.size = tab2.size  
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
2 20 20 BBB
2 20 20 CCC
3 30 (null) (null)
2

再对中间表过滤where 条件:

tab2.name=’AAA’
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA

第二条SQL的过程:

1
2
3
4
5
6
7
1、中间表 on条件:   
tab1.size = tab2.size and tab2.name=’AAA’
(条件不为真也会返回左表中的记录)
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
2 20 (null) (null)
3 30 (null) (null)

其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

参考

现在需求是:如果用户已经登录,但是超过一定时间未操作「比如5分钟」,当用户再次进行操作时则需要重新登录

我们可以通过配置 yii\web\User::$authTimeout来达到效果,上代码:

1
2
3
4
'user' => [
'identityClass' => 'app\models\User',
'authTimeout' => 5 //为了测试,设置5秒
],

还有一个更设定是可以让用户登入多长时间后,不管有没有操作,超过这个设定的时间后都会登出,上代码:

1
2
3
4
'user' => [
'identityClass' => 'app\models\User',
'absoluteAuthTimeout' => 20 //这里为了测试,设置为20秒,登入后不停刷新模拟用户操作,结果可看到,虽然在不断操作,但是过了设置的时间还是会自动登出
],

需要注意的是如果设置 enableAutoLogin = true 的话,以上两个设置是不会生效的。

今天打了一下午的篮球,快要中暑了。。。。

我为什么这么喜欢篮球

记得在上高中前,基本都没有什么体育运动,那时候的体育除了跑跑步就是跳跳绳。简直弱爆了。真正开始接触篮球还的进入高中后。

进入高中感觉最爽的就是体育课的区别了,可以选择自己喜欢的运动,比如足球、篮球。那时候我的性格还十分的内向,毕竟穷苦出身,不爱交际。上体育课来说,我就是场边的选手,不敢加入其中。

到了后来和同学熟悉了之后,开始慢慢的融入了大家。我也敢上场了。积极的争抢篮板、跑动,简直打了鸡血似得,几乎跑满整个篮球课。可能是年轻吧,真是活力充沛。

再后来,就高三了。升学的压力很大,学校也是个重点,所有体育课就形同虚设了。即有体育课,大部分同学们都还是选择留在教室里面学习,体育老师也是不管的「可能这也是特色了吧」。就这样,暂告别「篮坛」。

新的开始

进过努力,考进了还不错的大学。那是大西北的一所学校。第一次出远门「这是我到现在为止去过的最远的地方」。

  • 不同的伙食「辣」,这里的菜系基本被川菜所占领,在家里哪吃过辣,第一餐吃的我感觉菊花都疼疼的
  • 不同的气候「干热」,在这里运动,你的汗刚出来基本上就被蒸发干了。

还有这样那样的 那样。。。。

宿舍离篮球场挺近,还是一如既往的「场边观战」。大学了嘛,所以决定改变自己内向的性格,参加社团、主动加入打篮球。。。

变化好快啊,我争强好胜的性格逐渐展现出来,在球场上,不知道多少次和同学吵闹「好愧疚」,本来自己的实力就不咋地,还那么的好胜。哎,在这里向我之前得罪过的同学们道个歉吧,哈哈,虽然我知道他们不会记恨着。

怎么办,这段还有好多要写啊!!可是跑题了啊。

算了,结束吧,挺累的。以后每个星期都可以打球了,锻炼锻炼,媳妇儿老说我的肚子跟怀孕好几个月的似的。