1. 程式人生 > >[PHP] 2018年終總結

[PHP] 2018年終總結

去掉敏感資訊後的不完整版

==========================================================================
2018年12月29日 記錄:

目前在維護的最低PHP版本只有5.6了:
1.5.6.39版本
convert.quoted-printable-encode過濾器時核心的segfault錯誤
imap擴充套件的錯誤
phar擴充套件的錯誤,PharData類提供了一個訪問和建立不可執行的tar和zip存檔的高階介面
5.6.38版本
apache2的頭資訊Transfer-Encoding:chunked的XSS bug
5.6.37版本
exif擴充套件修復了堆緩衝區溢位,exif擴充套件可以獲取影象元資料

 

==========================================================================
2018年12月28日 記錄:

mysqldump客戶端邏輯備份程式,可以生成一組sql或csv,文字,xml
1.如果不使用--single-transaction選項,mysqldump至少需要SELECT許可權,SHOW VIEW,TRIGGER和LOCK TABLES許可權
2.對於大規模備份和還原,物理備份更合適,以原始格式複製資料檔案,可以快速恢復
3.表主要是InnoDB表考慮使用MySQL Enterprise Backup產品的mysqlbackup命令;主要MyISAM表,考慮使用mysqlhotcopy
4.mysqldump預設是逐行檢索,要啟用記憶體緩衝,使用--skip-quick,此時如果是大表記憶體會可能有問題

join語法,外部連線優化:
如果LEFT JOIN中ON或USING部分中的右表沒有匹配的行,則將所有列設定為NULL的行用於右表。您可以使用此事實在表中查詢在另一個表中沒有對應項的行:
SELECT left_tbl.*
FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
WHERE right_tbl.id IS NULL;

==========================================================================
2018年12月27日 記錄:

1.vscode配置PHP IntelliSense

左下角齒輪==>settings==>extensions==>PHP==>
{
"php.executablePath": "D:/phpServer/php70n/php.exe"
}

2.log_format記錄post資料
log_format mail_test_log escape=json 'postdata= $request_body';
server {
access_log /var/log/nginx/default.access.log mail_test_log;
}

雙引號會被轉成\x22,escape=json可以解決
3.
nginx的內建變數
$time_local 格式化的時間
$request 請求地址
$status 響應碼
$body_bytes_sent 傳送頁面的位元組數
$http_referer 來源地址
$http_user_agent 客戶端UA
$document_root 當前檔案的目錄絕對地址,比如:/var/www/html
$fastcgi_script_name 當前url的絕對地址,比如:/info.php
$request_filename 當前請求檔案的絕對實體地址,基於root和alias指令,比如:/var/www/html/info.php
$http_cookie cookie資訊

4.nginx的if判斷語句
-e 檔案或目錄存在, !-e 檔案或目錄不存在,== 等值判斷 , ~正則匹配返回true(區分大小寫),~*正則匹配返回true(不區分大小寫)
-f 檔案是否存在,-x檔案是否可執行
5.
nginx的path_info傳遞過來的引數,列印$_SERVER
["PHP_SELF"]=>
string(17) "/index.php/232323"
["PATH_INFO"]=>
string(17) "/232323"


==========================================================================
2018年12月26日 記錄:

1.linux都會將記憶體充分利用,將一些程式呼叫過的硬碟資料讀入記憶體(buffer/cache);實體記憶體是真正的硬體提供的記憶體,虛擬記憶體是虛擬出的一塊邏輯記憶體,被稱為交換空間(swap space)
2.buffers和cached都是記憶體操作,儲存系統曾經開啟過的檔案以及檔案屬性資訊
3.buffers是緩衝塊裝置做的,只記錄檔案系統的元資料,cached是給檔案內容做緩衝
比如用find查詢後buffer大量增加;用cat讀取檔案後cached大量增加
4.記憶體釋放: /proc是虛擬檔案系統;可以通過修改他下面的檔案作為與kernel實體間進行通訊的手段
echo 3 >/proc/sys/vm/drop_caches

log_format指令:
"log_format" directive is not allowed here ,只能放在http塊下,不能放在server塊

==========================================================================
2018年12月25日 記錄:

1.
socket_create ( int $domain , int $type , int $protocol )
domain:
AF_INET基於IPv4的Internet協議。
AF_INET6基於IPv6的Internet協議。
AF_UNIX本地通訊協議族。高效率和低開銷使其成為IPC(程序間通訊)的一種很好的形式。
type:
SOCK_STREAM(TCP位元組流),SOCK_DGRAM(UDP資料報),SOCK_RAW(ICMP的ping程式)
protocol:
SOL_TCP,SOL_UDP
2.
getprotobyname()獲取下各個協議對應的數字
/etc/protocols 在這也能看到對應的數字
ip:0 icmp:1 ggp:3 tcp:6 egp:8 pup:12 udp:17 hmp:20 xns-idp:22 rdp:27

3.vim在當前行迅速插入到下一行,普通模式下按o
4.php.ini中的variables_order引數EGPCS (Environment, Get, Post, Cookie, and Server),會影響這些變數$_SERVER $_POST, $_ENV, $_GET, $_COOKIE
5.一個字串中關鍵詞會出現多次,我怎麼才能做到替換關鍵詞的時候 只替換一次,並且要隨機位置;explode拆分開,隨機拼新的字串進去
6.mysql使用各種字符集儲存資料,是一組符號和編碼,排序規則是用於比較字符集中的字元的一組規則,並根據各種排序規則進行比較

==========================================================================
2018年12月24日 記錄:

非同步 API 的設計:
POST /stars 直接返回成功和location欄位返回查詢進度的api
輪詢 GET /queue/12345,查詢當前的進度

redis的hash:
1.hmset user:1000 username taoshihan birthyear 1991 verified 1 //設定hash中的多個域
2.hget user:1000 username //hget是取回單個域
3.hgetall user:1000 //hgetall取回所有域
4.hmget user:1000 username birthyear //hmget取回多個域

1.NGINX Unit是個動態應用程式和web伺服器,可以在不中斷服務的情況下完成部署配置更改,以多種語言執行程式碼
2.共享記憶體是常用的程序間通訊,兩個程序可以直接共享訪問同一塊記憶體區域。Shared Memory沒有同步機制,需要自己協商處理
3.Buildroot使嵌入式Linux變得簡單

==========================================================================
2018年12月21日 記錄:

MySQL Native Driver,MySQLnd是用C語言編寫的PHP擴充套件。替代原來的(libmysqlclient)mysql client library

==========================================================================
2018年12月20日 記錄:

1.mysql資料庫的user表儲存了所有mysql賬號和密碼
2.show grants可以檢視所有贈予的許可權,使用revoke可以撤銷許可權
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION
GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION
sql注入漏洞和程式碼中的輸出有關

3.高位位元組M、低位位元組L:一個16位(雙位元組)的資料0x2211 22是高位位元組 11是低位位元組
32位的資料,比如 0x3F68415B 3f68是高位位元組 4158是低位位元組,這個資料被存到記憶體的時候有可能高位在前 高位優先 ,高位在後 低位優先
0x1234567的大端位元組序是0123 4567,小端位元組序是6745 2301

4.[^abc]正則是查詢所有不在中括號之間的字元,那麼[^ ]這個就是查詢所有不是空格的字元
5.通過人工建立一個根目錄,通常稱為(chroot)jail,你可以從根本上阻止程式訪問或者修改(可能是惡意的)檔案以外的目錄。
比如建立了這樣的目錄/home/sam/jail ,在jail使用者看來,他就是/
6.將include的檔案放在配置為拒絕Web伺服器訪問的資料夾中
禁止非法引用的簡單方式
<?php define('APPLICATION', true); ?> <?php if (!defined('APPLICATION')) exit; ?>
7.md5和sha1不適合密碼,MD5,SHA1和SHA256之類的雜湊演算法設計得非常快速和高效很容易被人暴力反解,兩個考慮因素是計算費用和鹽
crypt()函式

