狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

PHP到底有多糟糕?

admin
2024年7月25日 0:27 本文熱度 692
我來回答這個問題是告訴各位開發者:你們根本不會用PHP

這是個非常有趣的問題

無論是提問者還是回答者,無論是支持者還是反對者,都沒有聊技術上的事,都只是觀念的碰撞.

這很好理解,因為PHP已經流行了那么多年了,技術上沒有那么多糟糕的地方,本質上還是開發人員觀念的問題,這是一個我們必須要承認的事實,不同的開發人員的觀念是不一樣的,比如:

有的人認為代碼是給人看的,他們狂熱的推崇ORM,

有的人認為代碼是給機器跑的,拼接的SQL比什么都快;

學院派認為一個語言需要有健壯的設計,所以狂熱地推崇GO之類的語言,

實用派則認為語言的任何發展方向都要為開發人員服務,所以兼容性/實用性/穩定性處于不可撼動的地位.

激進的人總是想拋棄糟糕的,引入更酷的,

保守的人老是想著保留能用的,只引入不可或缺的.

注重長遠架構設計的人會對業務做出層層分層,

需要快速實現的人做個MVC就已經謝天謝地了.

這種沖突很有意思,沒什么對錯,但我不是和事佬,我來回答這個問題是告訴各位開發者:你們根本不會用PHP(狗頭).

當然,開個玩笑.

PHP有很多打開方式,所以當我們聊PHP時,最好說清楚自己在說什么,比如:

  • PHP-FPM:傳統的經典的動態語言使用方式

  • PHP-CLI:普遍的強大的高性能的使用方式

  • PHP-擴展:C/C++級別的擴展能力

以上三種打開方式大家可能都或多或少的了解一些:

PHP-FPM最流行的代表無疑是Wordpress,還有一大堆普遍常見的開發框架和開源產品,如ThinkPHP,Laravel,各類shop.

PHP-CLI也是最近流行起來的開發方式,比如Workerman/Swoole/React-PHP,能夠獲得更高的性能(相對PHP-FPM,主要是頻繁加載等環節),類似Java和Go的部署模式,更多的網絡開發能力,比如長鏈接/微服務,也有更安全的加載方式,比如以前的掛馬方式就廢了,PHP不再以動態加載的方式運行.

PHP-擴展卻不是一個輕松地事,復雜的Zend-API讓人望而卻步,每個開發者都勸自己,不要搞擴展,好好活著,沒必要深入C/C++,還不如學GO了.實際上PHP的擴展也有很多開發方式,比如swoole作者的PHP-X,和我介紹過的一個項目:PHP-CPP,他們把復雜的Zend-API抽象封裝,讓擴展的開發就像寫PHP那樣簡單(真的,使用PHP-CPP寫擴展真的跟PHP一樣簡單,強烈推薦)

如何開發 PHP 擴展?PHP 擴展應該注意些什么? - PHP武器庫的回答 - 知乎 zhihu.com/question/2001

幾個有趣的打開方式

以上幾種用法算是"官方的","標配的","兼容的"用法,就是說你在PHP-FPM可以運行的代碼,在PHP-CLI也能運行,在PHP-擴展中也能調用成功.

但是這里我要介紹幾個其他的打開方式,他們或許不能完全兼容原來代碼的運行方式,但也為我們的一些業務提供了一些新的開發方式,滿足我們一些特殊的要求.

KPHP

KPHP是一個PHP編譯器,能夠將PHP代碼編譯成本地二進制文件.

KPHP會將PHP的代碼轉換成等效的C++代碼,然后編譯生成的C++代碼并以嵌入式HTTP的方式運行.可以把它認為是PHP的"轉譯",因為他是把PHP的代碼"翻譯"成C++的代碼,但最終效果來看,也算是一個PHP的"編譯器".

KPHP不是面向JIT的,所有的了類型都是在編譯時(翻譯成C++時)推斷的,不存在"慢啟動"階段.

但是:

KPHP并不是一個萬能的項目,他不是PHP的一個分支,也不是PHP的一個擴展,它是一個全新的獨立的運行PHP代碼的方式,他有很多的限制,你可能沒辦法編譯你現有的項目(比如ThinkPHP).

KPHP的諸多限制:

  • 不能編譯本身就不能編譯的功能,不能比如變量名調用函數:$fname()

  • 不能編譯破壞系統類型的代碼,比如數組中混合數字和對象

  • 一些PHP的細節特性,比如生成器和匿名類

KPHP和PHP本身有很多差異,比如在PHP中,運行時才會報錯,而在KPHP中,必須修復所有錯誤才能運行,再比如在KPHP中所有的代碼都是內聯的,如果a文件需要b文件的函數,那就require引入b文件,這時其他文件不需要引入b文件也能調用到那個函數,同時KPHP不支持evel,反射,數組指針等等特性.

由于以上諸多限制,一般情況下你并不能將你現有的業務直接使用KPHP編譯成二進制.

但是這并不代表他一無是處,你可以按照KPHP的規范標準去寫代碼,比如你系統中的某一個獨立的小模塊,然后把他編譯成二進制文件,至少這部分系統不需要擔心代碼泄露的問題.

性能,你肯定想了解它的性能.

實際上對于密集的算法邏輯,比如冒泡排序,在網站給出的 測試中:

  • PHP7.4 花費 2100毫秒,

  • KPHP 花費 480毫秒,

  • 只有四分之一的時間

如果將冒泡排序使用跟多的數組函數進行優化,

  • KPHP花費270毫秒

  • C++花費220毫秒

  • KPHP的性能幾乎和C++一樣

在小編看來,KPHP的性能確實不錯,不過小編認為KPHP更棒的地方在于能夠將PHP代碼編譯成二進制文件,這樣我們在分發系統(產品)的時候,完全可以把最核心的技術和功能編譯成二進制,避免代碼泄露.

peachpie

另一個有趣的項目是peachpie,它能將PHP便以為.NET,這樣就能獲得.NET的能力,比如跨平臺,二進制.

它的目標如下:

  • 提高性能,一般的將PHP編譯成.NET之后,性能會得到一定的提升

  • 安全性.在標準化和可管理的.NET環境或.NET core環境中運行,代碼都是編譯過的

  • 跨平臺開發,可以將PHP編譯成可移植類庫,在所有的.NET平臺中運行

  • 完全兼容.NET,為peachpie編寫的代碼與PHP完全兼容

  • 雙向操作,可以用C#和PHP混合編寫,通過.NET框架通信

與之前介紹的KPHP而言,peachpie的目標和定位是為PHP提供一個新的運行平臺,并且應當完全利用和兼容PHP的全部生態,這當然是美好的愿望.

但實際上,peachpie也并沒有實現百分之百的PHP的特性,不過也完成了大部分:

更完整的函數表可以參考他的官網.

在小編看來,peachpie也為我們提供了一個新的分發方式,我們可以將一些簡單地核心的最有價值的一部分功能使用peachpie來分發,完全可以做到保護代碼的效果.

PHP-JS

這是一個很有趣的項目,他能夠使用PHP來運行JS的代碼,是的,可以在PHP中運行JS的代碼,就好像用PHP做了一個Node一樣,當然并沒有Node那樣的生態.

他可以在PHP中運行JS,并且和JS之間互通變量函數,讓小編很激動的是,也可以互通資源類型和對象,比如PDO,

我們可以在PHP中實例化一個PDO資源,然后傳遞到JS代碼當中:

$context = new JS\Context;$context->assign('print_r', function($variable) { print_r($variable); });$context->assign('database', new mysqli('example.com', 'user', 'password', 'database'));$script = <<<'EOD'    var result = database.query("SELECT id FROM test ORDER BY id ASC");    while (row = result.fetch_assoc())    {        print_r(row);    }EOD;// execute the script now$context->evaluate($script);

當然小編多次嘗試安裝PHP-JS,但是他是一個C++擴展,遇到了很多新手問題,以后有機會會繼續研究.

PHP-CPP

這個項目在前面已經簡單介紹了一下,可以通過那個鏈接詳細查看,這里小編還是想推薦一下它.

簡單來說,就是使用C++來為PHP編寫擴展,并且可以做到一個擴展只在一個站點加載.

面對PHP的擴展,每個人都會告訴你,ZendAPI是復雜的,混亂的,你馴服不了他,別浪費時間了.

實際上是這樣的,但是PHP-CPP將ZendAPI封裝起來,并且提供了完善的文檔和注釋,使得使用C++開發擴展變得非常容易和優雅,寫起來甚至和PHP代碼一樣簡單.

并且我們都知道,使用擴展來開發具體業務會有幾個問題,

  • 沒辦法動態加載擴展

  • 擴展必須存儲在指定的目錄

  • 擴展一旦加載,對這個服務器上所有的站點都生效

實際上PHP-CPP完美的解決了這些問題,基本做法是,不要使用PHP原生的方式加載擴展,而是先用PHP-CPP做一個加載擴展的功能,使用C++的能力,來做動態加載,并且可以讓你的擴展存儲在任意位置,隨意分發,同時也可以讓加載的擴展只對指定站點生效,不存在安全問題.


結論

小編在開頭說大家不會PHP,其實只是一句玩笑,但是對于國內大多數的開發展而言,包括PHP和其他的開發者,都有一個錯誤的概念:PHP=PHP-FPM。

就是說所有人都認為PHP-FPM就是PHP,只能做HTTP。

實際上并不是,小編介紹的這幾個項目可能并不是主流趨勢,但是PHP-CLI的開發方式已經流行起來了,比如ReactPHP在國外火了很久了,WebMan是workerman近兩年推出的一個面向HTTP的一個解決方案,Swoole則被各類培訓機構宣傳。

所以PHP到底有多糟糕呢?

其實沒那么糟糕,很多東西你不知道而已。


該文章在 2024/7/25 0:27:19 編輯過

全部評論1

admin
2024年7月25日 0:30
 PHP 有多糟糕,簡單說,PHP 是主流工業語言里最糟糕的。


看看 Swoole 的作者韓天峰怎么評價的:

PHP 語言有 20 多年的歷史,由于一直保持向下兼容。存在很多糟糕的地方,比如:

  • 混亂的函數命名
  • 不友好的 Array/String 函數,至今數組和字符串的操作都沒有實現 OO 接口
  • 混亂的參數順序,導致完全記不住一個函數的用法,每次需要查手冊或借助 IDE
  • 難用的 Zend API ,導致了在應用與內核之間,很難有一個中間層。比如 Node.js 做的就很好,它提供的 C++ API 可以讓其他 C++ 程序員很方便地為 Node 編寫擴展模塊。而 Zend API 幾乎就是地獄模式,對開發者要求太高了。我在今年新開發的 PHP-X 就是為了解決這個問題
  • 缺乏異步 IO 網絡層,PHP 官方只提供了 sockets、stream、select 等 IO 函數,無法滿足現在大并發時代的需求。所以就有了 Swoole 這個項目
  • 缺乏對多線程的支持,雖然有一個 pthreads 項目,但這個連玩具都算不上。多線程需要 PHP 語言底層進行支持,而 PHP 設計之初就沒考慮過多線程


當然,PHP 也有明顯的優點,比如其部署對于虛擬主機的友好超過(除了古老的 ASP 之外的)所有其他主流語言,因此在互聯網應用爆發初期就占領了巨大市場,一些世界上最大的網站最初(甚至至今)都是 PHP 寫的,這是其至今屹立不倒的核心原因。


如韓天峰所言,PHP 的糟糕主要源自于歷史包袱。

或曰,其他語言也有歷史包袱呀?確實,但是 PHP 的歷史包袱特別嚴重。


這有幾個原因。

第一,PHP 最初設計(相比其他編程語言)就很不專業。盡管 Rasmus 是個很優秀的程序員,但是語言設計方面不是他所專長,而且一開始他根本沒有打算做個語言,而只是給自己個人使用的簡單工具集。這些歷史可以自行查閱 Rasmus 的訪談。這導致從設計到實現都有很多臨時性的舉措。奇怪的大小寫設定(PHP黑系列之一:PHP 為什么大小寫規則是如此不規則?),函數命名不一致(PHP黑系列之二:PHP 為什么函數命名是如此不一致?)等的根源都是這些未經設計的偶然因素。即使底層代碼在PHP3之后就基本重寫了,但由于后面提到的原因遺毒至今。

第二,PHP 的后續開發(相比其他編程語言)也缺乏語言設計專家的參與。一些借鑒其他編程語言的新特性雖然總體上還是可用的,但是可能存在微妙的語義問題或實現限制。一些設計錯誤并沒有被修復,反而被延續和擴大。最典型的比如允許函數、常量同名,本來在PHP引入類、接口的時候就應該修正,但結果是允許類、函數、常量同名。這導致當 PHP 發展到今天,常量不能是閉包Why PHP doesn't allow anonymous functions inside CONST?),導致命名空間必須用 use const/function 這樣脫褲子放屁的語法(這個問題以后我有空會在《PHP黑系列》中單獨講一講)。一些常用庫的設計和改進也全憑運氣。比如 JSON 相關的 API 的擴展和變更中出現了明顯的失誤(主要是由于后續維護者沒能理解和保持最初 API 的隱含約束,以后我有空會在《PHP黑系列》中單獨講一講)。

第三,PHP 社區信奉實用主義。實用主義不是不好,但是過度的實用主義導致 PHP 社區普遍低估其他因素(如編程體驗)的重要性。PHP 歷史上的巨大成功加劇了這種心理傾向,進一步削弱了改善動力。這可能也造成了對語言改善有想法的人(包括語言設計專家)與 PHP 社區的互相排斥。這反過來惡化了第二點。另一方面,由于 Rasmus 本人并沒有領導 PHP 后續開發,也沒有像 Python/Ruby/Perl 等語言的創造者那樣保留對語言發展關鍵問題的最后的『仁慈獨裁』權力,使得 PHP 后續發展歷史上缺少敢于拍板做革命性修正的靈魂人物(所謂革命性修正,如 python3、perl6、ES6 等,注意這里不討論革命性修正的具體得失)。


其實自從 PHP 5.4 之后,PHP 核心社區在語言改善上是有很多進步的,包括敢于做一些破壞兼容性的修改,開發節奏也比以前要快很多。PHP 7 更是一個非常巨大的改進。我們也看到了很多致力于提升開發體驗和解決歷史問題的 aggressive 的提案。但是更廣泛的 PHP 開發者社區心態上還是沒有跟上(此處國外了解不多,主要談國內)。舉個例子來說,本問題下的某個認為『PHP 談不上有多糟糕』的高贊答主,之前在許多其他涉及 PHP 的問題發出『JIT 也不見得快』的評論。PHP 7 沒有做 JIT 的原因,鳥哥解釋過。糟糕的是,一些人把鳥哥的解釋理解為『PHP 不需要 JIT』,或者『JIT 沒用』,并且反以(沒有JIT)為榮。實際上真正的原因是 PHP 以前的實現太糟糕了,以至于上了 JIT 也沒卵用。在 PHP 7 重寫了底層的 zval 之后,現在已經重新上了 JIT 并體現出了可觀的性能提升。當然,我是不指望這些人能承認打臉的,他們只會繼續拿這些事情來宣揚 PHP 是『最好的語言』。

PHP 社區的問題還表現在缺乏生態多樣性。同樣是引入靜態類型的方言,Hack 的接受程度遠遠小于 TypeScript(之于 JavaScript)。注意,我不是在討論 PHP 是否應該引入靜態類型,而是在探討一個世界頂級技術公司對其核心技術資產的推動力。PHP 領域,facebook 已經是頂級玩家。JS 領域,像 facebook 這個等級的,就多得去了。但是 facebook 對 PHP 社區的影響力居然遠遠不如其對 JS 社區的影響力。可見 PHP 社區的糟糕。我要是 facebook 的技術決策者,早晚是要拋棄 PHP 的(實際上已經開始拋棄了)。


總之,PHP 的糟糕最主要在于很難擺脫歷史包袱。糟糕中的糟糕則是,盡管 PHP 核心開發團隊確實在不斷改進,但更廣泛的社區似乎仍然心態保守。


該評論在 2024/7/25 0:30:30 編輯過
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved