[月经] [借 PHP7 东风] 请从实际项目角度谈谈 PHP 到底哪里不好?

2015-12-03 10:53:42 +08:00
 loserwn

背景

首先说一下我自己的情况。用了 PHP 4 、 5 年了吧。一直觉的 PHP 还是比较不错的语言。可能是我做的项目都比较业务化,没有用到太多的底层和高深的技巧。所以,也没有遇到太多 PHP 的坑。

我想没有一门语言是万能的。就如同没有一个系统架构是适合全部应用场景的。有些情况下 PHP 对于我来说可能是目前最合适的工具语言。(平日也写写 Python )

昨日, PHP7 正式发布了。看到大家对这个事情反应大相径庭。「内核恐慌」中也经常拿 PHP 当个梗儿来提及。最近周围不少朋友都转了 Nodejs react 或者 Python 等等。难道 PHP 的社区开始日落西山了?

我是个比较恋旧的人。不知道大家对这个事情怎么想?

正文

其实,就是想听听大家在自己实际的项目中,因为 PHP 语言或者框架,都遇到过哪些坑,最好是有具体的项目结合而不是就语言而语言谈。

希望能够听到大家的声音。

谢谢

一个普通的 PHPer

3154 次点击
所在节点    问与答
20 条回复
oott123
2015-12-03 11:12:43 +08:00
消息推送
异步
数据库连接池
loserwn
2015-12-03 11:31:17 +08:00
@oott123 数据库连接池 一般是什么场景需要?
tabris17
2015-12-03 11:36:32 +08:00
上下文环境无法跨请求,当然这是劣势也是优势
loserwn
2015-12-03 11:42:12 +08:00
@tabris17 没太理解「上下文环境」这个定义,这是指什么?
xujif
2015-12-03 11:54:26 +08:00
@loserwn 简单说就是 php 一个请求一个上下文,没有真正意义上的 [全局] 变量。也没有真正意义上的单例、线程池。所有的东西都不能缓存。
loserwn
2015-12-03 11:59:30 +08:00
@xujif 理解了。但是,常规其他 web 开发语言应该也有类似的问题吧。
xujif
2015-12-03 12:03:24 +08:00
@loserwn web 程序从运行状态分两种。
application deployed in web server
application run as web server
只要是后者,基本都没有这个问题。如果是前者,也不一定有这个问题,主要是看 web 程序是否常驻内存。
php 这个也不能说缺点,至少避免了内存泄露等问题。
Zzzzzzzzz
2015-12-03 12:08:30 +08:00
补两条.

作为一门自带电池的跨平台语言, 又没封装 pcntl 之类的具体平台相关实现.

如果没靠谱的代码发布流程和编码规范, 那作为卖点的在线热修改很容易成为地雷.
tabris17
2015-12-03 12:11:24 +08:00
@loserwn 全局变量
flowerains
2015-12-03 12:13:13 +08:00
php 写了 3 年了,还真没有遇到迈不过去的坎,而且上手容易,就算是没写过 php 的人也能很容易的入门。
最近在研究 ruby,想尝试尝试不同的脚本语言
然而生产环境我还是选择 php
xuxu
2015-12-03 12:14:46 +08:00
除了上面说的 我的理解:
1. 钱少事多
2. 装逼不够用
3. 优点也是缺点
lyragosa
2015-12-03 13:00:26 +08:00
你们器材党有完没完啊!
powtop
2015-12-03 13:15:38 +08:00
开发者多,好招,易于产品快速迭代,不怕招不到人 即使在的情况下 n
k9982874
2015-12-03 13:23:02 +08:00
上下文环境无法跨请求。一开始接触 PHP 是比较蛋疼的事,后来觉的也不错,就是觉得数据运行前要全部重装载一次有点蛋疼。

全局变量。进程内 PHP 有 define 和 global 关键字,全局变量根本不是问题。

跨进程的数据共享,数据缓存。有 memcached ,基本无痛。

线程池。对于 PHP 来说就像问 linux 下多线程与多进程的优劣一样。当创建进程的开销和创建线程的开销差不多时,讨论线程和进程的优劣没啥意义。线程访问数据方便点,进程用完销毁对内存友好点。

V 站很多 PYTHON , NODE.JS 优越党,但是无论怎么嘲讽 PHP 也改变不了 PHP 还是主流开发语言的事实。
虽然现在很多站开始像 NODE 倾斜,但是真正要替换 PHP 个人认为还是不可能的。

另外,个人觉得编程这个事是要有一定的沉积的, PHP 的用户群大部分可能是从 JAVA 和 C/C++来的。 NODE 大部分是从写页面的 JS 程序来的。
就像 2 、 3 年前做页游的很多都是之前做 FLASH 动画,学了几天 AS 就说自己是程序员一样。一门语言的用户群决定了一门语言的生死存亡。只要社区大神不放弃 PHP ,也就不担心什么。

最后撸主喜欢啥就用啥,不必过多考虑。
loserwn
2015-12-03 14:35:42 +08:00
@xujif @Zzzzzzzzz @tabris17 @flowerains @xuxu @lyragosa @powtop @k9982874

感谢各位回复。

尤其感谢 @k9982874 的答疑解惑和安慰。俺踏实去撸代码了。
shiny
2015-12-03 14:38:07 +08:00
nodejs express 、 ruby sinatra 、 ROR 、 python 的 django 、 flask 、 tornado 都拿来写过项目,最后发现还是 PHP 省心点
Zzzzzzzzz
2015-12-03 15:16:23 +08:00
@loserwn

我理解的其他人说的全局的变量和 @k9982874 指的 global/define 应该指的不是同一件事.

举个例子

比如一个系统有一些设置很少变, 其他语言都可以在启动相应的容器 server 的时候获取这个变量, 每次请求都可以访问这个变量而不用再读取, 涉及到变化的话可以 subscribe zmq 或者 redis 之类的中间件进行推送通知.

而除了 swoole 这类以外常规的 php 运行模式要么是每次获取都从 db 或者 memcached/redis 之类的缓存中间件读, 要么借助 shm/xcache(opcache 和后期版本的 eaccelerator 不行吧)进行本地缓存, 每次获取还得反序列化.
ethego
2015-12-03 15:35:02 +08:00
php 没法保存状态,需要依靠外部( mysql , redis )来做这些
k9982874
2015-12-03 15:39:07 +08:00
@Zzzzzzzzz 所以我下面加了段跨进程的数据共享,补充全局变量部分。数据重装完成后使用起来就没啥不同了。而且 PHP 还可以根据需求只重装一部分数据,而不用所有数据全部重装。单进程服务器就没办法了,必须缓存住所以数据。
loserwn
2015-12-04 10:47:34 +08:00
@shiny @Zzzzzzzzz @ethego @k9982874 谢谢各位解答

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/240782

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX