Homestead添加多站点的坑

Homestead做Laravel的开发还是很方便的,但是在添加多站点的时候,发现几个坑,来做个记录。

首先,官方文档给了修改homestead.yaml文件的方式,只需要在sites字节下添加一个新的站点配置就好了,如图:
homestead-sites

然后执行
homestead provison
就可以使得配置生效!

但是!!坑来了…去访问的话,你会得到一个502错误!好吧,这个错误相信很多人已经发现了,只是因为新版本的Homestead有个PHP-FPM的配置错误,只需要修改/etc/nginx/sites-enabled/下的homestead.app(请按照自己的实际情况修改)文件,将fastcgi_pass_unix:/var/run/php5-fpm.sock;修改为fastcgi_pass_unix:/var/run/php/php7.0-fpm.sock;就可以了,然后重启Nginx。

但是,重点不是这个好嘛。按照上图的配置,/etc/nginx/sites-enabled/下面应该有两个文件的,每个配置文件代表一个站点。然而,这个版本的Homestead只会使用配置下的第一个站点配置来生成Nginx的配置文件。

而且执行homestead provision是有损数据的。

好吧,这个需要另一种添加站点的方式。

使用SSH登陆Homestead,然后,执行如下图命令:homestead-scripts

是不是有一个serve-laravel.sh的脚本,对,我们需要使用它来帮助我们添加多站点。

执行
sudo /vagrant/scripts/serve-laravel.sh blog.app /home/vagrant/Code/blog/public

然后执行
ls /etc/nginx/sites-enabled/
是不是多出来你刚刚配置的站点配置文件。别高兴太早,那个Bug,记得修改PHP-FPM的相关配置,重启Ngixn,去试试吧,对了还有别忘了hosts。

记录下Homestead的几个坑

最近在Windows下玩玩Laravel,顺便用用Homestead,配置环境的过程中发现几个坑,记录下:

  • 坑1:V2.2.1版本的Homestead有BUG,因为内置了php5.6和php7.0.2两个版本的PHP,所以在多站点配置项,/etc/nginx/sites-enable下的配置文件即可–发现自nginx错误日志
  • 坑2:homestead.yaml文件不能有tabs,必须空格!!

理解MySQL的CHAR和VARCHAR的区别

之前一直没认真研究过MySQL的CHAR和VARCHAR之间有什么区别,只是模糊的认为,CHAR比VARCHAR字符长度短一些。
查阅了一下MySQL的官方文档,有了一些认识。

原文内容如下:

The CHAR and VARCHAR types are similar, but differ in the way they are stored and retrieved. They also differ in maximum length and in whether trailing spaces are retained.

The CHAR and VARCHAR types are declared with a length that indicates the maximum number of characters you want to store. For example, CHAR(30) can hold up to 30 characters.

The length of a CHAR column is fixed to the length that you declare when you create the table. The length can be any value from 0 to 255. When CHAR values are stored, they are right-padded with spaces to the specified length. When CHAR values are retrieved, trailing spaces are removed unless the PAD_CHAR_TO_FULL_LENGTH SQL mode is enabled.

Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 65,535. The effective maximum length of a VARCHAR is subject to the maximum row size (65,535 bytes, which is shared among all columns) and the character set used. See Section C.10.4, “Limits on Table Column Count and Row Size”.

其实翻译过来大意就是这样:

  1. 对于CHAR,字符长度在0-255之间,不足的长度将会以空格补齐,但在检索的时候,会删除补齐的空格。例如:char name(4),插入字符'''a'或者'abcd'都是占用4bytes。
  2. 对于VARCHAR,字符长度在0-65,535之间,有效的最大字符长度取决于此列最大行的长度,在各个列之间,最大有效长度取65,535 。同时,不同字符集也影响存储长度。其存储的内容不足长度不会以空格补齐。在符合标准的SQL中,尾部的空格在存储和检索时会被保留。例如:char name(4),插入字符'''a'或者'abcd',其长度分别为1,2,5byes 。

其次,如果未启用SQL严格模式,当CHAR或VARCHAR列超过列的最大长度,该值将被截​​断,以适应字段长度并产生一个警告。启用严格模式后,对于非空格字符截断时,会产生一个错误,并且不会真正插入值。

存储长度的差异如下图:

char-varchar-difference
char-varchar-difference

如果给定的值被存储到CHAR(4)和VARCHAR(4)列,从列中检索到的值并不总是相同,因为尾随空格从CHAR列检索时除去。例如:

char-varchar-spaces-select
char和varchar在检索时对于尾部空格的差异
char-varchar-spaces-like
LIKE检索方式会被尾部空格影响

所有MySQL的排序规则是PADSPACE类型的。这意味着所有CHAR,VARCHAR和TEXT值在MySQL中是不考虑任何尾随空格进行比较。
但是LIKE除外。
这些适用于所有的MySQL版本,而不受服务器的SQL模式。

