2017PHP開發(fā)者大會(huì)
寫在最前
大會(huì)干貨很多健爬,講師陣容也很強(qiáng)大控乾,一場(chǎng)接著一場(chǎng),連續(xù)兩天娜遵,還是學(xué)到了不少東西的蜕衡,用主持人的話說就是我們干貨很干,硬廣很硬
魔熏。不過竊以為講師里面還是夾雜了“合作方”的衷咽,推銷一些平臺(tái)和書籍,不過無傷大雅蒜绽,權(quán)作休息。
不過由于時(shí)間和地點(diǎn)的原因不少朋友沒能及時(shí)參加桶现,今年也不知道是否會(huì)有大會(huì)視頻躲雅,所以我打算根據(jù)現(xiàn)場(chǎng)朋友用打賞堆出來的排名來對(duì)大會(huì)進(jìn)行一個(gè)簡(jiǎn)單的總結(jié),自己復(fù)習(xí)鞏固一下骡和,也希望能給其他人一些幫助相赁。
瓜子后端技術(shù)架構(gòu)的變遷(紀(jì)鵬程)
這個(gè)分享是熱度最高的相寇,原因可能在于它是最接地氣的。不僅完整的介紹了瓜子二手車架構(gòu)一步步由小到大的發(fā)展過程钮科,以及這期間的經(jīng)驗(yàn)教訓(xùn)唤衫,還逐條分享了各種最佳實(shí)踐,可以說他的分享基本可以指導(dǎo)一個(gè)新興業(yè)務(wù)绵脯,技術(shù)架構(gòu)的快速發(fā)展方向佳励。
石器時(shí)代,業(yè)務(wù)發(fā)展早期
這段時(shí)期的第一目的蛆挫、最高目的是活下去
技術(shù)人員要把精力集中在業(yè)務(wù)上赃承,快速迭代,實(shí)時(shí)響應(yīng)業(yè)務(wù)需求悴侵,可能要做不少Quick but dirty work
瞧剖。此時(shí)也不要忙著造輪子和優(yōu)化,能花錢買就花錢買可免,能用開源的就用開源的
過早優(yōu)化和造輪子是萬惡之源 —— 尼古拉斯·趙四
也不要著急上緩存抓于。一是多一層依賴就多一層的風(fēng)險(xiǎn),早期快速迭代時(shí)浇借,盡量保持架構(gòu)的簡(jiǎn)單毡咏。二是緩存可能隱藏掉一些代碼性能、邏輯缺陷逮刨,導(dǎo)致一些性能問題可能到架構(gòu)復(fù)雜到一定程度時(shí)才暴露出來呕缭,此時(shí)的修改的成本就十分高昂了。
盡早確定數(shù)據(jù)庫規(guī)范修己、數(shù)據(jù)字典恢总。因?yàn)樵诤笃跇I(yè)務(wù)代碼還有修改空間,底層數(shù)據(jù)庫和一些約定一旦養(yǎng)成是很難改動(dòng)的睬愤。
保密工作也要做好片仿。對(duì)外開放的數(shù)據(jù)一定要做好加密和脫敏工作,前期激烈競(jìng)爭(zhēng)階段尤辱,一個(gè)泄密可能拖垮一個(gè)公司砂豌。
這個(gè)階段的問題也很突出。代碼質(zhì)量差光督,文檔缺失阳距,新人上手難度高〗峤瑁基礎(chǔ)服務(wù)脆弱筐摘,缺少各種管理平臺(tái)(日志、部署)。不過沒關(guān)系咖熟,堅(jiān)持過這個(gè)階段圃酵,業(yè)務(wù)只要能活下來,這些問題都不是問題馍管。
鐵器時(shí)代郭赐,業(yè)務(wù)發(fā)展期
熬過業(yè)務(wù)早期,進(jìn)入快速發(fā)展階段后确沸,業(yè)務(wù)種類與規(guī)模會(huì)迅速增加捌锭,各種通用服務(wù)的重要性也逐漸顯現(xiàn),同時(shí)用戶量也會(huì)大幅增長张惹,服務(wù)性能壓力開始出現(xiàn)舀锨。這個(gè)時(shí)期的架構(gòu)也要做出相應(yīng)的調(diào)整。
- 業(yè)務(wù)拆分宛逗。包括代碼和數(shù)據(jù)庫坎匿,業(yè)務(wù)之間通過http接口調(diào)用
- redis集群。使用Twemproxy來做中間代理
- php性能監(jiān)控雷激。使用xhprof和各種日志替蔬,指定統(tǒng)一的日志規(guī)范
這個(gè)階段常見的問題是,業(yè)務(wù)快速調(diào)整屎暇,接口混亂承桥,調(diào)用方式混亂、性能缺乏監(jiān)控根悼;還缺少可靠的持續(xù)交付流程
蒸汽時(shí)代凶异,業(yè)務(wù)穩(wěn)定期
各項(xiàng)業(yè)務(wù)逐漸穩(wěn)定,各種痛點(diǎn)持續(xù)的暴露挤巡。
- 業(yè)務(wù)進(jìn)行細(xì)分剩彬,通用服務(wù)、業(yè)務(wù)獨(dú)立管理矿卑。
- 統(tǒng)一的接口調(diào)用方式喉恋,性能監(jiān)控。
- 規(guī)范持續(xù)交付流程母廷,代碼的上線轻黑、回滾,數(shù)據(jù)庫的建立琴昆、評(píng)審氓鄙,統(tǒng)一的監(jiān)控、測(cè)試框架椎咧,代碼之間的隔離
- 健壯的第三方玖详,一些通用平臺(tái)沒必要由專人維護(hù)把介,可以使用第三方平臺(tái)勤讽,不過最好同時(shí)使用多家
工作效率實(shí)踐
本部分講師分享了實(shí)踐過程中能夠提高效率一些經(jīng)驗(yàn)方法蟋座,比較實(shí)用
代碼的藝術(shù)
- 代碼分層,遵循psr1 psr2 psr4規(guī)范
- 代碼提交添加統(tǒng)一hook脚牍,控制格式
- compsor向臀,包括封裝公司的內(nèi)部庫
單測(cè)
單測(cè)的重要性被反復(fù)提及。完整的單測(cè)是代碼發(fā)布诸狭、升級(jí)的重要支撐券膀。尤其是核心代碼,覆蓋率要保證驯遇。這里他推薦使用PATest代替PHPUnit作為主要單測(cè)工具
RPC
業(yè)務(wù)龐大后RPC的場(chǎng)景必不可少芹彬。最重要最基本的要求是調(diào)用方式統(tǒng)一。業(yè)界通用的解決方案一般是使用http接口叉庐,他們使用了guzzle
基礎(chǔ)上進(jìn)行封裝舒帮,支持了簽名、并發(fā)請(qǐng)求和超時(shí)設(shè)置陡叠。另一個(gè)常用的方案是鳥哥開源的Yar
最后再啰嗦一句玩郊。RPC方法一定要跟普通的方法有明確區(qū)別!M髡蟆译红!
,否則可能被誤用兴溜、濫用
服務(wù)解耦
服務(wù)級(jí)別侦厚,Rabbitmq & Kafka
數(shù)據(jù)表級(jí)別,Canal+Kafka
前后端分離
使用nodejs負(fù)責(zé)UI層展示與數(shù)據(jù)準(zhǔn)備拙徽。php則負(fù)責(zé)業(yè)務(wù)邏輯與架構(gòu)刨沦。明確職責(zé)范圍,提高各自效率斋攀。
THE NEXT GENERATION OF PHP(惠新宸)
鳥哥本次分享的主要內(nèi)容是已卷,在php7發(fā)布的這兩年期間他們的主要工作,包括release的7.1和正在開發(fā)中的jit分支淳蔼。說實(shí)話侧蘸,由于本人水平有限,鳥哥分享的內(nèi)容只能大概聽懂意思鹉梨,知道他們?cè)谧鍪裁椿浒唧w原理細(xì)節(jié),鳥哥分享的我還真聽不懂存皂。這里就對(duì)鳥哥的分享內(nèi)容做個(gè)總結(jié)晌坤。
php7之后還有什么逢艘?JIT
php7于15年正式發(fā)布,他的最大賣點(diǎn)是骤菠,無感知的100%性能提升它改,包含了運(yùn)行速度與內(nèi)存消耗。那么在此之后php該往哪里發(fā)展呢商乎?目前已經(jīng)在開發(fā)的一個(gè)大方向就是JIT
JIT是什么央拖?為什么是JIT?
鳥哥并沒有做過多的解釋鹉戚。我就談一些我的膚淺認(rèn)識(shí)鲜戒,給phper們提供些參考。
首先JIT(just in time)并非是新技術(shù)抹凳,一大批語言如java早已實(shí)現(xiàn)遏餐。JIT的思想很簡(jiǎn)單,即在程序運(yùn)行時(shí)動(dòng)態(tài)對(duì)程序進(jìn)行編譯赢底,生成平臺(tái)相關(guān)的機(jī)器碼失都,從而加快程序運(yùn)行速度。
php文件的執(zhí)行流程大致是首先引擎加載php文件颖系,解釋器逐條解釋執(zhí)行代碼嗅剖。引入JIT后,前面一樣嘁扼,重點(diǎn)是JIT編譯器會(huì)根據(jù)Runtime信息對(duì)熱點(diǎn)代碼進(jìn)行動(dòng)態(tài)編譯生成機(jī)器碼信粮,然后這部分代碼以后就可以直接執(zhí)行了,而不需要解釋器逐條解釋執(zhí)行了趁啸,運(yùn)行效率便得到了提升
看到這里不知道大家是否和我有一樣的疑問强缘,既然編譯為機(jī)器碼執(zhí)行的效率那么高,為何不在項(xiàng)目正式部署前全部進(jìn)行編譯不傅,何必在運(yùn)行時(shí)編譯旅掂?
要知道運(yùn)行時(shí)編譯也會(huì)增加程序的執(zhí)行時(shí)間的。我在查閱了一些資料和一番思考后访娶,有以下一些淺見
代碼發(fā)布前先編譯商虐,是比JIT更早的通用辦法,稱為AOT(ahead of time)
崖疤,c語言便是這種執(zhí)行模式秘车。關(guān)于這兩種模式孰優(yōu)孰劣,學(xué)術(shù)界一直爭(zhēng)論不休劫哼,目前也沒有定論叮趴。但JIT相比AOT有這樣幾個(gè)優(yōu)點(diǎn)
- 發(fā)布速度快。不用每次都編譯权烧,發(fā)布速度自然快
- 優(yōu)化效率更好眯亦。因?yàn)镴IT是基于Runtime信息伤溉,比AOT更“了解”代碼,優(yōu)化的效率更好妻率。比如分析Runtime得知某個(gè)變量雖然聲明是10個(gè)字節(jié)乱顾,但運(yùn)行過程中一直是1個(gè)字節(jié),那么就可以減小程序內(nèi)存消耗舌涨;再比如某段代碼始終未被執(zhí)行糯耍,JIT則可以直接將其忽略
- 粒度更精細(xì)扔字。JIT可以只針對(duì)hotspot(熱點(diǎn))進(jìn)行編譯囊嘉,熱點(diǎn)可能是一個(gè)函數(shù)或者只是一個(gè)代碼段
- 對(duì)碼農(nóng)透明。JIT無須碼農(nóng)自己對(duì)程序根據(jù)不同平臺(tái)進(jìn)行編譯發(fā)布革为,只需要寫高級(jí)代碼即可
基于以上幾個(gè)優(yōu)點(diǎn)扭粱,再結(jié)合php一貫的簡(jiǎn)單易用原則,我想JIT確實(shí)是不錯(cuò)的選擇震檩。不過php也是支持AOT的琢蛤,有興趣的同學(xué)可以查一下。
但JIT技術(shù)也絕不是靈丹妙藥抛虏,即便是編譯也是需要時(shí)間的博其,當(dāng)代碼編譯的時(shí)間消耗大于運(yùn)行收益時(shí),程序反而會(huì)變慢迂猴!
會(huì)有這種情況嗎慕淡?有的,比如某個(gè)項(xiàng)目中沸毁,熱點(diǎn)并不明顯峰髓,JIT編譯的代碼執(zhí)行次數(shù)都很少,那么編譯帶來的收益是有可能小于編譯本身的消耗的
以下是在標(biāo)準(zhǔn)測(cè)試中引入JIT技術(shù)后息尺,php運(yùn)行效率比7.2有100%的性能提升携兵,不過在實(shí)際生產(chǎn)環(huán)境中效果不會(huì)有這么好
php7.1做了什么?類型預(yù)測(cè)
php要想實(shí)現(xiàn)JIT搂誉,有一個(gè)難題必須解決徐紧,那就是變量的類型預(yù)測(cè)
。試想如果在動(dòng)態(tài)編譯時(shí)還要進(jìn)行大量的類型檢查炭懊,性能將會(huì)大打折扣并级。php7中已經(jīng)可以對(duì)變量類型進(jìn)行控制,7.1則是更加完善了這個(gè)機(jī)制凛虽,可以說目前php已經(jīng)是半強(qiáng)類型語言了死遭。但由于php的弱類型歷史,仍有大量代碼運(yùn)行前是無法得知變量類型的凯旋,所以在7.1中鳥哥進(jìn)行了大量變量類型預(yù)測(cè)的工作呀潭,為后續(xù)JIT打基礎(chǔ)
變量預(yù)測(cè)
比較簡(jiǎn)單的一種辦法是數(shù)據(jù)流分析钉迷,即分析代碼的上下文,推斷出變量的可能類型钠署,比如
function calc ($a1, $b2) { // $a1: [ANY], $b2: [ANY]
$T3 = $a1 * 2; // $T3: [LONG, DOUBLE]
$a4 = $T3 % 1000; // $a4: [LONG]
$T5 = $b2 * 3; // $T5: [LONG, DOUBLE]
$b6 = $T5 % 1000; // $b6: [LONG]
$T7 = $a4 + $b6; // $T7: [LONG, DOUBLE]
return $T7;
}
其實(shí)這還是很困難的糠聪,鳥哥列舉了一些開發(fā)過程中遇到的困難。比如變量的變量谐鼎,$$var_name
舰蟆,或者頂層代碼(即寫在函數(shù)和類之外的代碼)等等。php的歷史包袱還是很重的狸棍。解決這些問題的簡(jiǎn)單辦法就是強(qiáng)類型身害,但這又會(huì)降低開發(fā)效率,因?yàn)閮?yōu)化而影響phper的開發(fā)效率
這是鳥哥所不愿意的草戈,他認(rèn)為業(yè)務(wù)永遠(yuǎn)是優(yōu)先的塌鸯,優(yōu)化只是支線
目前鳥哥的解決辦法就是對(duì)JIT進(jìn)行分級(jí),通過配置實(shí)現(xiàn)不同程度的動(dòng)態(tài)編譯唐片,從而降低類型預(yù)測(cè)的難度丙猬。另外就是針對(duì)具體的場(chǎng)景,進(jìn)行垂直優(yōu)化
問答環(huán)節(jié)
鳥哥的問答環(huán)節(jié)也非常精彩费韭,原定一小時(shí)的分享最終超了一小時(shí)茧球,下面我就憑著記憶對(duì)一些問題復(fù)現(xiàn)一下,可能存在偏差星持,將來我可不負(fù)責(zé)
php7.1那個(gè)詭異的函數(shù)返回類型限定是如何考慮的抢埋?
鳥哥:沒什么特別考慮,投票投出來的钉汗。首先說明一點(diǎn)羹令,我投的是反對(duì)票。包括php的命名空間反斜杠我也是非常反對(duì)的损痰,但可能由于我并沒有對(duì)這方面太深的認(rèn)識(shí)福侈,沒有理解其他開發(fā)者的意圖。不過這些問題用習(xí)慣了也不是什么大的問題
升級(jí)php7后卢未,遇到了一個(gè)詭異的引用計(jì)數(shù)的問題肪凛。具體記不清了,大致是他們發(fā)現(xiàn)有個(gè)應(yīng)該回收的變量在升級(jí)后沒有回收
鳥哥:我現(xiàn)在不能給你準(zhǔn)確答復(fù)辽社,有可能是個(gè)bug伟墙,這個(gè)我隨后跟進(jìn)一下。但我想說的是你剛才介紹了你們?cè)谡{(diào)試過程中對(duì)引用數(shù)的反復(fù)推算滴铅,其實(shí)不必糾結(jié)這戳葵,引用數(shù)用于垃圾回收時(shí)只有0和非0兩種區(qū)別,我們?cè)谠黾右糜?jì)數(shù)時(shí)可能有時(shí)候不是加1汉匙,而是加2拱烁,所以不要太在意具體是多少生蚁,確定大于0就行
一位學(xué)生提問者表示自己對(duì)高并發(fā)、分布式感興趣戏自,如何提升這方面的技能呢邦投?
鳥哥:這里你有一個(gè)誤區(qū)。我們研究學(xué)習(xí)技術(shù)并不是為了學(xué)習(xí)而學(xué)習(xí)擅笔,而是為了解決實(shí)際的業(yè)務(wù)問題志衣。你沒有接觸過這方面的業(yè)務(wù),自然沒有這方面的經(jīng)驗(yàn)猛们,等你真正有這個(gè)業(yè)務(wù)需求時(shí)念脯,好多東西原理都很簡(jiǎn)單,使用方法也很成熟阅懦,自然就會(huì)了和二,這是個(gè)水到渠成的過程,不必刻意去追求那個(gè)“術(shù)”耳胎。另外,我多說一句是惕它,其實(shí)當(dāng)你真正處在這樣的業(yè)務(wù)中時(shí)怕午,你會(huì)發(fā)現(xiàn)這些事情很少需要你操心的,OP通過各種集群就已經(jīng)把這些問題給屏蔽了淹魄。
鳥哥你是怎樣看待php的前景呢郁惜?現(xiàn)在黑php的這么多人
鳥哥:php的前景不要問我,要問你和我甲锡,整個(gè)php生態(tài)兆蕉。天峰貢獻(xiàn)一個(gè)swoole,php就有了高性能網(wǎng)絡(luò)請(qǐng)求功能缤沦,xx貢獻(xiàn)個(gè)php-ml虎韵,php就有了大數(shù)據(jù)處理功能,我今天貢獻(xiàn)一個(gè)jit缸废,php就有了動(dòng)態(tài)編譯能力包蓝。php發(fā)展到今天就是大家你一個(gè)小貢獻(xiàn),他一個(gè)小貢獻(xiàn)積累出來的企量,所以php的前景好不好测萎,要看我們生態(tài),也希望大家踴躍貢獻(xiàn)届巩。至于黑php硅瞧,我現(xiàn)在都懶得反駁了,有句話說的好恕汇,“黑php之前腕唧,先數(shù)數(shù)他給你掙了多少錢”冒嫡,我一直認(rèn)為業(yè)務(wù)是技術(shù)存在的理由,能不能快速響應(yīng)需求四苇、實(shí)現(xiàn)業(yè)務(wù)才是最根本的孝凌。
目前php沒有連接池,非常不方便月腋,不知道官方是否有支持計(jì)劃蟀架?
鳥哥:目前沒有。不過這不正是一個(gè)給社區(qū)做貢獻(xiàn)的機(jī)會(huì)嗎榆骚?你們開發(fā)一個(gè)連接池片拍,貢獻(xiàn)到社區(qū)既方便了自己,也方便了大家妓肢。天峰昨天的分享PHP-X捌省,不就是為了這樣的事
鳥哥你是怎樣看待全棧工程師這個(gè)概念的?
鳥哥:我并不認(rèn)同這個(gè)概念碉钠,我認(rèn)為這是個(gè)偽命題纲缓。全棧這個(gè)概念最早是前端工程師提出來的,認(rèn)為從前端到后端這是“全椇胺希”祝高,但我理解的全棧應(yīng)該是對(duì)一個(gè)領(lǐng)域從底層原理到上層應(yīng)用,這不才更應(yīng)該叫做棧污筷?自稱全棧工程師的大部分屬于只對(duì)各個(gè)領(lǐng)域多少有些認(rèn)識(shí)而已工闺。優(yōu)秀的工程師不必刻意去追求全棧,你只需要在你的領(lǐng)域里不斷深入就行瓣蛀,深度達(dá)到了陆蟆,自然就有了廣度,廣度是深度的副產(chǎn)品
惋增,推而廣之叠殷,就是所謂的全棧工程師是當(dāng)你在一個(gè)領(lǐng)域深入到一定階段后的副產(chǎn)品,而不是刻意在各個(gè)領(lǐng)域?qū)W出來的
php7對(duì)性能壓榨已經(jīng)比較徹底了器腋,未來php是繼續(xù)提高性能呢溪猿,還是增加新的特性?
鳥哥:你想太多了纫塌,目前并未任何打算诊县。JIT開發(fā)就非常困難了,這個(gè)是否能夠成功還是未知數(shù)措左,下次大會(huì)如果JIT沒有完成依痊,我就沒啥可分享的了。
現(xiàn)在在北京很難安家,將來回到二三線城市胸嘁,php很難找工作瓶摆,不知道鳥哥有什么看法嗎?
鳥哥:不必過于擔(dān)心性宏,不光是程序猿群井,其實(shí)還有好多公司也很難承受一線城市的成本,也在不斷的往二三城市分流毫胜,所以找工作問題還是不大的书斜。另外至于你擔(dān)心php難找工作,那你可以換java酵使、換go啊荐吉,一個(gè)程序猿不應(yīng)該給自己打上標(biāo)簽,“xx程序猿”口渔,你作為一個(gè)工程師样屠,至少要精通3種以上的語言,而且要有良好的學(xué)習(xí)能力
鳥哥你是如何放松你的部下呢缺脉?會(huì)請(qǐng)他們?nèi)ゴ蟊=幔?/strong>
鳥哥:這個(gè)我沒太多經(jīng)驗(yàn)痪欲,不過就我自己來說,有時(shí)候加班多了還是比較累的枪向,我有段時(shí)間脖子特別疼勤揩,一周得去至少三次按摩院按摩才能緩解,當(dāng)然我說的是盲人按摩秘蛔。后來我真的研究了頸椎康復(fù)指南胧砰,不是開玩笑伶选,我是真研究了。人的腦袋大概12斤重干像,你想你整天頂個(gè)西瓜蛙埂,要是頸椎肌肉不行的話倦畅,能不難受嗎?所以我后來經(jīng)常去健身房绣的,鍛煉頸椎叠赐,后來才慢慢好了
使用c++11開發(fā)php7擴(kuò)展(韓天峰)
簡(jiǎn)單說就是天峰在多年的php擴(kuò)展開發(fā)中,感受到基于c的zend api十分不方便屡江,所以基于c++11對(duì)zend api進(jìn)行了封裝芭概,既降低了php擴(kuò)展的開發(fā)難度,提高了開發(fā)效率惩嘉,同時(shí)也為php帶了更多的想象空間罢洲,并把這個(gè)項(xiàng)目命名為php-x
什么是php擴(kuò)展?
定義
php本身是c語言開發(fā)的文黎,其實(shí)可以想象我們是使用php這個(gè)高級(jí)語言去驅(qū)動(dòng)一個(gè)c開發(fā)的引擎(zend engine)去做事情的惹苗。php擴(kuò)展就是允許我們使用c為整個(gè)引擎開發(fā)新的插件來擴(kuò)展php的功能殿较,比如網(wǎng)絡(luò)請(qǐng)求的curl擴(kuò)展,使用mysql的mysqli擴(kuò)展等桩蓉。這種機(jī)制有利于社區(qū)為php的發(fā)展添磚加瓦淋纲,可以說zend engine本身就是一個(gè)個(gè)插件堆積出來的
如何開發(fā)擴(kuò)展?
- 使用ext_skel生成擴(kuò)展開發(fā)骨架
- 編輯config.m4文件
- 在extension.h頭文件中定義擴(kuò)展函數(shù)
- 修改extension.c源文件院究,實(shí)現(xiàn)擴(kuò)展函數(shù)邏輯
- 利用phpize configure make & make install安裝擴(kuò)展
這樣當(dāng)php程序中調(diào)用擴(kuò)展函數(shù)時(shí)洽瞬,zend引擎會(huì)去調(diào)用你所開發(fā)的擴(kuò)展。當(dāng)然儡首,你在擴(kuò)展邏輯中只能使用c語言通過zend api來對(duì)傳入的php變量進(jìn)行解析片任、處理,最終再通過zend api返回php變量蔬胯,繼續(xù)原流程
目前擴(kuò)展開發(fā)有何痛點(diǎn)对供?
zend api不好用
- 大量使用宏
- api名稱太長,參數(shù)太多氛濒,容易出錯(cuò)
- api分散在眾多.h和.c文件中
- 需要精通c語言产场,大量的指針場(chǎng)景,容易出錯(cuò)
- 沒有任何舞竿,任何的教程或手冊(cè)京景!
古老的c語言
- 50年歷史的古老編程語言
- 面向過程的風(fēng)格,封裝性差
- 指針容易出錯(cuò)
- 缺少原生的數(shù)據(jù)結(jié)構(gòu)支持
- 僅適合編寫底層軟件
php-x做了哪些工作骗奖?
鑒于前面說的問題确徙,php-x使用c++11對(duì)zend api進(jìn)行了封裝,選擇c++11是因?yàn)?/p>
- c++是現(xiàn)代編程語言
- 面向?qū)ο箫L(fēng)格执桌,封裝性好
- 模板泛型編程
- STL容器
- 通用編程鄙皇,適用范圍廣
可以簡(jiǎn)單對(duì)比一下封裝后的代碼
// 變量操作
ZVAL_LONG(&a, 1234); // zend api
Variant a = 1234; // php-x
// 類型推斷
Z_TYPE_P(value) == IS_LONG; // zend api
value.isLong(); // php-x
// 類型轉(zhuǎn)換
convert_to_long(value); // zend api
value.toInt() // php-x
此外,php-x還提供了數(shù)組仰挣、字典伴逸、資源等多種常見數(shù)據(jù)結(jié)構(gòu)和方法封裝。而且還提供了在c++中嵌套php的功能
膘壶,c++中也可以訪問諸如_POST等上下文,配合通過php擴(kuò)展賦予了php調(diào)用c++的能力颓芭,實(shí)際上php-x完全打通了php與c++
實(shí)戰(zhàn)php7擴(kuò)展
本小節(jié)利用php-x實(shí)現(xiàn)一個(gè)擴(kuò)展my_ext顷锰,包含my_ext_class類和my_ext_test函數(shù),對(duì)php-x開發(fā)php7擴(kuò)展做一個(gè)簡(jiǎn)單的示例
php7擴(kuò)展注冊(cè)
PHPX_EXTENSION() {
Extension *extension = new Extension("my_ext", "0.0.1");
extension->onStart = [extension]() {
extension->registerConstant("MY_EXT_VERSION", "0.0.1");
extension->registerClass(my_ext_class);
};
extension->registerFunction(PHPX_FN(my_ext_test));
return extension;
}
實(shí)現(xiàn)擴(kuò)展函數(shù)
PHPX_FUNCTION(my_ext_test) {
for (int i = 0; i < args.count(); i++) {
php::echo("arg[%d] type is %d\n", i, args[i].type());
}
Variant v1 = arg[0];
Array arr(v1);
arr.set(1, 'efg');
retval = arr;
}
實(shí)現(xiàn)擴(kuò)展類
Class *my_ext_class = new Class('myClass');
my_ext_class->addMethod(PHPX_ME(myClass, test), STATIC);
my_ext_class->addMethod(PHPX_ME(myClass, test2));
my_ext_class->addProperty('name', 'Rango');
extension->registerClass(my_ext_class);
實(shí)現(xiàn)類方法
PHPX_METHOND(myClass, test2) {
Variant res = newResource('String', new String('hello'));
_this.set('resource', res);
php::error(E_WARNING, 'err message');
}
注冊(cè)phpinfo
extension->info({'gtk support', 'enabled'}, {
{'author', 'Rango'},
{'version', ext->version},
});
然后和一般擴(kuò)展一樣編譯安裝就行
php的想象空間
php-x打通了php與c++畜伐,理論上c++可以做的事馍惹,php同樣也能做到。同時(shí)php擴(kuò)展的開發(fā)難度也大大降低,可以應(yīng)用于更多的場(chǎng)景
- 可以用c++擴(kuò)展實(shí)現(xiàn)多線程
- 程序中計(jì)算密集型部分可以輕松使用擴(kuò)展實(shí)現(xiàn)
- 可以通過擴(kuò)展加密商業(yè)軟件
- Fackbook万矾、Google悼吱、Microsoft、Tencent等巨頭的開源c++庫可以為php所用了
PHP安全開發(fā):從白帽角度做安全(湯青松)
本節(jié)講師分享了網(wǎng)絡(luò)安全現(xiàn)狀良狈,和常見的安全問題及應(yīng)對(duì)措施
嚴(yán)峻的現(xiàn)狀
目前網(wǎng)絡(luò)黑產(chǎn)發(fā)展迅速后添,聊天工具中搜索‘漏洞、低價(jià)薪丁、線報(bào)’能夠找到大量的賣家遇西。同時(shí)他表示他認(rèn)識(shí)一個(gè)17歲的小孩,不讀書严嗜,只做黑產(chǎn)粱檀,月入8k+
另一個(gè)是簡(jiǎn)單搜索會(huì)發(fā)現(xiàn),國內(nèi)開放3306端口的服務(wù)器數(shù)量有180萬之多漫玄。有500T以上的mysql數(shù)據(jù)庫此刻正在使用root賬號(hào)裸奔茄蚯!
漏洞的分類
講師對(duì)常見的漏洞進(jìn)行了分類,我感覺大致可以分為以下三類
- 代碼漏洞睦优。即你所寫的代碼沒有實(shí)現(xiàn)你的意圖渗常。可能是你水平不行汗盘,也可能是語言不行
- 邏輯漏洞皱碘。即你設(shè)計(jì)的業(yè)務(wù)邏輯存在你沒想到的情況
- 第三方漏洞。即你麻痹大意了隐孽,所托非人~
代碼漏洞
常見的代碼漏洞包括
- 代碼注入
- sql注入
- xss
- csrf
- 文件包含
- 命令執(zhí)行
總的來說癌椿,代碼漏洞主要原因是盲目相信用戶輸入
,一條安全口訣始終不能忘記就是用戶輸入菱阵、程序輸出始終過濾
如失。另外就是不必要的權(quán)限不要開,不使用的代碼不加載
比如代碼漏洞的一般防護(hù)措施是送粱,open_basedir限制程序訪問范圍,過濾點(diǎn)掂之、斜杠抗俄、反斜杠,禁止加載遠(yuǎn)程文件世舰,eval這種高危函數(shù)禁用动雹,使用代碼檢查工具如Taint
以下幾個(gè)環(huán)節(jié)是事故高發(fā)區(qū),應(yīng)著重檢查
- 文件上傳
- 全局變量
- 裸寫sql
- include參數(shù)文件
- 執(zhí)行參數(shù)代碼
邏輯漏洞
常見的邏輯漏洞包括
- 越權(quán)訪問
- 連續(xù)id暴露重要信息
- 身份認(rèn)證跟压、密碼找回
業(yè)務(wù)安全問題的幾個(gè)重災(zāi)區(qū)是
- 授權(quán)
- 身份認(rèn)證
- 用戶輸入限制
- 密碼找回
- 驗(yàn)證碼
據(jù)統(tǒng)計(jì)胰蝠,產(chǎn)品發(fā)布上線后的bug修復(fù)成本大約是開發(fā)階段的30倍!
第三方漏洞
我們?cè)谄綍r(shí)開發(fā)中會(huì)用到大量的第三方框架與類庫,雖然大部分都經(jīng)過了大量實(shí)戰(zhàn)測(cè)試茸塞,但仍然會(huì)時(shí)不時(shí)爆發(fā)漏洞躲庄,國內(nèi)常見的php框架ECshop,WordPress钾虐,Discuz噪窘,Dedecms,PHPcms等都曾報(bào)過漏洞效扫。此時(shí)我們更多需要做的是保證使用最新版倔监,保證第一時(shí)間修復(fù)漏洞
- 溯源檢查。代碼版本不能存在已知漏洞
- 版本更新菌仁。不要遺漏安全補(bǔ)丁更新
- 后臺(tái)隱藏浩习。不要使用默認(rèn)的地址與賬號(hào)密碼
查看一下16年國內(nèi)漏洞占比
最后,系統(tǒng)的安全性不是取決于最強(qiáng)的地方有多強(qiáng)济丘,而是取決于最弱的地方有多弱谱秽!
swoole2.0原生協(xié)程高性能開發(fā)實(shí)踐(思超)
該分享的主要學(xué)的是swoole1.0已經(jīng)實(shí)現(xiàn)了協(xié)程,不過是用yield和generator闪盔,來實(shí)現(xiàn)函數(shù)的中途退出與再入
但這樣存在很多問題弯院,如對(duì)程序員不透明,需要掌握yield和gen的用法泪掀,其次要求整個(gè)流程都要使用這種方式听绳。swoole2.0則是原生支持協(xié)程,使用新client可以方便的實(shí)現(xiàn)協(xié)程特性
mysql5.7不求人(葉金榮)
葉老師核心是講發(fā)布四年的5.7可以代替5.6了异赫,據(jù)官方測(cè)試椅挣,5.7的性能要優(yōu)于5.6三倍
5.7的主要特性包括
- 增加json數(shù)據(jù)類型
- 支持隱藏索引
- varchar可以動(dòng)態(tài)加長
- innodb讀性能優(yōu)化
- innodb支持全文索引
- innodb支持地理位置索引
- 默認(rèn)使用sql嚴(yán)格模式
- select支持超時(shí)設(shè)置
- 支持多主復(fù)制
- 更多詳情可以見另一篇mysql文章(mysql5.7特性分析)
是時(shí)候告別myisam了
最后,5.7的下一個(gè)版本將是8.0塔拳,也已經(jīng)開始進(jìn)入測(cè)試階段了