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';