官方文档原文地址:
https://dev.mysql.com/doc/refman/5.7/en/char.html

Yii学习笔记之Yii,Composer的了解与安装

现在开始了解学习一下Yii框架,之前学了ThinkPHP,学习Yii也是一时兴起吧,看了一下文档的开始,不知怎么就像学学,顺便学会使用Composer.
OK,主要是可以给我记一下,说不定学一半又被耽搁了,方便以后查阅吧.

首先,简介:
Yii 是一个高性能,基于组件的 PHP 框架,用于快速开发现代 Web 应用程序。名字 Yii (读作 易)在中文里有“极致简单与不断演变”两重含义,也可看作 Yes It Is! 的缩写。

第一步:安装Composer

(注:是 PHP 用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件。http://www.phpcomposer.com/)

此处只记录基于linux下的安装,Mac同此,而Windows下安装下载并运行 Composer-Setup.exe.
在 Linux 和 Mac OS X 中可以运行如下命令:
[shell collapse=”false”]
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
[/shell]

第二步,安装Composer

Composer 安装后,切换到一个可通过 Web 访问的目录,执行如下命令即可安装 Yii :
[shell collapse=”false”]
composer global require "fxp/composer-asset-plugin:~1.0.0"
composer create-project –prefer-dist yiisoft/yii2-app-basic yii
[/shell]

第一条命令安装 Composer asset plugin,它是通过Composer 管理 bower和 npm 包所必须的,此命令全局生效,一劳永逸。 第二条命令会将 Yii 安装在名为yii的目录中,你也可以随便选择其他名称。

此处有一点需要注意,因为Composer在安装过程中需要在GitHub请求数据,在这过程中由于数据较多,可能会超过GitHub对匿名用户的API限制,因此会询问你 GitHub 账户的登录信息.看来,作为一个程序猿,木有GitHub账号没法玩的说~~
composer-github

如上图,提示验证Token,只需要访问提示中的连接,登录GitHub账号,如下图,生成即可.
github-token-generate
然后,复制至终端即可.
接下来就是漫长的等待了,天朝你懂得.
不用Composer,直接下载安装的方式,此处略.

安装好之后,访问http://localhost/basic/web/index.php

OK 暂时这么多,还在安装中,真慢.

Syntax error: Bad for loop variable解决办法

Ubuntu中写了一个简单的shell脚本,利用for..do..done结构每3秒执行一次php脚本,错误为Syntax error: Bad for loop variable

解决办法:sudo dpkg-reconfigure dash
在选择项中选No

从 ubuntu 6.10 开始,ubuntu 就将先前默认的bash shell 更换成了dash shell;其表现为 /bin/sh 链接倒了/bin/dash而不是传统的/bin/bash。

ubuntu edgy是第一个将dash作为默认shell来发行的版本,这似乎是受了debian的影响。wiki 里面有官方的解释,https://wiki.ubuntu.com/DashAsBinSh,主要原因是dash更小,运行更快,还与POSIX兼容。

但 目前存在的问题是,由于shell的更换,致使很多脚本出错,毕竟现在的很多脚本不是100%POSIX兼容。

在wiki里面也说到,如 何将默认的shell改回bash,方法就是

在终端执行 sudo dpkg-reconfigure dash

然后选 择 no

关于MySQL的FULLTEXT实现全文检索的注意事项

对于英文,MySQL的FULLTEXT属性来实现全文检索是相当方便且高效的,但是在使用过程中需要注意一些事项。

首先对我们对需要进行检索的字段添加FULLTEXT属性(假设已经建表):

[sql collapse=”false”]
alter table table_name add fulltext index(filed_1,filed_2);
[/sql]
接下来查询数据:
[sql collapse=”false”]
SELECT * FROM table_name WHERE MATCH (filed_1,filed_2) AGAINST (‘keyword’);
[/sql]
此处涉及到一个很重要的注意事项:

MySQL规定全文搜索中被搜索的单词所在的行数大于等于被搜索的所有行数的一半时候,就将被搜索单词作为Common word,即不被显示。(具体条件需要查阅资料确定)

因此,假设在测试的时候,表中只有一行数据,所以无论怎么执行上述查询语句,返回的结果总是为空。不必惊慌,多加几条没有待查关键词的数据就会有结果啦~

当然,MySQL提供了更加强大的查询结果过滤:
[sql collapse=”false”]
SELECT * FROM table_name WHERE MATCH (filed_1,filed_2) AGAINST (‘+keyword_1 -keyword_2’ IN BOOLEAN MODE);
[/sql]

这样,就会返回包含keyword_1的数据,而包含keyword_2的数据就会被过滤掉。