首頁  >  文章  >  後端開發  >  有什麼是 Python 可以做,但是 PHP 不可以做的呢?

有什麼是 Python 可以做,但是 PHP 不可以做的呢?

PHP中文网
PHP中文网原創
2016-08-15 18:01:471578瀏覽

有什麼是 Python 可以做,但是 PHP 不可以做的呢?

回覆內容:

看到那個叫『靈劍』的python程式設計師一派胡言,不光是在答案裡,評論裡也是拿著自己過期的初級PHP資歷在那信口開河,也出來給它來幾巴掌。

首先,下面已經有人提到了,親,你聽過『圖靈完備』嗎?沒聽過的話可以先去維基百科(zh.wikipedia.org/wiki/%)補習一下。 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只能回傳數組,然後寫好幾行很醜的程式碼。語法糖這東西我不是很care,也是用的時候才去查,你說的這個特性php裡似乎有:$my_array = array("Dog","Cat","Horse");list($a, $b, $c) = $my_array;不過這根本不重要。
4、「PHP能續命到今天主要因為第一能調C的模組,所以依靠C程式設計師一步一步續上來,swoole也是這樣;」php把cpu密集型函數寫成c模組就是為了性能啊,這有啥可黑的? php7最棒的特性也是在盡量相容的前提下提升效能:pages.zend.com/rs/zendt

🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜。就我的判斷而言,php語言和社群發展很好。 🎜5、「第二因為PHP程式設計師普遍素質比較低,寫程式碼的需求範圍很狹窄,所以從來沒碰到過這個語言的硬邊界。基本上去寫一兩次Python,你就不會再想重新用回PHP了。 🎜6.「等什麼時候有人用純PHP寫出了OpenStack這樣的雲端運算管理平台,Flask這樣的小巧精緻的Web框架,Scrapy這樣的簡單好用的爬蟲框架,甚至哪怕是requests這樣的HTTP客戶端而不是到今天都還在拖著libcurl湊合著用,我們再來談PHP不能做到什麼。和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、協程本質上是把非同步用同步的方式來寫,所以協程並不是說在並發上比異步強。
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 不可以做的?的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn