PHP empty, is_null, isset 判斷結果列表

empty判斷值在不在,isset判斷變數在不在,兩個不同屬性

表達式			GETTYPE()	EMPTY()		IS_NULL()	ISSET()	  	BOOLEAN : IF($X)
$x = "";		string		TRUE		FALSE		TRUE		FALSE
$x = null;		NULL		TRUE		TRUE		FALSE		FALSE
var $x;			NULL		TRUE		TRUE		FALSE		FALSE
$x is undefined	        NULL		TRUE		TRUE		FALSE		FALSE
$x = array();	        array		TRUE		FALSE		TRUE		FALSE
$x = false;		boolean		TRUE		FALSE		TRUE		FALSE
$x = true;		boolean		FALSE		FALSE		TRUE		TRUE
$x = 1;			integer		FALSE		FALSE		TRUE		TRUE
$x = 42;		integer		FALSE		FALSE		TRUE		TRUE
$x = 0;			integer		TRUE		FALSE		TRUE		FALSE
$x = -1;		integer		FALSE		FALSE		TRUE		TRUE
$x = "1";		string		FALSE		FALSE		TRUE		TRUE
$x = "0";		string		TRUE		FALSE		TRUE		FALSE
$x = "-1";		string		FALSE		FALSE		TRUE		TRUE
$x = "php";		string		FALSE		FALSE		TRUE		TRUE
$x = "true";	        string		FALSE		FALSE		TRUE		TRUE
$x = "false";	        string		FALSE		FALSE		TRUE		TRUE

參考連結

http://php.net/manual/zh/types.comparisons.php

Docker筆記

清除image, container, networks, build cache, volumes 空間

### 清除image, container, networks, build cache, volumes 空間
docker system prune

Options:
  -a, --all             Remove all unused images not just dangling ones
      --filter filter   Provide filter values (e.g. 'label=<key>=<value>')
  -f, --force           Do not prompt for confirmation
      --volumes         Prune volumes

進入容器

docker exec -it sk2_mysql_1 bash
docker attach sk2_mysql_1 bash

查看私庫套件
http://docker.private.today/v2/_catalog

查看私庫套件Tag列表
http://docker.private.today/v2/scott/gusher/tags/list

讓容器在後台運行而不退出的方法

tail -f /dev/null
service nginx -g "daemon off;"

獲取容器/鏡像的元數據

docker inspect

產生image

docker build --no-cache --pull --force-rm -t ken/ubuntu:base -f ubuntubase.dockerfile .

存儲容器狀態到tar

docker export ubuntu > ubuntu.tar

容器tar 轉成 image

cat ubuntu.tar | docker import - ken/ubuntu

把現有的images推到私倉

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
docker tag [現有的IMAGE]:[TAG] [私倉名字]/[建立者]:[TAG]
docker push [私倉名字]/[建立者]:[TAG]

建立容器

docker create -t -i fedora bash

啟動已終止容器

docker start -ai fedora

映射IP(對外連線 本機:Docker容器內)

docker run -p 8080:80 -v \local\work:container\work ken\php

 

讓非root 使用者用docker

建立docker group

sudo groupadd docker

將連接的用戶$USER添加到docker組

sudo gpasswd -a $USER docker

執行更新group

newgrp docker

Mac 初體驗

必裝軟體

1.HomeBrew

套件管理軟體,類似ubuntu的apt-get

brew install bash-completion 自動補齊

2.CheatSheet

查閱快捷鍵的小幫手

3.Magnet

App視窗分邊的工具

4.iTerm2

好用的 terminal 支援快捷鍵Hide/Show

semantic history設定,下載iterm_open_with.sh

/usr/local/bin/iterm_open_with \5 \1 \2

5.AppCeaner

深度移除APP的工具

6.Sublime text

編輯器

7.更新PHP7

brew unlink php56

brew install php72

 

Git 常用指令整理

推回上一個點

git revert -m 1 eff349a7a4132fdbb5f45bbb0d1b72248ace29a1(merge的點) 會新增一個commit

連同檔案一起推回上一個點

git reset --head HEAD^1

回覆修改紀錄

git reset --soft HEAD^

–soft – 緩存區和工作目錄都不會被改變
–mixed – 默認選項。緩存區和你指定的提交同步,但工作目錄不受影響
–hard – 緩存區和工作目錄都同步到你指定的提交

取消追蹤檔案

git rm --cached xxxxxxxxxxxx

git stash pop 衝突解法

git reset 或 git git reset HEAD [files]

[參考] (http://stefaanlippens.net/resolve-git-unmerged-paths-after-stash-pop)

建立分支

git branch branch_name SHA

檢查Log

git log

輸入指令!帳號密碼只要打一次

git config --global credential.helper store

git 從那個點到那個點的差異or檔案名稱

git diff 93fd4171999e8682850ff5d1ca300c419fe3610e HEAD
git diff --name-only 93fd4171999e8682850ff5d1ca300c419fe3610e HEAD

更換git遠端名稱

git remote rename origin upstream

新增異動檔案暫存區

git add -u

Git Repository

mkdir ${PROJECT}.git

cd ${PROJECT}.git

git --bare init

然後在本機裡加入

git remote add origin file:///${PROJECT}.git

上傳更新本地位址

在${PROJECT}.git底下的hooks資料夾加入post-receive並寫入以下bash (檔案權限須改成755)

 #!/bin/bash

while read oldrev newrev refname
do
 if [ "$refname" == "refs/heads/master" ]; then
 break;
 fi
done

if [ "$refname" != "refs/heads/master" ]; then
 exit;
fi

branch=$(git rev-parse --symbolic --abbrev-ref $refname)

git --work-tree=要覆蓋的位址 checkout -f $branch

Debain 建立防火牆規則

查看有無建立iptables

sudo iptables -L

建立一個新檔案 iptables.firewall.rules

sudo vim /etc/iptables.firewall.rules 

內容如下

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

規則只開放 80(http), 443(https), SSH(22), ICMP 服務

啟用規則

sudo iptables-restore < /etc/iptables.firewall.rules

最後是確保每次重開機都會載入這規則

sudo vi /etc/network/if-pre-up.d/firewall

內容如下

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.firewall.rules

更改檔案權限

sudo chmod +x /etc/network/if-pre-up.d/firewall

linode官方教學: https://www.linode.com/docs/security/securing-your-server

其他小技巧

把80port轉到5601

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 5601

清除規則

sudo iptables -F -t nat 
sudo iptables -F

 

 

linux 開機自動執行

vim /etc/rc.loca

加入想執行的系統指令

這樣在還沒登入時就會執行

自動關機

vim /etc/crontab

# m h dom mon dow user command
0   0 *       *       6       root reboot

星期六零晨0點0分重新開機

php-fpm和nginx 權限設定問題

php-fpm

修改/etc/php5/fpm/pool.d/www.conf

user = www-data 改為 user = ken

group = www-data 改為 group = user

listen.owner = www-data 改為 listen.owner = user

listen.group = www-data 改為 listen.group = user

nginx

修改/etc/nginx/nginx.conf

user www-data; 改為 user;

這樣就沒權限問題了