Maison >développement back-end >tutoriel php >有什么是 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 不可以做的?的内容,更多相关内容请关注PHP中文网(www.php.cn)!