V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
loserwn
V2EX  ›  问与答

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

  •  
  •   loserwn · 2015-12-03 10:53:42 +08:00 · 3299 次点击
    这是一个创建于 3281 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

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

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

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

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

    正文

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

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

    谢谢

    一个普通的 PHPer

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

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

    如果没靠谱的代码发布流程和编码规范, 那作为卖点的在线热修改很容易成为地雷.
    tabris17
        9
    tabris17  
       2015-12-03 12:11:24 +08:00
    @loserwn 全局变量
    flowerains
        10
    flowerains  
       2015-12-03 12:13:13 +08:00
    php 写了 3 年了,还真没有遇到迈不过去的坎,而且上手容易,就算是没写过 php 的人也能很容易的入门。
    最近在研究 ruby,想尝试尝试不同的脚本语言
    然而生产环境我还是选择 php
    xuxu
        11
    xuxu  
       2015-12-03 12:14:46 +08:00   ❤️ 1
    除了上面说的 我的理解:
    1. 钱少事多
    2. 装逼不够用
    3. 优点也是缺点
    lyragosa
        12
    lyragosa  
       2015-12-03 13:00:26 +08:00
    你们器材党有完没完啊!
    powtop
        13
    powtop  
       2015-12-03 13:15:38 +08:00
    开发者多,好招,易于产品快速迭代,不怕招不到人 即使在的情况下 n
    k9982874
        14
    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
        15
    loserwn  
    OP
       2015-12-03 14:35:42 +08:00
    @xujif @Zzzzzzzzz @tabris17 @flowerains @xuxu @lyragosa @powtop @k9982874

    感谢各位回复。

    尤其感谢 @k9982874 的答疑解惑和安慰。俺踏实去撸代码了。
    shiny
        16
    shiny  
       2015-12-03 14:38:07 +08:00
    nodejs express 、 ruby sinatra 、 ROR 、 python 的 django 、 flask 、 tornado 都拿来写过项目,最后发现还是 PHP 省心点
    Zzzzzzzzz
        17
    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
        18
    ethego  
       2015-12-03 15:35:02 +08:00
    php 没法保存状态,需要依靠外部( mysql , redis )来做这些
    k9982874
        19
    k9982874  
       2015-12-03 15:39:07 +08:00
    @Zzzzzzzzz 所以我下面加了段跨进程的数据共享,补充全局变量部分。数据重装完成后使用起来就没啥不同了。而且 PHP 还可以根据需求只重装一部分数据,而不用所有数据全部重装。单进程服务器就没办法了,必须缓存住所以数据。
    loserwn
        20
    loserwn  
    OP
       2015-12-04 10:47:34 +08:00
    @shiny @Zzzzzzzzz @ethego @k9982874 谢谢各位解答
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1063 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:32 · PVG 06:32 · LAX 14:32 · JFK 17:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.