現在PHP所面臨的問題
來自專欄一個程序員的成長
前言
有人說PHP過時了,有人說是腳本語言性能不好,有人說適用範圍太少了,還有人說內置函數命名風格不統一等等,並以此類問題來黑PHP,PHP這門語言是有上述諸多問題,但是只說上述缺點的話實際並沒有黑到點子上,這都不是關鍵問題。
說性能不好,在弱類型腳本語言中性能屈指可數。說函數名風格不統一但是並不耽誤實現邏輯,array
、string
等函數和其他各種擴展提供的便捷性讓PHP可以用最快的速度實現業務,那麼PHP最關鍵的問題是什麼呢?
面臨的問題
說起PHP那就不得不提web應用,PHP本身就是為了web而生的,我們結合web場景來看PHP所面臨的問題。
我認為在諸多問題中最關鍵的問題有兩個:
1. 原生不支持線程2. php的FastCGI管理器php-fpm
的工作方式問題我們分別來看一下這兩個問題:
不支持線程(這裡不討論pthread擴展, 已經廢棄)
在現如今如此龐大的數據量和與日俱增的用戶所導致的負載問題、業務場景越來越複雜導致每次請求相應時間過長問題,諸如此類問題有個很好的解決方案那就是 — 非同步(非同步編程)。
系統間解耦可以用消息隊列,除了消息隊列之外還有就是非同步編程了(例如JavaScript中的promise,Go中的協程,這裡不闡述非同步的特點和細節)。我們知道基本上非同步特性都是由線程池來實現的(包括Java、JavaScript、Go, 有的是系統線程有的是用戶線程比如Go),由於PHP原生不支持線程那在實現語言層面的非同步特性上就有很大的阻礙,總不能使用進程池把?php-fpm工作方式
php-fpm是進程模型,每個進程只能服務於一個請求,並且生命周期非常短每次請求都要重新初始化應用,請求結束後生命周期結束。這種模型帶來的好處是不用過多的擔心內存溢出的問題,但是帶來的弊端就是每次開啟一個新的生命周期所帶來的開銷在並發比較大的情況下問題就比較突出了,也正式因為這個原因PHP並沒有什麼好用的MySQL連接池、Redis連接池。
總結
這些問題在web應用剛開始發展的時候都不是問題,那為什麼現在成為了問題了呢?
縱觀互聯網的爆炸式發展不難看出,時代在變化應用場景、環境、業務越來越複雜、數據量越來越大隨著互聯不斷地發展和進步所面臨的問題也越來越複雜,但是解決這些問題的基礎工具–編程語言卻來不及更新換代,這樣的問題PHP有、Java、C/C++等等也有,只是脫節的點不盡相同。我們回頭再看近些年被新創造出來的編程語言,有不少是迎合了時代的發展解決當下所面臨的問題的,我們始終在產生問題、解決問題的循環中不斷前進。
後記
PHP的這兩的問題怎麼解決?
如果你在為這個問題兒苦惱那麼我推薦你使用swoole
,它給PHP注入了新的生命,同時為PHP帶來了更多的編程思想,也正是swoole的出現讓PHP在新的時代中更好的繼續前行。
推薦閱讀:
※網路基本功(十三):細說Linux網路配置(下)
※如何在命令行中整理數據
※樂高 EV3 高級編程 - 第一課
※可能是把Docker的概念講的最清楚的一篇文章
※The combinator of combinator