==========================================================================
2018年12月19日 記錄:


1.過濾shell命令中的特殊字元:
$a="`ifconfig`";
$a=escapeshellcmd($a);
$res=system($a);
var_dump($res);
shell_exec — 通過 shell 環境執行命令,並且將完整的輸出以字串的方式返回。

2.位元組:儲存容量的計量單位,一個位元組等於8位,0x2211是十六進位制是二進位制0b00100010 00010001,兩個8位也就是兩個位元組

3.mysql拆分字串的函式+計算字元長度的函式
select length(substring_index(path,"/",5)) from user;

 

5.
sqlmap.py -u "http://115.159.28.111/test/db.php?id=1" --batch --tables //列出所有的表
sqlmap.py -u "http://115.159.28.111/test/db.php?id=1" --batch --schema //列出所有表的表結構
sqlmap.py -u "http://115.159.28.111/test/db.php?id=1" --batch -D pan --dump -T drama //獲取表的資料
//設定cookie請求
sqlmap.py -u "http://entadmin.sina.net/control/mg_mlist.php?flag=1&id=&act=&flag=1&pagecount=20&pagetotal=&findval=2&findfld=findemail" --batch --tables --cookie "d=1; modewindow=PRINT; language=cn; mon=0; quotasize=10485760; SINA_USER=tony72%40luobo.sina.net; SPRIAL=b75abf80646ade46aabf8118653bb541; hpid=C6MTlB-rH1tylZsMzVsk6Vsy9YD_55tXp6D79UAMeTE_LTAx5TB-vUD05Yr_9T1nZIC0VUB05Y-aiLDNvUD79UAMeTE_LTA05L1j5KD_YU1nfTFyE41nfTFyE4vnWZD_pUrNtPDMlTDM9Y; SID=BbHkrkCZCwCMZlSED5lSTbT.%2154E.qlUET4U8%40KLb%214DE88ZETCE48T.T4.44CiZrSSL7-M47rDkll45SZSEZEZK7TZK4; sn=nWZD_pUrNtPDMlTDM9YC6MTlB-6om1nfTFyE4v; PHPSESSID=drcmfmv0truar5njqihhcmc627; __guid=216626370.578084966931658100.1545201942810.3057; monitor_count=1"


==========================================================================
2018年12月18日 記錄:

1.
xss攻擊一個常用的方法就是注入HTML元素執行js指令碼,前端展示時進行過濾
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">

 

3.
in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
第三個引數是true,就檢測型別,否則不檢測

4.array_flip — 交換陣列中的鍵和值,返回一個反轉後的 array,例如 array 中的鍵名變成了值,而 array 中的值成了鍵名。
$arr=array_flip($haystack);
if ( isset($arr[$needle]) ) 判斷是否存在在陣列中

5.array_map — 為陣列的每個元素應用回撥函式
因為in_array不區分大小寫,所以使用這個對陣列的所有元素轉成小寫
return in_array(strtolower($needle), array_map('strtolower', $haystack));

2019年2-7~9 陽光PHP峰會
API開發;中介軟體;安全;區塊鏈;DevOps;漸進式Web應用程式(PWA);持續交付;資料庫;
Javascript ;PHP核心;單元測試;UI / UX;非同步PHP;可擴充套件性;團隊開發

 

==========================================================================
2018年12月17日 記錄:

htmlentities — 將字元轉換為 HTML 轉義字元,對所有html實體轉義
htmlspecialchars只是對 < > " ' &進行轉義

 

==========================================================================
2018年12月14日 記錄:

 

查詢45天以前沒有登入的郵箱:
strtotime('-45day')

mysql輸入查詢:
SELECT VERSION(), CURRENT_DATE;

