有什麼是 Python 可以做,但是 PHP 不可以做的?
回複內容:
看到那個叫『靈劍』的python程式員一派胡言,不光是在答案裡,評論裡也是拿著自己到期的初級PHP資曆在那信口開河,也出來給它來幾巴掌。
首先,下面已經有人提到了,親,你聽說過『圖靈完備』嗎?沒聽說過的話可以先去維基百科(https://zh.wikipedia.org/wiki/%E5%9C%96%E9%9D%88%E5%AE%8C%E5%82%99%E6%80%A7)補習一下。php和python都是圖靈完備的語言,所以沒有什麼是其中一者能做而另外一個不能做的。
問題回答完畢,下面是說好的打臉時間,也就是來看看『靈劍』所說的所謂的python能做而php所不能做的到底是怎麼一回事(為避免重複,『溝槽』已經反駁過的部分我就不在重複了,部分奇葩言論是從『靈劍』他的評論裡摘出來的):
1. 『我原來寫PHP的時候主要用的是curl,這是個C的庫。不是說它不好,但是你用這個庫的話,有一些重要的功能是不行的,比如說我要讀取一個URL,然後將傳回值作為一個流來處理,讀一部分處理一部分』:請閱讀手冊 PHP: curl_setopt 中的 CURLOPT_FILE,『value should be a stream resource (using fopen(), for example) for the following values of the option parameter』 明確說明了是支援流的。
另外據說你還去看了一大堆第三方的庫?不知道guzzle(GitHub - guzzle/guzzle: Guzzle, an extensible PHP HTTP client )這個7000+ star的庫不知道你是否看過呢?
2. 『最好這個返回的流還可以像檔案一樣統一處理,直接用outputStream之類的方法就可以把這個流寫到其他語言基本都支援這樣的功能,但PHP不行』 同上,上面已經說了,你都fopen了,當然可以像檔案一樣統一處理
3. 『其他比如說自動複用HTTP/1.1的串連,也是做不到的』廢話,你這說的是web server的事情。找apache/nginx去。當然你非要拿php做web server也不是沒有,swoole是一個,但你覺得這是c寫的擴充不算。那你可以去看看workerman(什嗎?這也用了c的庫所以不算?拜託,系統內建的庫你都不讓用這也太過分了點吧)。
4. 『營運剛抱怨的來著,別的語言Web服務的前置nginx配置都是統一的,只有PHP,寫了一大堆rewrite。就因為PHP不支援按URL匹配規則綁定handler』:你業務糟糕一大堆rewrite怪誰?主流的架構現在基本上都是單入口設計全部rewrite到index.php然後再自己內部分發處理的
5. 『你們老是覺得PHP這個也可以那個也可以,我認為這完全是因為你們要實現的業務太簡單了,沒見過真正精美的設計。』:同理,你能力太差見識太少,php也是可以去實現你所謂的那些精美的設計的。
6. 『只有你們家PHP是精美設計不好使的,因為文法太死,所以你們只會寫麵條代碼,去讀讀其他語言比如Python比如Java(Java也比你們強多了),看看他們怎麼運用OOP來抽象商務邏輯,怎麼運用設計模式,怎麼用模組化的方式管理業務功能,怎麼提供外掛程式式的擴充,這些你們家PHP一個都做不到。』:PHP: Introduction php5(10多年前了)開始就提供了OOP,至於抽象商務邏輯、運用設計模式、模組化外掛程式化這些不都是程式的事情嗎?你能力差怪語言咯?
7. 『我在SAE(新浪雲端服務)上寫了起碼三年的PHP,我當年的應用高峰期把SAE跑崩過(就是用fsockopen跑崩的),PHP最噁心的那些問題我全都遇到過。』講道理那是SAE垃圾怪php?我也跑崩過不止多少次,SAE背地裡改了那麼多東西能怪PHP?當時向老大推薦了SAE和新浪雲商店(好像叫這名字,就是沒有寫限制的SAE),結果部署上去各種坑啊
8. 『只有你家PHP要區分,第三方擴充只能複製進網站目錄裡,沒有包管理功能,還要小心命名空間衝突,爽不?C擴充裝起來費老勁還要改設定檔,爽不?』:php的包管理請參考 Composer 命名空間衝突也順便解決了。至於C擴充請參考 pecl
9. 『但你們真的想要一個每次用一個類就搜尋一遍本地目錄的語言嗎』:請閱讀 psr-0, psr-4 以及 composer的 autoload
10 『自動載入機制是靠在本地目錄裡尋找名稱與類名稱匹配的檔案然後載入沒錯吧』:你也可以不按規範來,自己實現PHP: spl_autoload 然後你覺得怎麼爽就怎麼來吧。
11. 『命名空間衝突』:PHP: Using namespaces: Aliasing/Importing
12. 『Java的Web一大支撐就是spring,因為有spring所以能搭建起大規模的、外掛程式式的、可以運用設計模式的Web,PHP不行,這已經是死刑了,說明PHP永遠開發不了Java這個規模的Web應用。』:我猜測一下你想說的是IOC吧?這個很多架構也都實現了啊,例如 Service Container ,
順便說一句,不知道facebook在你眼裡,規模是有多小?
槽點太多就不多說了,有些最基礎的東西我想說明一下:
首先php就是用C寫的,這有什麼問題嗎?按照你的邏輯只有能完成自舉的才能叫語言?
至於每次都要載入一遍,這是與apache/nginx協同工作的方式決定的。把你的問題翻譯的稍微專業一些,php能否自己實現web server?答案是肯定的。首先php -S 內建了一個,另外可以參考項目swoole(c實現)、workerman(php實現) 等
最後,不瞭解php還要裝精通來強黑,真是辛苦你了。這麼多人打臉,疼嗎?很多人從語言層面上討論python和php。我能力有限,只能從資源生態上討論一下。
參考一下兩個awesome。
ziadoz/awesome-php
vinta/awesome-python
我們不難發現php主要還是為了web開發而生。而python涉及了很多領域,除了web之外,還有很多:
大資料處理
資料視覺效果
機器學習
嵌入式開發
各大軟體的api
案頭應用
得益於CPython和C之間的關係,很多軟體都出了python的api介面。至於效率方面,用python做資料處理肯定離不開numpy,pandas。當然,想快速做個webapp用php也是無可厚非,畢竟它是最好的語言。
Python 筆記一:簡單入門及點評知乎快要形成一個以寫python為榮,以寫php為恥的態勢了,真是讓人痛心疾首啊,寫php很丟人嗎?捧python黑php快要成為知乎的政治正確了。
現在都出來python能php不能這樣的問題了,雖然大家都是圖靈等價的,但php也能算語言嗎?
python可以用來裝B,php就不能了,在知乎phper通常會被pythoner吊打
python能有2、3兩個版本隨時供你選擇,php就不能。
python還能這樣:a = [1,2,3] 算長度 len(a),排序,a.sort(),簡直是既吸取了C系過程式又吸收了物件導向,簡直感人,php就不行了,都是醜陋的過程式調用。
python的縮排,簡直是代碼潔癖的福音啊,想寫醜陋的代碼門都沒有。
上面只是瞎說而已,只會點兒php、ruby,不懂python,但真心感覺python依然是一門不錯的語言,還有類似Haskell的List comprehension。忍不住了,那個靈劍的python碼農,之前也在黑php的問題下看你瞎回答。黑php沒問題我也常常黑,可是你的關於php回答簡直不懂裝懂還瞎說,這裡把你的回答一句一句打你臉。
1、”多線程支援特別差只是其中之一。”這麼說吧,php、ruby、python等這些比較主流的指令碼語言裡面論多線程支援,php是做得最好的。py和ruby支援多線程偷工減料加全域鎖弄了個假的多線程,php本身改造了語言核心分了安全執行緒和非安全執行緒版本,php的多線程是真的多線程。其實指令碼語言作為進階語言多線程並不魯棒所以我基本不用多線程特性,要用多線程任務我還是傾向於用java/c++靜態類型語言。
2、“比如說不區分位元組流、多位元組字串、unicode字串,需要在PHP檔案裡面同時寫unicode、utf-8、gbk字串的時候必須全部用16進位轉義,這是一種怎樣的令人崩潰的體驗”。用python沒被編碼災難的噁心過的有幾個?我用php基本沒有為編碼問題操心過。你說為毛不用py3?是啊,py3傻逼的不相容py2給第三方庫社區帶來了多大的麻煩,ubuntu16.04才敢升py3的吧,對不起大部分的生產環境centos6還py2.7呢。
3、“比如說多傳回值,Python可以返回元組然後用簡單的文法(a,b = my_func())將元組內容還原到不同變數,PHP只能返回數組,然後寫好幾行很醜的代碼。”php不只能返回數組,還能返回對象等等,不過我相信你的意思是php沒有py那樣的文法糖。文法糖這東西我不是很care,也是用的時候才去查,你說的這個特性php裡似乎有:$my_array = array("Dog","Cat","Horse");list($a, $b, $c) = $my_array;不過這根本不重要。
4、“PHP能續命到今天主要因為第一能調C的模組,所以依靠C程式員一步一步續上來,swoole也是這樣;”php把cpu密集型函數寫成c模組就是為了效能啊,這有啥可黑的?php7最棒的特性也是在盡量相容的前提下提升效能:https://pages.zend.com/rs/zendtechnologies/images/PHP7-Performance%20Infographic.pdf。就我的判斷而言,php語言和社區發展很好。
5、“第二因為PHP程式員普遍素質比較低,寫代碼的需求範圍很狹窄,所以從來沒碰到過這個語言的硬邊界。基本上去寫一兩次Python,你就不會再想重新用回PHP了。”你這樣地圖炮是不對的,每個語言都有每個語言的使用情境,我原來寫py挺多的,但是web相關的我覺得php更好用。
6、“等什麼時候有人用純PHP寫出了OpenStack這樣的雲端運算管理平台,Flask這樣的小巧精緻的Web架構,Scrapy這樣的簡單好用的爬蟲架構,甚至哪怕是requests這樣的HTTP用戶端而不是到今天都還在拖著libcurl湊合著用,我們再來談PHP不能做到什麼。”OpenStack沒用過不便評價,Flask這邊組裡一直在用在遇到效能問題後重構轉java了,Scapy和requests你張口就來我今天就用這個2打你臉。Scrapy作為一個爬蟲架構基本上寫幾個設定檔就可以跑了,但是爬蟲的本質是開一個httpclient取回html+dom操作抽取資料,Scrapy封裝的很厲害適合初學者改幾個參數就跑起來了,但是擴充特別差。這邊搞爬蟲的py碼農在要完成需要特別定製的爬蟲都是直接開requests回來beautifulsoup抽資料的。requests這個httpclient是挺好用的,php的httpclient也並不只有libcurl,比較大的庫的話guzzle也很好用,而且有很棒的非同步支援。我用guzzle可以使用libevent的事件庫單進程只開一個guzzle的httpclient並發同時非同步爬100個網站,而requests並沒有非同步支援。
我說這麼多就是想打你臉,以上
-------------------------------------------------
看了Coldwings的針對我的比較有水平的回答,我興緻頓時來了,這裡回應如下:
1、關於編碼問題我相信已經討論的足夠清楚了,我覺得你說的也有道理,感性的東西這裡就不回應了。
2、py下的非同步並發方案我之前調研過很久的,grequests(GitHub - kennethreitz/grequests: Requests + Gevent =<3)是對gevent的很薄的封裝,star很多但代碼150行不到,實際上不怎麼好用。
3、協程本質上是把非同步用同步的方式來寫,所以協程並不是說在並發上比非同步強。
4、並不是只有Scrapy能調度phantomjs(你可以把phantomjs整合到任何爬蟲裡面),實際上我有在php下並發驅動phantomjs的一些經驗(單機i7並發驅動80個phantomjs執行個體,包括並發下緩衝、代理、資源泄漏和headless開發困難等各種坑的對應處理),我相信用py來驅動phantomjs也差不多,看你用啥順手。
5、爬蟲這塊你所謂的分布式是指多機並發爬取的話,我用redis比較多,當然了我機器不多。我自己用php寫了基於redis的多節點並發爬蟲方案,有個爬蟲2台PC並發最多150個phantomjs+150個guzzle的httpclient吧。多爬蟲協作和任務分發啥的,比起專門的訊息佇列我比較推薦redis,因為redis的單機10w的qps在滿足爬蟲並發的同時,還有非常好用的5種資料結構,對爬蟲的調度、狀態查看、參數動態設定都有很大協助。
6、我爬蟲並發100是http並發不是tcp並發,我用php在單進程單httpclient下在低cpu低記憶體下非同步並發跑滿了小水管。線程池方案和非同步並發方案優劣我認為已經討論的足夠清楚了(另外我真的覺得我的基於guzzle的單httpclient非同步多並發的爬蟲方案很不錯的誒,我對這個很自滿的。如果你感興趣的話可以看看我的兩篇部落格討論的這個問題:談談爬蟲的並發問題和redis使用心得+高並發httpclient的理解)。
7、python的並發http方案我也之前也調查過(What is the fastest way to send 100,000 HTTP requests in Python?),裡面也有你提到的grequests和tornado的那個非同步httpclient。tornado的那個非同步httpclient恰恰是基於libcurl的(tornado.httpclient)而且沒有並發支援的,而php的guzzle預設是libcurl但是你可以選擇別的事件庫比如libevent的,guzzle可是支援非同步並發的哦(在py和java下我找了一段時間都沒找到這樣的httpclient的)。
最後說明一下,我只是看到靈劍那個python碼農黑php真的是每一句話都是錯的(從他之前的回答裡也看出對php的偏見太大了,而且他根本不瞭解php,這樣誤導別人真的讓人火大),實在受不了才跳出來打臉的。我相信每種語言都有它最適合的情境,也完全享受和別人交流一些技術上的東西的。謝邀,在web上據我現在所知是沒有,樓上所說的多線程php可以使用swoole完成,也並不是不能做到。
php在設計上最好的一個地方就是擴充這個機制,就算以後py在web上出了其他新的特性功能,會C語言的php大神也能用C出一個擴充給php用。
總之每個語言存在都有它存在的意義,不要相對比,如果你有這相對比的時間,還不如多寫幾段代碼。Python 能寫出沒有貨幣符號的代碼。
PHP 不能。謝邀!兩種語言所面對的領域不一樣,如果強行橫向對比,必然會引起無意義的爭執。
在PHP這種語言誕生之前,在WEB這一塊就已經是一片紅海了,如果按照上面的python大神所言,PHP根本就沒有出現的必要。然而PHP出現了,而且在不斷成長,現已經佔領了大部分的web開發市場。
任何事物的出現都有其必然性,以後的互連網技術領域也將會越來越傾向於快速實現。相信如果不是Dz!的出現,前些年BBS也不會在國內發展這麼迅猛。可見PHP對於互連網在國內以至於全世界的發展有著巨大貢獻。
很多人都在說紮克伯格後悔用PHP,但如果他當時選擇的不是PHP,可能就不會有FB的稱霸了。比爾蓋茨當年在推出視窗作業系統的時候其實並不完美,他為了早一步培養使用者習慣,寧可將自認為並不完美的軟體推入市場。如果他想去追求完美了再推出,可能那個時候即便完美了,也不會有那麼多人去使用了。
正式這種轉瞬即逝的商機才造就了PHP的輝煌。先推出可用的應用,再去花時間完善。哪怕是用C也會得到大量支援,因為市場已經應徵了應用的可行性。
所以PHP和PY是不能橫向對比的,至於有什麼是PY能做PHP不可以做的,我的答案是已經有充裕時間、充裕可行性的項目是不適合PHP的,比如量身打造的定製ERP。竟有Php做不了的,好奇中!實際上並沒有只有py能做php不能做的。
選擇語言個人口味佔了一定比重。如果當時選擇的人恰好又做了一些影響力很大的工作,那麼就形成了慣性,到後來就欲罷不能了。
py有很大一部分的應用是數值計算,庫也特別多。以前有人列舉了一些原因: 為什麼這些搞數值計算的人會偏愛python而不是其他語言,其中一個原因是文法上更易被這些科學家接受。
所以如果非要說一樣py能做php不能的事: 那可能是py的文法更吸引其他行業的使用者。
10 Reasons Python Rocks for Research (And a Few Reasons it Doesn’t)
放個連結參考一下。問題太主觀了
請題主精確定義下什麼叫“不可以做的”
c/c++都可以做web開發,bash也能寫出科學計算,甚至node.js也能擴充到嵌入式開發裡
只有相對的、定性的“不適合做的”,沒有“不可以做的”
以上就是有什麼是 Python 可以做,但是 PHP 不可以做的?的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!