1、对于Gitphp
安装gitmysql
建立目录,做为git可追踪的仓库,在目录下使用git init便可,git自动生成.git隐形文件进行追踪nginx
git只能追踪文本文件,对于二进制文件不起做用git
在建立的仓库中,目录下或者子目录下,建立文件github
编辑好后,三步走:正则表达式
git addredis
git commit -m 算法
git pushsql
>>>>其余命令json
git diff 查看修改内容
git log 显示从最近到最远的提交日志 简化命令:git log --pretty=oneline
HEAD表示当前版本,HEAD^表示上一个版本,HEAD^^^表示上上上个版本,往上100个版本写100个^写不过来能够写成是HEAD~100
git reset --hard HEAD^ 回退到上一个版本
回退到上一个版本后再打git log的话,最新版本的那个信息已经找不到了,穿越了,再想回去怎么办
从上次Git log里面找到最新的版本号,进行回退
git reset --hard 1094a 版本号没有必要写全,前几位就能够了
可是怎么找到新版本的版本号呢
git reflog记录你的每一次命令
场景1:当你改乱了工做区的内容,想直接丢弃工做区的修改时,用命令git checkout -- file
场景2:当你不但改乱了工做区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,就回到了场景1,第二步按场景1操做。
git reset
命令既能够回退版本,也能够把暂存区的修改回退到工做区。当咱们用HEAD
时,表示最新的版本。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
怎么删除文件呢
当你要删除文件的时候,能够采用命令:rm test.txt
这个时候有两种状况
第一种状况:的确要把test.txt删掉,那么能够执行 git rm test.txt git commit -m "remove test.txt" 文件被删除,且删除记录上传本地库
第二种状况:误删文件,想恢复,这时候尚未commit -m "remove test.txt",执行git checkout test.txt将文件恢复。
若是执行完git commit -m "remove test.txt"后就不能用checkout恢复了,得用git reset --hard HEAD^
其实只要你用了Git,不管怎么搞,你均可以找回曾经的任何一个版本的文件,几遍是rm file或者Git rm file 还 commit,都一回事,你提交也只是提交一个删除记录而已,此次版本的文件,他删除也只是相对于你的工做区目录,你觉得Git本地仓库没有给你保存原文件吗?永远会有,只要你记住那个ID
git clone git@github.com:michaelliao/gitskills.git
你也许还注意到,GitHub给出的地址不止一个,还能够用https://github.com/michaelliao/gitskills.git
这样的地址。实际上,Git支持多种协议,默认的git://
使用ssh,但也可使用https
等其余协议。
使用https
除了速度慢之外,还有个最大的麻烦是每次推送都必须输入口令,可是在某些只开放http端口的公司内部就没法使用ssh
协议而只能用https
。
建立dev分支+切换到dev分支
git checkout -b dev = get branch dev 建立分支;git checkout dev 切换分支
git branch 命令查看当前分支
git checkout master 切换回master分支
git merge dev 将dev分支合并到master分支上 git merge用于合并指定分支到当前分支
git branch -d dev 删除dev分支
在分支开发,开发完成后这样合并分支:一、先切换到master,git checkout master,二、合并分支,git merge hostfix
将分支合并回主干(master)
将newbranch代码合并回主干
git checkout master
git merge newbranch
将master代码合并回分支newbranch
git checkout newbranch
git merge newbranch
冲突时,输入git merge featurel时git没法执行‘快速合并’,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,这时候必须手动解决冲突后再提交
git status 能够告诉咱们冲突的文件
Git用<<<<<<<
,=======
,>>>>>>>
标记出不一样分支的内容,咱们修改后保存
而后再提交
用带参数的git log
也能够看到分支的合并状况:
git log --graph --pretty=oneline --abbrev-commit
最后,删除feature1
分支:feature1
有紧急任务时,可使用git stash储藏起来,
首先肯定要在哪一个分支上修复bug,假定须要在master
分支上修复,就从master
建立临时分支
修复完成后,切换到master
分支,并完成合并,最后删除issue-101
分支
如今,是时候接着回到dev
分支干活了!
git stash pop
git update-index --assume-unchanged conf/defined.php //git忽略追踪
git拉取分支代码:
cd ~/Desktop/
ls
git clone http://gitlab.i.beebank.com/php-beebank/fengyi.git fengyi
Cloning into 'fengyi'...
remote: Counting objects: 1464, done.
remote: Compressing objects: 100% (1263/1263), done.
remote: Total 1464 (delta 547), reused 532 (delta 89)
Receiving objects: 100% (1464/1464), 2.84 MiB | 4.49 MiB/s, done.
Resolving deltas: 100% (547/547), done.
git branch -a
fatal: Not a git repository (or any of the parent directories): .git
cd fengyi
git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/develop
remotes/origin/master
git checkout origin/develop -b develop
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
Switched to a new branch 'develop'
git pull
Already up to date.
2、基础的Linux命令
一、安装anaconda包
wget https://repo.anaconda.com/archive/Anaconda3-5.3.1-Linux-x86_64.sh
sh Anaconda3-5.3.1-Linux-x86_64.sh
二、递归查找当前目录下,某字符串所在的文件
三、grep 'rds7wvh2b3r70e26m95q.mysql.rds.aliyuncs.com' -ri .
:%s/rds7wvh2b3r70e26m95q.mysql.rds.aliyuncs.com/rds7wvh2b3r70e26m95q389.mysql.rds.aliyuncs.com/g
:%s/8841fe4e95d64e4a.m.cnbja.kvstore.aliyuncs.com/8841fe4e95d64e4a478.redis.rds.aliyuncs.com/g
所有替换的命令为:
:%s/s1/s2/g
四、vim 查询关键字 /关键字 n向下 N向上
五、跳转指定行 :n
六、mysqldump -uroot -p visit>/tmp/visit.sql
七、添加权限
sudo chmod 777 -R /data2/logs/
八、追踪变化
tail -f sql.log
九、查看最后多少行数据
tail -n 300 debug.20161101.log
十、删除多个文件
rm 订单50041贷款合同.pdf 订单LsaNvhCEHLyFt贷款合同.pdf 订单LsbZ8IttgGSXJ贷款合同.pdf
加上-R删除文件夹
rm -Rf controller.exception data.exception index jobs service.exception s.exception sql.log timelog
十一、显示全部进程和其状态
ps aux|grep nginx
杀死进程:kill -s 9 pid
十二、远程拷贝(能够用于 服务器到服务器,在本地拷贝服务器的文件)
scp peng.yu@172.16.22.70:/etc/nginx/vhosts/jydhx.conf .
1三、压缩&解压
1)gzip压缩
压缩文件
$ gzip -v test
test: 53.1% -- replaced with test.gz
压缩会删掉本地文件。新建test.gz文件
不删除文件使用重定向
$ gzip -c test > test.gz
解压缩
gzip -d test.gz
查看压缩后的文件内容,不解压缩的状况下。使用zcat命令
$ zcat test.gz
2)bzip2:bzip2是用来取代gzip的压缩,比gzip压缩比例还高
#压缩test文件,生成test.bz2
$ bzip2 -z test
#保留原文件, 压缩生成test.bz2
$ bzip2 -k test
#解压缩文件
$ bzip2 -d test.bz2
查看压缩文件内容,使用bzcat
$ bzcat test.bz2
3)tar:为打包命令。将多个文件打包成一个文件。还包括压缩參数。
#建立bzip2压缩文件
$ tar -jcv -f test.tar.bz2 test/
#不解压缩状况下查看文件列表
$ tar -jtv -f test.tar.bz2
#解压缩到当前文件夹
$ tar -jxv -f test.tar.bz2
#解压缩到指定文件夹test2
$ mkdir test2
$ tar -jxv -f test.tar.bz2 -C test2
#建立gzip压缩文件
$ tar -zcv -f test.tar.gz test
#查看压缩文件
$ tar -ztv -f etc.tar.gz
1四、
command+k 切新的一页
command+m 最小化
1五、切换php7
ps aux|grep php
root 218 0.0 0.0 295720 6840 ? Ss May14 0:46 php-fpm: master process (/etc/php-fpm.conf)
www 7748 0.0 0.0 300428 16292 ? S May15 0:00 php-fpm: pool www
www 7749 0.0 0.0 300436 15888 ? S May15 0:00 php-fpm: pool www
www 7750 0.0 0.0 300428 16116 ? S May15 0:00 php-fpm: pool www
www 7756 0.0 0.0 300424 15632 ? S May15 0:00 php-fpm: pool www
1104 134330 0.0 0.0 103300 840 pts/0 S+ 10:49 0:00 grep php
[huiyun.zhao@22-102 ~]$ sudo service php-fpm stop
Gracefully shutting down php-fpm ... . SUCC
[huiyun.zhao@22-102 ~]$ /data1/
htdocs/ logs/ php/ phplib/ tomcat/
[huiyun.zhao@22-102 ~]$ sudo /data1/php/sbin/php-fpm
3、改纯js文件须要清缓存
4、
催收中心:
$ret_array = json_decode($ret_json, true);//这里是对json进行解码
if(json_last_error() !== JSON_ERROR_NONE) {
throw new Exception('房贷系统,响应数据格式不正确');
}
若是有,返回 JSON 编码解码时最后发生的错误。该函数没有参数
*json_last_error()的返回值为常数:
常量 |
含义 |
可用性 |
JSON_ERROR_NONE |
没有错误发生 |
|
JSON_ERROR_DEPTH |
到达了最大堆栈深度 |
|
JSON_ERROR_STATE_MISMATCH |
无效或异常的 JSON |
|
JSON_ERROR_CTRL_CHAR |
控制字符错误,多是编码不对 |
|
JSON_ERROR_SYNTAX |
语法错误 |
|
JSON_ERROR_UTF8 |
异常的 UTF-8 字符,也许是由于不正确的编码。 |
PHP 5.3.3 |
JSON_ERROR_RECURSION |
One or more recursive references in the value to be encoded |
PHP 5.5.0 |
JSON_ERROR_INF_OR_NAN |
PHP 5.5.0 |
|
JSON_ERROR_UNSUPPORTED_TYPE |
指定的类型,值没法编码。 |
PHP 5.5.0 |
JSON_ERROR_INVALID_PROPERTY_NAME |
指定的属性名没法编码。 |
PHP 7.0.0 |
JSON_ERROR_UTF16 |
畸形的 UTF-16 字符,可能由于字符编码不正确。 |
PHP 7.0.0 |
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
$data='[{"Name":"a1","Number":"123","Contno":"000","QQNo":""},{"Name":"a1","Number":"123","Contno":"000","QQNo":""},{"Name":"a1","Number":"123","Contno":"000","QQNo":""}]';
//上面是单组元素,下面是多组,就像数组同样 能够是$data = [{},{}];也能够$data[]=‘{}’这样一个一个添加
//改造json是这样的外面是单引号,里面的值都是双引号,
$array = json_decode($json, true);
if(json_last_error() !== JSON_ERROR_NONE){
echo '发生错误';exit;
}
echo '没有发生错误';var_dump($array);exit;
2、接下来研究下对外接口
static我先这样理解:static只获取基类的定义的值,self:以后去基类自身的值 //彻底错误😂,换种思惟
说明:
self:类内指针,就是写在哪一个类里边,就调用哪一个类里边的方法或属性。
static:使用的这个类会被子类覆盖,使用的是子类的方法或属性,就是说父类访问的是子类的方法或属性。
//本身理解下:self-在哪一个类中使用就是访问哪一个类中的属性/方法。static-会被子类覆盖,好比说b子类调用A父类,虽说static在A父类中写的,可是调用的属性/方法仍是b子类的
例子:
class a{
public static function who(){
echo "my name is xiaofeng";
}
public static function name(){
self::who();
}
}
class b extends a{
public static function who(){
echo "my name is xiaoma";
}
public static function name(){
static::who();
}
}
a::name();
b::name();
输出:
a、my name is xiaofeng
b、my name is xiaoma
5、
$string = '
hahahahha yyyyyy ;
hahahah yyyyyy
eeee
eeeeeeeeeee
heiehieheiehiehieheiehi
';
$strn = str_replace(["\r\n", "\r", "\n", "\t", "\0", "\x0B", " "], '', $string);
$string = '
hahahahha yyyyyy ;
hahahah yyyyyy
eeee
eeeeeeeeeee
heiehieheiehiehieheiehi
';
$strn = str_replace(["\r", "\n", "\t"," "], '', $string);这个是能够去空格、换行和制表符之类的
输出的是:
string(67) "hahahahhayyyyyy;hahahahyyyyyyeeeeeeeeeeeeeeeheiehieheiehiehieheiehi"
array_slice()对数组进行切割 array_slice($array, 1, 2);切出来的是第一个和第二个
6、研究算法
7、
CREATE TABLE dept
(
d_no INT NOT NULL PRIMARY KEY AUTO_INCREMENT, //部门编号
d_name VARCHAR(50), //部门名称
d_location VARCHAR(100) //部门地址
);
CREATE TABLE employee
(
e_no INT NOT NULL PRIMARY KEY, //员工编号
e_name VARCHAR(100) NOT NULL, //员工姓名
e_gender CHAR(2) NOT NULL, //员工性别
dept_no INT NOT NULL, //部门编号
e_job VARCHAR(100) NOT NULL, //职位
e_salary SMALLINT NOT NULL, //薪水
hireDate DATE, //入职日期
CONSTRAINT dno_fk FOREIGN KEY(dept_no) REFERENCES dept(d_no)
);
select * from employee e join dept d on e.dept.no=d.d_no where d.d_no=20;
select *,sum(e_salary) ss from employee group by dept_no
select e_no,e_name,max(e_salary) from employee group by dept_no;
select e.e_name,d.d_name,d.location from employee e join dept d on e.dept_no=d.d_no where e.name=‘blake’;
select dept_no,count(e_name) from employee group by dept_no;
select e_job,sum(e_salary) from employee group by e_job;
select * from employee order by dept_no desc,e_salary desc;
select * from employee where e_name like ‘’
select * from employee where (year(now())-year(hireDate))>10;
select e_name,e_job from employee where dept_no=(select d_no from dept where d_location=‘beijing’);
LIKE: 至关于模糊查询,和LIKE一块儿使用的通配符有 "%"、"_"
"%":做用是能匹配任意长度的字符。
"_":只能匹配任意一个字符
SELECT * FROM fruits WHERE f_name LIKE 'b%'; //f_name以b字母开头的全部记录
SELECT * FROM fruits WHERE f_name LIKE 'b%y'; //f_name以b字母开头,y字母结尾的全部记录
SELECT * FROM fruits WHERE f_name LIKE '____y'; //此处有四个_,说明要查询以y字母结尾而且y以前只有四个字符的记录
总结:'%'和'_'能够在任意位置使用,只须要记住%可以表示任意个字符,_只能表示一个任意字符
SELECT * FROM 表名 WHERE 字段名 IS NULL; //查询字段名是NULL的记录
SELECT * FROM 表名 WHERE 字段名 IS NOT NULL; //查询字段名不是NULL的记录
使用DISTINCT就能消除重复的值
SELECT DISTINCT s_id FROM fruits;
SELECT s_id, COUNT(f_name), GROUP_CONCAT(f_name) FROM fruits GROUP BY s_id;
解释:
COUNT():这个是下面要讲解到的一个函数,做用就是计算有多少条记录,
GROUP_CONCAT(): 将分组中的各个字段的值显示出来
SELECT s_id, COUNT(f_name), GROUP_CONCAT(f_name), GROUP_CONCAT(f_price) FROM fruits GROUP BY s_id;
分组以后还能够进行条件过滤,将不想要的分组丢弃,使用关键字 HAVING
SELECT s_id,COUNT(f_name),GROUP_CONCAT(f_name) FROM fruits GROUP BY s_id HAVING COUNT(f_name) > 1;//他可以过s_id分组,而后过滤出水果种类大于1的分组信息。
总结:
知道GROUP BY的意义,而且会使用HAVING对分组进行过滤, HAVING和WHERE都是进行条件过滤的,区别就在于 WHERE 是在分组以前进行过滤,而HAVING是在分组以后进行条件过滤。
给字段名取别名的缘由是有些字段名是为了显示更加清楚,好比
SELECT f_price AS '价格' FROM fruits;
子查询
ANY关键字接在一个比较操做符的后面,表示若与子查询返回的任何值比较为TRUE,则返回TRUE,通俗点讲,只要知足任意一个条件,就返回TRUE。
SELECT num1 FROM tb11 WHERE num1 > ANY(SELECT num2 FROM tb12);//这里就是将在tb12表中查询的结果放在前一个查询语句中充当条件参数。只要num1大于其结果中的任意一个数,那么就算匹配。
使用ALL时表示须要同时知足全部条件。
SELECT num1 FROM tb11 WHERE num1 > ALL(SELECT num2 FROM tb12); //num1须要大于全部的查询结果才算匹配
EXISTS关键字后面的参数是任意一个子查询,若是子查询有返回记录行,则为TRUE,外层查询语句将会进行查询,若是子查询没有返回任何记录行,则为FALSE,外层查询语句将不会进行查询。
SLEECT * FROM tb11 WHERE EXISTS(SELECT * FROM tb12 WHERE num2 = 3); //查询tb12中有没有num2=3的记录,有的话则会将tb11的全部记录查询出来,没有的话,不作查询
这个IN关键字的做用跟上面单表查询的IN是同样的,不过这里IN中的参数放的是一个子查询语句。
SELECT s_id,f_id,f_name
FROM fruits
WHERE s_id IN(SELECT s_id FROM suppliers WHERE s_id = 107);
两张表: employee(员工)表和dept(部门)表。
CREATE TABLE dept
(
d_no INT NOT NULL PRIMARY KEY AUTO_INCREMENT, //部门编号
d_name VARCHAR(50), //部门名称
d_location VARCHAR(100) //部门地址
);
CREATE TABLE employee
(
e_no INT NOT NULL PRIMARY KEY, //员工编号
e_name VARCHAR(100) NOT NULL, //员工姓名
e_gender CHAR(2) NOT NULL, //员工性别
dept_no INT NOT NULL, //部门编号
e_job VARCHAR(100) NOT NULL, //职位
e_salary SMALLINT NOT NULL, //薪水
hireDate DATE, //入职日期
CONSTRAINT dno_fk FOREIGN KEY(dept_no) REFERENCES dept(d_no)
);
4.2.2、在employee表中,查询dept_no等于10和20的全部记录
方式一:SELECT * FROM employee WHERE dept_no IN(10,20);
方式二:SELECT * FROM employee WHERE dept_no = 10 OR dept_no = 20;
4.2.3、在employee表中,查询工资范围在800~2500之间的员工信息
SELECT * FROM employee WHERE e_salary BETWEEN 800 AND 2500;
4.2.四、在employee表中,查询部门编号为20的部门中的员工信息
SELECT * FROM employee WHERE dept_no = 20;
4.2.5、在employee表中,查询每一个部门最高工资的员工信息
分析:每一个员工均可能处于不一样的部门,要先找出每一个部门中的全部员工,应该想到分组,将相同部门的员工分为一组。而后在使用MAX()函数比较最大的salary。注意不要MAX(GROUP_CONCAT(e_salary)), 这样写就会报错,GROUP_CONCAT(e_salary)是将分组中全部的e_salary显示出来,咱们直接MAX(e_salary)就会将该分组中全部的e_salary进行比较,拿到最大的一份。
SELECT e_no,e_name,MAX(e_salary) FROM employee GROUP BY dept_no;
4.2.6、查询员工BLAKE所在部门和部门所在地
分析:看下题目就应该知道是两张表,也就应该使用链接查询,找出是用内链接仍是外链接,而后找出链接条件,
方式一:SELECT d.d_no,d.d_name,d.d_location FROM employee AS e,dept AS d WHERE e.e_name = 'BLAKE' AND e.dept_no = d.d_no;
方式二:SELECT d.d_no,d.d_name,d.d_location FROM employee AS e INNER JOIN dept AS d ON e.e_name = 'BLAKE' AND e.dept_no = d.d_no;
4.2.7、使用链接查询,查询全部员工的部门和部门信息
分析:这个题跟上面哪一个题差很少,使用内链接
SELECT e.e_no,e.e_name,d.d_no,d.d_name,d.d_location
FROM employee AS e INNER JOIN dept AS d
ON e.dept_no = d.d_no;
4.2.8、在employee中,计算每一个部门各有多少员工
分析:每一个部门用分组
SELECT COUNT(e.e_name)
FROM employee AS e
GROUP BY e.dept_no
4.2.9、在employee表中,计算不一样类型职员的总工资数
分析:对员工职位类型进行分组
SELECT e.e_job,SUM(e.e_salary)
FROM employee AS e
GROUP BY e.e_job;
4.2.10、在employee表中,计算不一样部门的平均工资
分析:对部门进行分组
SELECT e.dept_no,AVG(e.e_salary)
FROM employee AS e
GROUP BY e.dept_no;
4.2.十二、在employee表中,将查询记录先按部门编号由高到低排列,再按员工工资由高到低排列
SELECT * FROM employee ORDER BY dept_no DESC,e_salary DESC;
4.2.13、在employee表中,查询员工姓名以字母A或S开头的员工信息
方式一: SELECT * FROM employee WHERE e_name LIKE 'A%' OR e_name LIKE ’S%’;//用的是like
方式二:SELECT * FROM employee WHERE e_name REGEXP '^A' OR e_name REGEXP '^S’;//用的是正则表达式
4.2.14、在employee表中,查询到目前为止,工龄大于等于10年的员工信息
方式一:SELECT * FROM employee WHERE (YEAR(NOW()) - YEAR(hireDate)) > 10;
方式二:SELECT * FROM employee WHERE (YEAR(CURDATE()) - YEAR(hireDate)) > 10;
解释:记得咱们前一节学的数据类型吗,其中CURDATE()表明的是YYYY-MM-DD, NOW()表明的是YYYY-MM-DD HH:MM:SS,因此这里两个度能用,只要将其截取为为YEAR,而后相减,就能获得相差几年了。
4.3.四、查询名字以字母N或者S结尾的记录
方式一:
SELECT * FROM employee WHERE e_name LIKE '%N' OR e_name LIKE '%S';
方式二:
SELECT * FROM employee WHERE e_name REGEXP 'N$' OR e_name REGEXP 'S$';
4.3.五、查询在BeiJing工做的员工的姓名和职务
方式一:SELECT e_name,e_job FROM employee WHERE dept_no = (SELECT d_no FROM dept WHERE d_location = 'BeiJing');
方式二:SELECT e.e_name, e.e_job FROM employee AS e,dept AS d WHERE e.dept_no = d.d_no AND d.d_location = 'BeiJing';