php mysql查詢超記憶體:
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);不快取結果
$sql = "select * from ent_lastlogin "
. "where time <'2018-10-30'";
$uresult = $db->query($sql);
if ($uresult) {
while ($r = $uresult->fetch(PDO::FETCH_ASSOC)) {}

==========================================================================
2018年12月13日 記錄:

 

1.PATH_INFO是一個CGI 1.1的標準,不要誤解為nginx的功能
2.PHP對該標準進行了支援,PHP中有兩個pathinfo,環境變數$_SERVER['PATH_INFO'];pathinfo() 函式
3.pathinfo() 函式以陣列的形式返回檔案路徑的資訊,先不管它
4.nginx的配置項是對$_SERVER['PATH_INFO]值進行設定,如果不配置預設是沒有的
5.因為路徑部分是這樣的index.php/111,所以location ~ \.php {} 把php後面的$必須以php結尾去掉
6.傳遞PATH_INFO引數:
fastcgi_param PATH_INFO $fastcgi_path_info; 此時
["PHP_SELF"]=>string(3) "NFO"
["PATH_INFO"]=>string(3) "NFO"
7.
fastcgi_split_path_info ^((?U).+.php)(/?.+)$;此時
["PATH_INFO"]=>"/111"
["PHP_SELF"]=>"/index.php/111"
8.重寫隱藏index.php,如果請求的是檔名才重寫
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
break;
}
此時:
["PATH_INFO"]=>"/111"
["PHP_SELF"]=>"/index.php/111"

GNU AWK 的使用者指南

==========================================================================
2018年12月12日 記錄:

 

除錯nginx rewrite
1.rewrite_log on;會發送相關notice日誌到error_log的檔案裡
2018/12/12 11:09:58 [notice] 10987#10987: *1 "info.html" matches "/info.html", client: 218.30.113.42, server: 115.159.28.111, request: "GET /info.html HTTP/1.1", host: "115.159.28.111"
2018/12/12 11:09:58 [notice] 10987#10987: *1 rewritten data: "/info.php", args: "", client: 218.30.113.42, server: 115.159.28.111, request: "GET /info.html HTTP/1.1", host: "115.159.28.111"
2.設定error_log的日誌級別為debug
3.只記錄自己的ip
events {
debug_connection 1.2.3.4;
}

凡人皆有一死 ,凡人皆須侍奉
動不動就覺得一年比一年差的,是因為你年齡一年比一年大了,越來越需要錢了,偏偏發現財富自由離自己太遠。
回到剛畢業的時候,就算變天了你還會覺得很興奮,百度一下“行業寒冬”,你就就會發現2014、2015、2016、2017、2018年年都寒冬。哪年不過冬了?哪年各位的薪資沒漲的?哪年各位生活質量有下降的?

==========================================================================
2018年12月11日 記錄:

postfix配置測試smtp
修改 /etc/postfix/transport
然後執行 postmap /etc/postfix/transport,
再執行postfix reload

 

1.PHP開發團隊宣佈即將推出PHP 7.0.33。此版本中修復了五個與安全相關的問題。
善惡的彼岸,當你凝視深淵時,深淵也在凝視著你。凡不能毀滅我的,必使我強大。
2.PHP的imap擴充套件安裝 apt-get install php-imap
版本7.0.33 18年12月6日
核心:修復了錯誤#77231(使用convert.quoted-printable-encode過濾器時的Segfault錯誤)。
IMAP:修正了錯誤#77020(imap_mail中的空指標取消引用)。
修復了錯誤#77153(imap_open允許通過mailbox引數執行任意shell命令)。
Phar:修復了錯誤#77022(PharData始終使用模式0666建立新檔案)。
修復了phar_parse_pharfile中的錯誤#77143(堆緩衝區溢位(READ:4))。
3.為了快速處理靜態資料集,例如伺服器名稱,對映指令的值,MIME型別,請求頭字串的名稱,nginx使用雜湊表。
4.access_log syslog:server=[2001:db8::1]:12345,facility=local7,tag=nginx,severity=info combined;配置nginx日誌到syslog

==========================================================================
2018年12月10日 記錄:

 

講清楚技術方案:
1.介紹需求背景
2.介紹整體技術方案
3.介紹協議和庫表結構

fpm:FastCGI Process Manager 是一種替代的PHP FastCGI實現,對於負載較重的站點非常有用。
1.先進的程序控制,優雅的停止啟動
2.能夠使用不同的uid/gid/chroot/environment啟動worker,使用不同的php.ini,監聽不同的埠
3.stdout stderr日誌記錄
4.opcode cache破壞的情況下緊急重啟
5.加速上傳支援
6.slowlog慢日誌記錄指令碼,可以記錄PHP跟蹤和遠端程序的execute_data, ptrace或者類似工具讀取和分析
7.fastcgi_finish_request()重新整理所有資料,當在做耗時操作的時候,比如視訊轉換和統計處理,在fastcgi_finish_request()之後,該指令碼仍將佔用FPM程序。因此,對於長時間執行的任務過度使用它可能會佔用所有FPM執行緒,直到pm.max_children
8.動態靜態子程序產生
9.基礎的SPAI狀態,基於php.ini的配置檔案

php-fpm開啟慢查詢日誌:
/etc/php/7.0/fpm/pool.d/www.conf
slowlog = /var/log/php-fpm-$pool.log.slow
request_slowlog_timeout = 5

 

1.MySQL伺服器支援200,000個表和大約5,000,000,000記錄,每個表最多支援64個索引。每個索引可以包含1到16列或部分列。 InnoDB表的最大索引寬度為767位元組或3072位元組
2.mysqldump和mysqladmin,以及圖形程式,如MySQL Workbench。 MySQL Server內建支援SQL語句來檢查,優化和修復表。通過mysqlcheck客戶端獲得。 myisamchk,這是一個非常快速的命令列實用程式,用於在MyISAM表上執行這些操作。
3.mysql8.0 mysql系統資料庫中的授權表現在是InnoDB(事務)表,可以回滾。以前,是MyISAM(非事務)表
4.caching_sha2_password身份驗證外掛,實現了SHA-256密碼雜湊,使用快取來解決延遲問題
5.MySQL現在支援角色,這些角色被命名為特權集合
6.MySQL現在維護有關密碼歷史的資訊,從而限制了以前密碼的重用

 

==========================================================================
2018年12月7日 記錄:

nginx可以用訊號控制:
kill -s HUP 8587 將HUP訊號傳送到主程序,使用新配置啟動新的工作程序,正常關閉舊工作程序,即開啟日誌檔案和新的偵聽套接字。
kill -s USR2 8587 即時升級可執行檔案

匯入群發列表時有^M特殊字元:
$outEmail=(string)trim($outEmail); 強制轉一下

1.vmstat指令檢視作業系統每秒程序切換的次數。system-- -----in 每秒中斷;cs 每秒上下文切換 數量
2.pcntl沒有提供程序間通訊的功能
pcntl不支援重定向標準輸入和輸出
pcntl只提供了fork這樣原始的介面,容易使用錯誤


==========================================================================
2018年12月6日 記錄:

RUP:統一軟體開發過程,面向物件基於網路的程式開發方法論
UML:統一建模語言
OO設計的基本原則
單一原則:一個類只做一件事
開閉原則:對擴充套件開放,對修改關閉
裡式替換:子類必須能夠替換所有父類的使用
依賴倒置:設計依賴於抽象而不是實現
最少知識:物件應當儘可能少的去了解其他物件
介面隔離:介面傾向於小而多
組合優先:優先使用類的組合而不是繼承
OOA面向物件分析 OOD面向物件設計 OOP面向物件程式設計

構造型設計模式:
單例模式,抽象工廠模式,構造者模式,原型模式,工廠方法模式

單例:
私有化構造方法
通過靜態方法建立並保持物件
注意例項化方法需要執行緒安全
private static $instance;private function __construct(){}
public static function getInstance(){
if(self::instance==null) self::instance=new self();
return self::instance;
}
適用場景:類的物件全域性唯一,節約頻繁建立物件的資源開銷,單例類必須是無狀態的

抽象工廠模式:
使用與實現分離,呼叫方只依賴於業務邏輯介面,與具體實現無關
剝離呼叫者和實現的耦合,應對變化,典型案例:JDBC API & Driver
interface UserRepository{}
interface RepositoryFactory{public function createUserRepository()}
class MysqlRepositoryFactory implements RepositoryFactory{}
class MySqlUserRepositoryFactory implements UserRepository{}

構造者模式:
用於建立一個複雜物件,一個物件需要依賴於大量外部物件或者其他設定引數,通過構造方法建立太複雜
物件的建立非常複雜,總是需要很多配置和預先建立其他物件
class Query{}
class QueryBuilder{ return $this}
(new QueryBuilder())->addSelect()->addWhere()->build()->getResult();

==========================================================================
2018年12月5日 記錄:

 

stream_get_meta_data - 從流/檔案指標中檢索標頭/元資料
返回結果:timed_out (bool)如果流在等待最後一次呼叫fread()或fgets()時的資料時超時,則為TRUE。

1.LVS可以使用IP負載平衡技術或應用級負載均衡技術。通過透明地新增或刪除叢集中的節點來實現系統的可伸縮性。
2.IPFW是比較老的Linux核心版本提供的防火牆軟體包,Ipchains替代Ipfwadm,提供了更為嚴格的包過濾控制機制,Iptables是一個管理核心包過濾的工具
3.基於DNS的負載均衡,不合適,不平衡,因為有TTL時間的存在,會有段時間每個使用者固定訪問某個IP
4.基於排程程式的負載均衡,分為兩個級別 應用級和IP級,應用級比如分配HTTP到叢集,當負載很高時,應用級將會成為新的瓶頸.IP級的開銷很小
5.有三種負載方法NAT(網路地址轉換),TUN(ip隧道),DR(直接路由);nat和fullnat的區別是解決了跨虛擬區域網的問題

=========================================================================
2018年12月4日 記錄:

 

1.LVS:Linux Virtual Server Linux虛擬伺服器,是一組伺服器,核心是ip_vs程式碼, 執行在LVS director,director是一個四層交換,相當於一個路由器,接收客戶端請求分配給後端realservers伺服器

2.網路地址轉換(NAT):內網的主機想通過網際網路被外網訪問,需要進行網路地址轉換;從一組地址到另一組叫N-to-N靜態網路地址轉換;當對映是M-to-N M>N時是動態網路地址轉換;網路地址埠對映是NAT的一個擴充套件,在這裡很多的地址和埠被對映到單個地址和埠,N-to-1的對映

 

==========================================================================
2018年12月3日 記錄:


1.DNS伺服器的IP地址:cat /etc/resolv.conf
2.DNS的通訊過程:
tcpdump -i eth0 -s 0 -n -l port 53

10:44:10.203166 IP 10.105.38.204.47751 > 10.236.158.114.53: 44627+ A? www.huiful.com. (32)
我的IP地址10.105.38.204埠47751向DNS伺服器的10.236.158.114埠53傳送請求
44627是我這個請求的標識,+代表啟用遞迴查詢,A?表示A型別的查詢,32代表DNS查詢報文長度

3.DNS的響應
10:44:10.203634 IP 10.236.158.114.53 > 10.105.38.204.47751: 44627 1/0/0 A 123.207.167.115 (48)
44627和請求對應,1/0/0 1個應答資源 0個授權記錄 0個額外資訊記錄 A記錄IP地址 48是報文長度

host -t A www.baidu.com的DNS查詢過程:
IP 10.105.38.204.39732 > 10.236.158.106.53: 11431+ A? www.baidu.com. (31)
IP 10.236.158.106.53 > 10.105.38.204.39732: 11431 3/0/0 CNAME www.a.shifen.com., A 115.239.210.27, A 115.239.211.112 (90)

4.TCP協議更靠近應用層,因此在程式中有更強的互操作性,一些socket選項都和TCP有關
5.TCP頭部資訊,TCP狀態轉移過程,TCP資料流(互動資料流,成塊資料流,緊急資料),TCP資料流的控制(超時重傳,擁塞控制)
6.TCP協議通訊必須先建立連線,連線是雙全工的,雙方的資料讀寫通過一個連線進行,交換完成後,都必須斷開連線.
7.TCP的連線是一對一的,因此基於廣播和多播(目標多個主機)的程式不能使用,udp非常適合廣播和多播
8.位元組流服務:傳送端執行多次寫操作,TCP模組先放入傳送緩衝區,真正傳送時可能被封裝成一個或多個TCP報文段發出;接收端先放入TCP接收緩衝區,然後再一次或多次讀出,使用者指定的程式讀緩衝區的大小
9.udp是資料報服務:傳送端每傳送一個,接收端就要接收一個
10.TCP頭部結構:指定源端埠,目的端埠,管理TCP連線

門診系統:
electron vue vuex 介面就是elementui

360瀏覽器側邊翻譯外掛

==========================================================================
2018年11月30日 記錄:

1.ICMP協議並非完全意義上的網路層協議,它使用同一層的IP協議提供的服務
2.傳輸層提供端到端(end to end)通訊,只關心起始端和目的端,與網路層使用逐跳不同
3.TCP協議為應用層提供可靠的面向連線的基於流的服務,使用超時重傳,資料確認保證可靠性,基於流的資料沒有長度邊界限制,源源不斷流入,讀出
4.UDP提供不可靠,無連線,基於資料報的服務
5.DNS協議即使用了TCP服務,又使用了UDP服務,/etc/services可以看到知名應用層協議,使用了哪些傳輸層協議
6.封裝,協議棧依次從上往下傳遞,每經過一層就加上自己的頭部資訊,TCP封裝後的有TCP頭部資訊,TCP核心緩衝區,共同構成了TCP報文段
7.資料鏈路層封裝的稱為幀,乙太網上的叫乙太網幀,令牌環網路上的則是令牌環幀
8.分用,協議棧自底向上依次傳遞
9.ARP協議可以將網路層地址到任意實體地址轉換,從IP地址到MAC地址轉換
10.ARP快取記憶體,把經常訪問的機器的IP地址到實體地址的對映快取起來,避免了重複的ARP請求

PCRE(Perl Compatible Regular Expressions)是一個Perl庫,包括 perl 相容的正則表示式庫。

==========================================================================
2018年11月29日 記錄:

PHP default_socket_timeout配置:
控制file_get_contents的超時時間

stream_socket_client ( string $remote_socket [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") [, int $flags = STREAM_CLIENT_CONNECT [, resource $context ]]]]] )

timeout
Number of seconds until the connect() system call should timeout.

1.從單頁應用(SPA)到伺服器渲染(SSR)
2.編譯器原理和技術涉及到程式設計語言,計算機體系結構,語言理論,演算法,軟體工程
3.編譯器是一個程式,將某種語言(源語言)編寫的程式翻譯成一個與之等價的另一種語言(目標語言)編寫的程式,翻譯的過程中可以報告錯誤,編譯器的早期工作集中在如何把算數表示式翻譯成機器程式碼

==========================================================================
2018年11月28日 記錄:

1.網路程式設計:通過計算機網路與其他程式通訊,相互通訊的程式中一方為client,一方為server
2.兩種網路程式設計API:socket和XTI,AT&T(美國電話電報公司)傳輸層介面TLI進行修改的產物
3.usenet新聞組就是論壇,ANSI C是美國國家標準組織(ANSI)和國際標準組織ISO推出的C語言標準
4.C語言標準化:ANSI C==>C89,C90差不多是一個==>C99==>C11
5.POSIX可移植作業系統介面,定義了作業系統應該為程式提供的介面標準,系統呼叫和庫函式只是實現上的細節不同,通常對開發人員是透明的
6.IPv6:網際網路工程任務組設計的新版本IP協議,號稱可以為每一粒沙子編上網址,IPv6長度128b,表示方法有,冒分十六進位制,0位壓縮表示法,內嵌IPv4地址表示法
7.web和伺服器通訊使用應用協議HTTP,在傳輸層使用TCP協議,TCP又使用了網路層IP協議,IP則使用了某種資料鏈路層通訊
8.兩個不同區域網的客戶和伺服器,使用路由器router連線到廣域網的,最大的廣域網是因特網


print_r(01234==1234) false,0開頭是八進位制,0x開頭是十六進位制,0b開頭是二進位制
yigoubao的密碼規則:md5(md5($password) . 'yoshop_salt_SmTRx')
php -r "echo md5(md5('admin123') . 'yoshop_salt_SmTRx');"

==========================================================================
2018年11月27日 記錄:

企管系統個性登入頁左側選單無法點選:
查詢樣式問題,在審查元素裡挨個刪除html元素,就能查詢到影響的div,進而定位到css

域名反向解析即從IP地址到域名的對映:
系統提供一個特別域,該特別域稱為逆向解析域

企管nginx改造:

==========================================================================
2018年11月26日 記錄:

系統開發統計讀取阿里雲的使用情況:

swoole的三種執行模式:base模式,執行緒模式,程序模式
IO:BIO阻塞IO;NIO非阻塞IO,同步IO;非同步IO
IO組合:同步阻塞IO;同步非阻塞IO;非同步阻塞IO;非同步非阻塞IO
IO操作:發起IO請求;實際IO操作
阻塞和非阻塞區別:第一步發起IO請求是否會被阻塞
同步和非同步區別:第二步實際IO讀寫是否會被阻塞

BIO:
while true
accept
多執行緒處理讀寫

PHP之道:https://laravel-china.github.io/php-the-right-way/

__set是個不存在的屬性賦值,兩個引數__set($k,$v),屬性名和屬性值
__get讀取不存在屬性時

$obj->test="aaa", __set("test",'aaa'),屬性中放個陣列,arr["test"]="aaa"
echo $obj->test ,__get("test"),arr["test"]


==========================================================================
2018年11月23日 記錄:

 

==========================================================================
2018年11月22日 記錄:

declare 結構用來設定一段程式碼的執行指令。declare 的語法和其它流程控制結構相似:
是一個在 declare 程式碼段中直譯器每執行 N 條可計時的低階語句就會發生的事件
declare(ticks=1);
PHP進行訊號管理,第二個引數是回撥函式:
pcntl_signal(SIGUSR1, "sig_handler");
給程序傳送訊號:
posix_kill ( int $pid , int $sig )

1.curl post資料:
curl "http://120.78.219.34:8018/accountapi/getSms" -d "tel=18812341234"
2.ab -r遇到socket錯誤時跳過

kill -l:linux程序的所有訊號

==========================================================================
2018年11月21日 記錄:

 

1.is_object — 檢測變數是否是一個物件
2.依賴注入,兩個類依賴的時候,需要建構函式裡傳進去,建構函式注入
3.控制反轉(IOC)是一種思想,依賴注入(DI)是實施這種思想的方法。
4.工廠模式注入,原本A類依賴B類和C類,現在變成了A依賴Factory,Factory依賴B和C。
5.高層模組不應該依賴於底層模組,兩個都應該依賴抽象。抽象不應該依賴於細節,細節應該依賴於抽象
6.1、IaaS(基礎設施即服務:Infrastructure as a Service)
2、PaaS(平臺即服務:Platform as a Service)
3、SaaS(軟體即服務:Software as a Service)
7.glusterFS 分散式檔案系統

==========================================================================
2018年11月20日 記錄:


sendid,mid
php魔術方法:
__construct()[構造], __destruct()[析構], __call()[呼叫不存在的方法], __callStatic()[呼叫不存在的靜態方法],
__get()[獲取不存在屬性的值], __set()[為不存在屬性賦值呼叫],
__isset()[isset不存在的屬性], __unset()[unset不存在的屬性], __sleep()[序列化物件的時候], __wakeup()[反序列化物件的時候], __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo()

1.file_put_contents — 將一個字串寫入檔案,LOCK_EX 在寫入時獲得一個獨佔鎖。
讀取時需要解鎖
$myfile=fopen('test.txt','rt');
flock($myfile,LOCK_SH);
$read=file_get_contents('test.txt');
2.PHP-AOP擴充套件,面向切面程式設計,非侵入式的程式設計方法aop_add_after()函式的使用

==========================================================================
2018年11月19日 記錄:

 

1.企郵日發信量100萬,計劃每天或每週一張表,根據sendid後面的日期進行對應
2.在讀信接口裡增加sendid欄位
2.給前端定義一個介面,maildeliverystatus,只有已傳送的郵件讀信時會去調,把sendid傳給我
3.我要拿著sendid去查表然後直接返回對應數字

c10k問題:單機一萬併發連線問題
1.如果一個連線就建立一個程序或執行緒,資源消耗巨大
2.非同步模式select/poll模型,select最大不能超過1024,poll沒有限制但是每次收到資料都要遍歷連線檢視哪個連線有資料請求
3.epoll依賴linux,只返回狀態變化的檔案控制代碼,不會去遍歷,效率更高了
4.libevent對事件介面進行了封裝
5.協程,c語言中的coroutine,go語言中的goroutine,在少量執行緒的基礎上進行排程

 

測試:單元測試,API測試,效能測試,持續整合,灰度釋出
單元測試:人為規定的最小的被測功能模組,c語言是一個函式,java是一個類,圖形軟體是一個視窗
API測試:定位是服務對外輸出的介面測試,偏重業務測試
效能測試:單介面壓測和模擬使用者行為的壓測,ab壓測,wrk壓測;loadrunner,jmeter

ubuntu使用者建立的目錄下用root建立檔案,ubuntu使用者可以刪除但是不能編輯覆蓋

==========================================================================
2018年11月16日 記錄:

 

100億的檔案統計ip的個數:
我設計一個簡單的雜湊函式是 f(ip) = ip % 10000,(ip 是個32位整數) 那麼 5 % 10000 = 5,不管 5 在哪個地方 5 % 10000 的結果都是 5,這就保證了相同的 ip 會被放在同一個子檔案中,方便統計,相同的元素經過同一個雜湊函式,得出的雜湊值是一樣的。 那麼我把100億個 ip,都進行 ip % 10000 的操作,就完成了 100GB 檔案分解成 10000個子檔案的任務了。當然實際中雜湊函式的選取很重要,儘量使得元素分佈均勻,雜湊衝突少的函式才是最好的。
10MB 的小檔案裡面存著很多 ip,他們雖然是亂序的,但是相同的 ip 會對映到同一個檔案中來! 那麼可以用二叉樹統計出現次數,二叉樹節點儲存(ip, count)的資訊,把所有 ip 插入到二叉樹中,如果這個 ip 不存在,那麼新建一個節點, count 標記 1,如果有,那麼把 count++,最終遍歷一遍樹,就能找出 count 最大的 ip 了
3.設計api問題
4.如何防止掃密碼
5.get和post的安全性問題和區別,長度的限制問題
6.
(1)http協議並未規定get和post的長度限制
(2)get的最大長度限制是因為瀏覽器和web伺服器限制了URL的長度
7.如果一直用同一個錯誤密碼,只計算一次,不會當成掃號。IP也不變的情況下
8.變數名隨機
建立一個jwt token,裡面繫結隨機碼
通過加密演算法產生變數名
賬號密碼token一起傳後臺
9.動態平臺在對北顯七層配置進行灰度變更時,由於Nginx服務埠配置檔案引用錯誤,導致七層流量分流錯誤,財經、郵箱等業務資料返回異常

==========================================================================
2018年11月15日 記錄:

1.mysql的批量更新用法 case when
UPDATE `post` SET
`parent_id` = CASE `id`
WHEN '1' THEN '100'
WHEN '2' THEN '100'
END,`title` = CASE `id`
WHEN '1' THEN 'A'
WHEN '2' THEN 'A'
END WHERE `id` IN ('1','2','3','4','5')
2.MySQL提示“too many connections” ,sleep的連線太多了
MySQL配置檔案/etc/my.cnf,設定成max_connections=1000,wait_timeout=5
3.MySQL server has gone away和wait_timeout有關係.兩次sql執行間隔時間太長
所以在new PDO的時候,要根據wait_timeout的值判斷,大於的就重新new,不大於的就單例返回
4.yield的生成器使用,每次只讀一行資料,記憶體中始終只佔一行資料
function readTxt(){
$handle = fopen("./test.txt", 'rb');
while (feof($handle)===false) {
yield fgets($handle);
}
fclose($handle);
}
foreach (readTxt() as $key => $value) {
echo $value.'<br />';
}

==========================================================================
2018年11月14日 記錄:

 

nginx改造:
1./mnt/entmail/webapp目錄許可權和nginx執行使用者許可權

3.php.ini 設定upload_tmp_dir="/temp"

cron的日誌位置/var/log/cron
開啟cron日誌:
vim /etc/rsyslog.d/50-default.conf
cron.* /var/log/cron.log

1.Epoll是poll的改進版,在高併發下能同時處理大量檔案描述符,nginx使用了
2.Poll是監控資源是否可用,輪詢整個檔案描述符集合,例如在多個socket連線建立後,可以知道哪些連線發了請求,與select比不會清空檔案描述符
3.Epoll只會查詢被核心IO事件喚醒的集合,只有發生IO的socket會呼叫callback函式
4.檔案描述符,一切皆檔案網路是檔案鍵盤是檔案,像寫檔案那樣傳輸網路資料,通過/proc/的檔案看到程序的資源使用情況
5.

==========================================================================
2018年11月13日 記錄:

 


File upload error - unable to create a temporary file
設定upload_tmp_dir="/temp" 然後重啟環境就可以了,如果還不行就去看看資料夾的許可權是否有許可權,賦予寫入許可權就好了

nginx的請求處理:
1.worker程序中有個函式,無限迴圈,不斷處理收到的客戶端請求,並進行處理
2.系統提供的事件處理機制(select/epoll/kqueue)
3.接收資料,初始化HTTP Request ,處理請求頭請求體
4.讀取配置檔案進行處理階段,location rewrite filter等
5.產生響應傳送給客戶端

php呼叫這個庫的應該都是短連結,然後這樣是否也會發生切換過程中,資料寫到老庫,沒有同步到新庫的情況
短連結是不會發生這種情況

==========================================================================
2018年11月12日 記錄:

Nginx 的特點:
1.處理靜態檔案
2.反向代理加速
3.fastCGI,簡單的負載均衡和容錯
4.模組化的結構
5.分階段資源分配技術,使得它的 CPU 與記憶體佔用率非常低,保持 10,000 個沒有活動的連線,它只佔 2.5M 記憶體
6.支援核心 Poll 模型,能經受高負載的考驗,有報告表明能支援高達 50,000 個併發連線數
7.採用 master-slave 模型,能夠充分利用 SMP 的優勢,且能夠減少工作程序在磁碟 I/O 的阻塞延遲。當採用 select()/poll() 呼叫時,還可以限制每個程序的連線數
8.強大的 Upstream 與 Filter 鏈,有點像 Unix 的管道
9.採用了一些 os 提供的最新特性如對 sendfile (Linux2.2+),accept-filter (FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支援

Nginx 架構:
1.預設採用多程序後臺模式啟動,可以手動配置成單程序前臺模式用於除錯,程序數一般和cpu核心數相同,太多程序會導致競爭cpu資源,帶來不必要的上下文切換
2.傳送kill -HUP pid的訊號給master程序,master程序會從新載入配置檔案,啟動新的worker程序,退出老的worker程序,也是-s reload所做的
3.在master程序建立好需要listen的 socket,然後fork出子程序,子程序搶accept_mutex的互斥鎖,搶到的子程序進行 accept處理
4.每個子程序採用非同步非阻塞事件處理, select/poll/epoll/kqueue的系統呼叫,設定超時時間,當事件沒準備好時,放到 epoll 裡面,事件準備好了,我們就去讀寫,當讀寫返回 EAGAIN(再試一次)時,我們將它再次加入到 epoll 裡面,執行緒還是隻有一個,在請求間進行不斷的迴圈切換,這裡的切換沒有代價,只要記憶體夠大就行
5.apache那種簡單的多執行緒,每個請求會獨佔一個工作執行緒,當併發數上到幾千時,就同時有幾千的執行緒在處理請求佔用記憶體大,執行緒間上下文切換佔用的cpu開銷大
6.事件處理通常包含,網路訊號(非同步非阻塞),訊號,定時器(放在一顆維護定時器的紅黑樹裡面)

nginx的connection
1.主程序監聽埠建立socket,fork出子程序,子程序互斥鎖競爭accept新的連線,三次握手建立連線以後,非同步非阻塞讀寫事件處理,nginx或客戶端主動關掉連線
2.每個程序都有連線數的限制,ulimit -n,超過時建立socket會失敗
3.nginx能建立的最大連線數 worker_連線數*worker_程序數;作為反向代理時則為worker_連線數*worker_程序數 /2 ,nginx也要請求另外的處理服務佔用一個連線
4.利用accept_mutex鎖來平衡每個worker程序的連線數

nginx與keepalive
1.http1.0和http1.1都支援長連線,預設1.0是關閉的,1.1是開啟的
2.http1.0需要指定Connection:keep-alive表示使用長連線,響應頭中會包含content-length,客戶端依據這個長度表示接收完成,否則會一直接收資料
3.http1.1不需要指定connection,響應頭中Transfer-encoding 為 chunked則會是流式傳輸,每塊會包含當前塊的長度;如果非chunked則要有content-length,否則會一直接收直到服務端主動斷開
4.keepalive_timeout 來配置超時時間,如果為0則會直接關閉,預設65秒

1.手寫票一般我們叫做“普通發票”,機打票叫做“增值稅普通發票”,發票需要去稅務局買
2.增值稅專用發票,可以進行稅款抵扣,需要提供企業名稱,納稅人識別號,地址,電話,開戶銀行,開戶賬號
3.增值稅普通發票提供納稅人識別號,企業擡頭

==========================================================================
2018年11月9日 記錄:

自動回覆的主題亂碼:
1.原信的主題沒有指定編碼
2.可能是qq郵箱的問題

100萬個URL如何找到出現頻率最高的前100個:
1.放到數組裡面,key是url,value是出現次數,排序
2.hash code 版本,hash和url關聯起來
3.資料庫實現法,偽雜湊索引

==========================================================================
2018年11月8日 記錄:

企郵webmail的跳轉部分
企郵web讀取阿里雲雙讀上線

得到等N位為1其它位為0的數,可用1左移N位即得
得到等N位為0其它位為1的數,用前數位反一下即得

修改指定狀態位為0,a&=~(1<<29)
修改指定狀態位為1,a|=1<<29

beyound compare比較
http://www.94afx.com/a/diannaoruanjian/beyondcompare4.html

==========================================================================
2018年11月7日 記錄:

HTTP message:HTTP報文,客戶端伺服器請求響應模型,是通過HTTP 報文的格式化資料塊進行的
HTTP method:HTTP方法
GET:客戶端向伺服器請求獲取資源
POST:客戶端傳送資料到服務端
PUT:客戶端將資料儲存到伺服器中去
DELETE:從服務端刪除命名資源
HEAD:客戶端獲取命名資源的HTTP頭資訊
HTTP/應用層==>TCP/傳輸層==>IP/網路層
HTTP/0.9 ==> HTTP/1.0 ==> HTTP/1.0+ ==>HTTP/1.1 ==> HTTP/2.0

web的結構元件:
1.代理:位於客戶端和伺服器之間,接收所有請求並轉發給伺服器
2.快取:代理快取或web快取,下一次請求是快取提供的服務
3.閘道器(gateway):將HTTP協議轉成其他協議的服務,例如:HTTP/FTP HTTP轉到PHP-FPM
4.隧道(tunnel):在HTTP連線上轉發非HTTP協議的資料,例如:HTTP/SSL 在HTTP連線上傳輸SSL資料

 

==========================================================================
2018年11月6日 記錄:

HTTP連線管理:
1.HTTP如何使用TCP連線的
2.TCP連線的時延,瓶頸,存在的障礙
3.HTTP的優化,並行連線,keep-alive,管道連線
4.HTTP就是HTTP over TCP over IP,HTTPS是HTTP和TCP之間插入放入TLS或者SSL
5.保持TCP連線的正確執行,四個值<源ip地址,源埠,目的ip,目的埠
6.HTTP時間線,請求=>DNS查詢=>響應=>請求=>伺服器處理=>響應=>關閉
7.TCP效能點:TCP連線建立握手(花費50%時間);
TCP延遲確認演算法(佔第二);
TIME_WAIT時延和埠耗盡(記錄最近所關閉連線的IP地址和埠號,2MSL通常2分鐘)
TCP慢啟動擁塞控制;資料聚集的Nagle演算法;

HTTP首部(head頭資訊)
1.通用首部:Date
通用快取首部(Cache-Control)
2.請求首部:Accept
條件請求首部(if-),安全請求首部(Authorization)
3.響應首部:Server
4.實體首部(用於主體部分的首部):content-type:
5.擴充套件首部:非標準的,自己定義的

PHP的指令碼執行還是會經過編譯環節, 只不過它們一般會在執行的時候實時進行編譯
1.啟動PHP及Zend引擎, 載入註冊的擴充套件模組
2.讀取指令碼檔案,Zend引擎對指令碼檔案進行詞法分析,語法分析。
3.編譯成opcode執行

阿里雲讀取附件部分的雙讀改造
測試外發限制部分,有24分鐘的快取時間,php -i|grep "gc_maxlifetime" 1440秒

route add -net 100.118.0.0/16 gw 172.16.228.1 新增網路

==========================================================================
2018年11月5日 記錄:

1.長連結和短連結的優缺點
2.tcp為啥是四次揮手
3.資料庫的幾大索引,聯合索引的最左原則,btree和二叉樹的區別
4.redis的底層資料型別,list,set
5.nginx的負載均衡策略,select和epoll的區別
6.統計日誌中IP訪問量前十的
7.PHP的執行過程opcode,生命週期
8.array函式shift和unshift的區別
9.手寫演算法順時針矩陣橫豎斜求和相等演算法
10.手寫二分查詢演算法
11.設計滴滴發單搶單檢視訂單系統,日活200w,redis掛了怎麼辦
12.設計銷售BD系統,釘釘考勤簽到功能實現,分級稽核等功能
13.設計通用稽核流的系統,請假啊 財務啊 之類的功能
14.rpc系統
15.http協議裡面的499

100:客戶端應該繼續傳送請求,表示伺服器已經接受到了,繼續請求
101:理解了客戶端請求,並通過Upgrade訊息頭通知客戶端採用新協議通訊,伺服器發完後會切換到新協議
102:由webdav(rfc2518)擴充套件的狀態碼,代表處理將被繼續執行
201:請求已經被實現,新的資源已經建立,uri隨location頭資訊返回
202:伺服器已經接受請求,但是不知道結果,非同步的時候使用
203:成功處理但是返回的實體頭部元資訊不是原始伺服器上的有效集合
204:成功處理,不返回實體,返回更新了的元資訊
205:和204差不多,要求請求者重置文件


4xx系列的錯誤碼是和客戶端有關的
nginx自定義的狀態碼:
495, https certificate error
496, https no certificate
497, http to https
498, canceled
499, client has closed connection是客戶端等到超時主動關掉的

 

1.分表的方式,是橫向還是縱向,是以使用者來分,還是以時間或者商家。 或者多維度,多維度的情況下,如何進行表資料之間的同步
2.查詢訂單,肯定是要有一定的時間限制,比如最近3個月的,其他的以一定的時間規則歸檔,查詢時候是進入另外的資料表查詢,沒法查全部
3.快取MEMCACHE 使用原子性操作add,實現併發鎖
4.遇到大的問題,那麼就縮小範圍,限制住他的思路

==========================================================================
2018年11月2日 記錄:

下午請假

==========================================================================
2018年11月1日 記錄:

nginx切換改造專案,https測試支援問題改造
1.訪問http://mail.sina.net
強制跳轉問題
資源路徑問題
頁面內連結問題

 

安卓問題:
客戶端現有問題是,修改密碼後還會呼叫登陸介面,沒有正常提示文字資訊,退出也退出不了


==========================================================================
2018年10月31日 記錄:

 

流媒體伺服器(Nginx+rtmp)
docker下安裝寶塔面板更安全

儲存伺服器-雲盤
分散式檔案系統
應用伺服器
web伺服器
資料庫平臺
反垃圾的閘道器服務
日誌伺服器-每天傳送一次,各web伺服器的syslog-ng

1.二叉查詢樹中的結點是2-結點(一個鍵兩條鏈),引入3-結點(兩個鍵三條鏈),即成2-3樹;然後將2-3樹中3-結點分解,即成紅黑樹,故結合二叉查詢樹易查詢和2-3樹易插入的特點,便成了紅黑二叉查詢樹,簡稱紅黑樹。
2.B樹每一個結點可以有幾個到幾千個孩子,降低樹的高度,減少磁碟io,頂部幾層被反覆查詢存在記憶體中,剩餘的存在磁碟中
3.含n個結點的b樹高度也是lgn,分支因子大,高度小很多,

==========================================================================
2018年10月30日 記錄:

明天導一下應該修改密碼的列表

 

排序演算法:
非線性比較類:
交換排序
冒泡:平均O(n^2),最壞O(n^2) 最好O(n) 空間O(1) 穩定
快速:平均O(nlogn),最壞O(n^2),平均O(nlogn),空間O(nlogn) 不穩定
插入排序
插入:平均O(n^2),最壞O(n^2) 最好O(n) 空間O(1) 穩定
希爾:平均O(n^1.3),最壞O(n^2),最好O(n),空間O(1) 不穩定
選擇排序
選擇:平均O(n^2),最壞O(n^2),最好O(n^2),空間O(1) 不穩定
堆 :平均O(nlogn),最壞O(nlogn),平均O(nlogn),空間O(1) 不穩定
歸併排序
二路歸併:平均O(nlogn),最壞O(nlogn),平均O(nlogn),空間O(1) 穩定
多路歸併
線性非比較類:
計數:平均O(n+k),最壞O(n+k),最好O(n+k),空間O(n+k) 穩定
桶:平均O(n+k),最壞O(n^2),最好O(n),空間O(n+k) 穩定
基數:平均O(n*k),最壞O(n*k),最好O(n*k),空間O(n+k) 穩定
穩定:原來a在b前面,a=b,排序後a任然在b前面 冒泡,插入,歸併,計數,桶,基數
不穩定:a=b,排序前a在b前面,排序後可能在後面,快速,希爾,選擇,堆
冒泡:
1.比較相鄰元素,從第一個開始較大的逐漸往後移動,後面是所有已經排好序的了
2.for{for{}},arr[j]>arr[j+1]
選擇:
1.兩層迴圈,假定第一層迴圈的i元素是最小值,
2.內層迴圈找出比i還小的元素,交換下他們

1.按位& | ~ ^ 與或非 異或
2.&與運算 0&0=0 1&0=0 1&1=1
3.fgetss函式的bug,遇到<會把後面的所有內容都替換成空白
4.rpm -q dpkg -L 兩個查詢包命令的

==========================================================================
2018年10月29日 記錄:

Redis Cluster的架構圖:REmote DIctionary Server。
1.所有的redis節點彼此互聯(PING-PONG機制)
2.節點的fail是通過叢集中超過半數的節點檢測失效時才生效
3.客戶端與redis節點直連,不需要中間proxy層
4.redis-cluster把所有的物理節點對映到[0-16383]slot上(雜湊槽)

Redis分散式鎖:不同的程序必須以獨佔資源的方式實現資源共享
https://github.com/ronnylt/redlock-php/
1.社群給了個redlock鎖的實現類
2.最低實現就是獨享,無死鎖,容錯
3.當前時間,隨機值,依次嘗試的實現

Redis與其他key-value儲存有什麼不同?
1.複雜的資料結構並且提供對他們的原子性操作
2.執行在記憶體中但是可以持久化到磁碟
3.鍵值對越多開銷越大,放到一個key裡就小很多
4.採用多個Redis節點通過客戶端Hash的辦法解決了大資料集分配的問題
5.訪問MySQL的資料只能通過主鍵(ID) 。執行查詢操作時,通過Redis讀取資料;使用redis的資料結構建立二級索引

分散式理解:
1.一個需要巨大資源的計算分成小的部分,分配給多臺獨立的伺服器,計算結果綜合後得到最終結果
2.分散式網路儲存技術是將資料分散的儲存於多臺獨立的機器裝置上

順時針列印矩陣:
1.行數和列數取出來row,col,圈數就是 (較小值-1)/2+1
2.外層迴圈控制圈數,內層四個for迴圈,i
3.第一個for迴圈,從左到右,j=i;j<col-i;j++;j<; arr[i][j]
4.第二個for迴圈,從上到下,k=i+1;k<row-i;k++; arr[k][col-1-i]
5.第三個迴圈,從右到左,m=col-2-i;m>=i&&row-1-i!=i;m-- arr[row-1-i][m]//row-1-i!=i單行的時候只打印一次
6.第四個迴圈,從下到上,n=row-2-i;n>=i&&col-1-i!=i;n-- arr[n][i]

編譯原理-有限自動機:
不確定的有限自動機(NFA),一種數學模型;確定的有限自動機(DFA),是NFA的特殊情況

==========================================================================
2018年10月26日 記錄:

根據企郵被禁用的發垃圾的賬號,查詢它們最近7天的海外SMTP登入IP(排除中國大陸和港澳臺以及查詢失敗的),
共45077個海外IP,已經全部查封。被查封的IP進行企郵SMTP/POP/IMAP登入均會失敗。

組合語言中有一種移位指令叫做迴圈左移(ROL),現在有個簡單的任務,就是用字串模擬這個指令的運算結果。對於一個給定的字元序列S,請你把其迴圈左移K位後的序列輸出。例如,字元序列S=”abcXYZdef”,要求輸出迴圈左移3位後的結果,即“XYZdefabc”。是不是很簡單?OK,搞定它!
1.字串翻轉,前n位取模長度,abc翻轉成cba 後面的翻轉成fedXYX ,然後再統一翻轉 XYZdefabc
2.第二種思路,字串複製一份拼接在一起,擷取從n開始到len長度的子字串,n也是要取模

當有一天我看到一棵奇怪的樹,第一反應是想拍下來給你看,我就知道大事不好了。
HRBP(HR BUSINESS PARTNER)

Electron使用 JavaScript, HTML 和 CSS 構建跨平臺的桌面應用

==========================================================================
2018年10月25日 記錄:

 

MYSQL隨機提取一條記錄:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。

常用的解決思路:
1.暴力窮舉(遞迴,回溯),n個數的全排列,八皇后問題
2.分治法(分而治之,然後歸併),空間換時間(活用雜湊表)
3.選擇合適的資料結構,尋找最小的k個數(堆代替陣列)
4.如果題目允許排序,優先排序,已經排好序的可以考慮二分
5.不改變佇列順序的貪心和動態規劃

1.回溯法,按照深度優先的原則從根結點出發搜尋解空間樹,總是先判斷該結點是否肯定不包含問題的解,如果肯定不包含,則跳過該結點為根的子樹搜尋,逐層向其祖先結點回溯,求問題的所有解時,要回溯到根,且根結點的所有子樹都已被搜尋才結束
2.用for迴圈+遞迴方式求解
for迴圈套在外層,表示遍歷陣列的第i個數字;內層遞迴表示結果list裡的第i個數字


==========================================================================
2018年10月24日 記錄:

 

前後端分離的驗證碼問題
1.生成驗證碼的數字存mememchache,key是唯一id 返給前端
2.驗證時,前端帶著id來 查詢對應的驗證碼申訴自

1.回溯法(探索與回溯法)是一種選優搜尋法,又稱為試探法,按選優條件向前搜尋,以達到目標,原先選擇並不優或達不到目標,就退回一步重新選擇
2.回溯法從根節點開始按深度優先搜尋策略形成的樹稱為狀態空間樹

==========================================================================
2018年10月23日 記錄:

企管呼叫mic的部分,ip改成域名的形式

輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。
思路:
1.利用遞迴形成遞迴樹,達到深度優先,固定首字母的效果
2.得復位以後才能再次深度優先
3.回溯法思想
4.一張圖和一個執行過程,只能慢慢體會了

mysql `updateDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
插入自動更新當前時間;更新自動更新當前時間

==========================================================================
2018年10月22日 記錄:

我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?斐波那契數列

1.堆(二叉堆):可以視為一棵完全的二叉樹,除了最底層之外,每一層都是滿的,這使得堆可以利用陣列來表示,每一個結點對應陣列中的一個元素
2.給出某個結點的下標,可以計算出父結點的和孩子結點的下標; parent(i)=floor(i/2) left(i)=2i right=2i+1
3.最大堆和最小堆,最大堆:根結點是最大值,最小堆:根結點是最小值
4.堆排序就是把最大堆堆頂的最大數取出,剩餘的堆繼續調整為最大堆,再次將堆頂的最大數取出,直到剩餘數只有一個結束
5.最大堆調整(維護最大堆,子節點永遠小於父結點) ;建立最大堆(把一個數組調整成最大堆的陣列);堆排序(建立最大堆,交換,維護最大堆)
maxHeapify (array,index,heapSize) //最大堆調整
iMax,iLeft,iRight
while true
iMax=index;iLeft=2*index+1;iRight=2*index+2
如果根結點小於左右子樹裡結點值,就交換一下這兩個值
利用第三方變數,交換下兩個值
buildMaxHeap(array) //建立最大堆,把一個數組調整成最大堆的陣列
iParent=floor((size-1)/2)
for i=iParent;i>=0;i--
maxHeapify (array,i,size)
sort(arr)
buildMaxHeap(array, heapSize);//建立最大堆
for (int i = heapSize - 1; i > 0; i--) {
swap(array, 0, i); //交換第一個和最後一個
maxHeapify(array, 0, i);//維護最大堆,size小了一個

==========================================================================
2018年10月19日 記錄:

 

字串的全排列:
1.輸入一個字串,輸出字串中字元的所有排列
2.從集合中依次選出每一個元素,作為排列的第一個元素,然後對剩餘的元素進行全排列,如此遞迴處理


==========================================================================
2018年10月18日 記錄:

 

判斷一個字串是否是迴文:
同時從字串頭尾往中間掃描字串,如果所有字元都一樣,就是一個迴文
start=0 end=str.size()
while(start<=end){
if str[start]!=str[end]
return false
++start
--end
}
最長迴文字串:
列舉中心位置

==========================================================================
2018年10月17日 記錄:

account物件儲存在session的memcache中,儲存時間是1440秒

==========================================================================
2018年10月16日 記錄:

 

最長公共子串和最長公共子序列

==========================================================================
2018年10月15日 記錄:

 

1.字串翻轉:
1.abcdef 轉成 defabc
2.abc-> cba def->fed
3.cbafed-> defabc
字串逆序的函式
while($from<$to){
$t=$str[$from];
$str[$from++]=$str[$to];
$str[$to--]=$t;
2.字串逆序的函式:
第一個字元和最後一個字元調換,第二和倒數第二調換,from++ to--,用一個temp臨時變數,while迴圈條件from<to
3.字串的逆序調整:
給定一個字串str,請在單詞間做逆序調整,舉例:
“pig loves dog”逆序成“dog loves pig”。
1.整個字串全部逆序 abc def => fed cba
2.遍歷,找到空格分隔,每一個單詞再次逆序 dfe abc
4.字串移位
給定一個字串str,以及一個整數i.i代表str中的位置,然後將str【0】到str【i】移動到字元的右側,將str【i】到str【n-1】的字串移動到左側。
就是上面的三步反轉字串
5.拼接最小字典序

==========================================================================
2018年10月12日 記錄:

 


==========================================================================
2018年10月11日 記錄:

 

請實現一個函式,將一個字串中的每個空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。

==========================================================================
2018年10月10日 記錄:

 

3.模板重複列印問題,檢視生成的php快取檔案,已經出現兩次了,很明顯就是多次include模板了
4.迪傑克斯拉演算法核心,一組包含已經找到最短路徑的頂點,另一組包含剩餘未確定最短路徑的頂點,以起始點為中心向外遍歷直到搜尋到終點為止,窮舉策略
P //最短路徑下標陣列
D //各點最短路徑的權值和
求v0到v的最短路徑P[v] 和 帶權長度 D[v]
for v=0;v<G.size;v++
final[v]=0 //未知最短路徑狀態
D[v] = G[v0][v] //與v0點有連線的頂點加上權值
P[v] =0
D[v0]=0 //v0到v0的路徑為0
final[v0]=1 //v0到v0不需要求路徑
for v=1;v<G.size;v++
min=65535

==========================================================================
2018年10月9日 記錄:

Redis hash 是一個string型別的field和value的對映表,hash特別適合用於儲存物件。
1.hmset clickcout ip "127.0.0.1" product_id "123" time "15234343434"
2.HGETALL clickcout

1.zadd clickcout 205 id_124
2..sort clickcout by id_* limit 0 10 desc


(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
1.強制關閉redis快照引起的
2.config set stop-writes-on-bgsave-error no


最短路徑問題的實際例子:
1.路程最短,時間最短,換乘最少,實際地圖場景比這些更復雜
2.非網圖可以理解為所有邊為1的網
3.迪傑斯特拉演算法是按照路徑長度遞增次序產生最短路徑的演算法,並不是一下子就求出v0到v8的最短路徑,而是一步一步求出他們之間頂點的最短路徑

 

==========================================================================
2018年10月8日 記錄:

同時包含數字、大寫字母、小寫字母、特殊字元中三種組合 70004
連續3位及以上數字不能連號(例如123、654)70005
連續3位及以上字母不能連續和相同(例如abc、cba aaa) 70006
密碼不包含賬號 70007
長度8到20位 70002

日誌業務的流程:
應用產生日誌→採集→傳輸→按需過濾與轉換→儲存→分析與檢視。
2.根據資料的不同維度,對資料進行分類、分級。例如:我們從日誌中區分error、info、和 debug
3.平臺擴充套件做加減法,我們在查詢時都增加分散式快取,縱向擴充套件:如增加擴充套件磁碟和記憶體。

JavaScript由三部分組成:
1. ECMAScript(核心)作為核心,它規定了語言的組成部分:語法、型別、語句、關鍵字、保留字、操作符、物件
2. DOM(文件物件模型)
3. BOM (瀏覽器物件模型)
4. ECMAScript第五個版本 ES6是第六個版本
5. ES6 塊級作用域 關鍵字let, 常量const,物件字面量的屬性賦值簡寫,賦值解構,函式引數 - 預設值、引數打包、 陣列展開(Default 、Rest 、Spread),
箭頭函式 Arrow functions,字串模板 Template strings,Iterators(迭代器)+ for..of,生成器 (Generators),class,Modules,Map + Set + WeakMap + WeakSet,Promises是處理非同步操作的物件,Symbol是一種基本型別通過呼叫symbol函式產生,Symbol是一種基本型別。Symbol 通過呼叫symbol函式產生

6.wepy小程式開發元件
7.Weex