V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
elarity
V2EX  ›  PHP

写了一些比较少见的 PHP 教程,欢迎指正批评

  elarity · 2018-05-05 19:17:03 +08:00 · 11223 次点击
这是一个创建于 2399 天前的主题,其中的信息可能已经有所发展或是发生改变。

一开始博客都是在 cnblog,大多数复制粘贴,一小部分是自己写,主要功能就是记录记忆功能

后来整理了一些有用的部分,然后自己又写了一些,基本都是关于 php 的多进程、socket 以及 stream 相关的一些教程,放到了 github 上,当然,目前还在继续更新中,这是一个长期的活儿。

github 地址: https://github.com/elarity/advanced-php

欢迎指出其中错误的地方!

第 1 条附言  ·  2018-05-06 16:38:15 +08:00
有很多网友都在下面评论一些内容,其实跟我预想的差不多,这些网友说的内容几乎都是一致的,总结起来就是一句话:“ PHP 不适合做这个 ”。我不太爱争论,但也不太喜欢被这种论调充满楼宇间,因为你的言论可能会影响到其他想深入学习 php 的人。

所以,总结几点:
1. 至于 PHP 合不合适做 socket 这种场景,参考 https://www.v2ex.com/t/170206,总是有现身说法的
2. 但是,作为辩论,我认输并承认“ php 不适合干这个 ”,所以你们都赢了,不必再论了
3. 有些网友说要多学几门语言,那个,我也是会一些 GO 和 C 语言的,所以不必为我担心眼界过窄的问题
第 2 条附言  ·  2018-05-06 16:46:00 +08:00
本来想深入看下 php,但是由于看了评论后对 php 产生质疑和动摇的同学,我转贴过一段话,希望能坚定你们的想法。

--------------------------------------------分割线----------------------------------------------
呵呵,本来不想暴露隐私,没想到隐藏下公司名给你带来这么大的猜疑。

那我就说下吧,主要拿事实说话
本人名字叫李亮,是 Workerman 开源框架的作者,曾经在腾讯朋友、QQ 相册、QQ 空间做 Coder 工作。目前在聚美优品工作

1、腾讯朋友
我 2010 年毕业后第一份工作,持续 2 年左右。朋友网的后端开发全部是 PHPer,朋友网使用的 Server (当然不包括底层存储 Server )也几乎都是 PHP 写的,包括 Webserver ( PWS )、SOA 服务器( PSF )、消息队列服务器( SAPS )。这些 PHP 写的 Server 部署超过千台,对,你没看错,超过千台的部署规模,具体可以参见 PHP 技术峰会 韩天峰 的 PPT 介绍或者视频录像。现在去朋友网抓下 http 头,还能看到 Server:Tencent/PWS 标识。

2、QQ 相册
在朋友网任职期间曾负责 photo.qq.com 相册改版工作,同样除了底层存储,其他 Server 全部是用朋友网的那一套 PHP 写的 Server 部署的。由于 photo.qq.com 功能模块不复杂,所有 Server 只部署了十几台支撑了每天 5000W 左右的 pv

3、QQ 空间
QQ 空间的开发都是写 C/C++的,但是同样也部署了不少 PHP 写的 Server,具体部署多少太不详,因为我只在 QQ 空间做了半年的开发。

前一阵看到 CSDN 关于企业 QQ 架构的专访,其中也说到了 PHP 写的 Server 在架构中的各种运用,这个是链接
http://www.csdn.net/article/2014-08-21/2821302-interview-tecent-b-qq-shuai-wang

我目前在聚美优品工作,聚美优品的后端 Server (除了存储)几乎都是基于我写的 PHPServer 运行的,所有业务系统加起来确实有几百台。为何用这么多机器,我想你也应该知道原因了,聚美优品的限时抢购业务决定的,抢购的瞬时请求量非常恐怖,不用这么多机器,网站瞬间瘫痪了。

我待过的两家上市公司都有过这么大 PHP server 的部署规模,相信你不用再猜疑了。

为何这些大公司热衷于 PHP 写的 Server 呢,而不转 golang/erlang, 我想大概有以下原因:
1、首先是 PHP 写的 Server 和 golang/erlang 等语言写的 Server 在性能上没有多大的差距,尤其是业务中涉及频繁的 IO 操作时,比如 mysql 数据库等存储。性能差距一般只有在 CPU 密集型计算时才会显示出来,当然编译型的语言肯定胜出,其他脚本语言差距仍然不太大。

2、大公司某个项目的开发人员众多,当新增一个语言时会给开发工程师和运维工程师以及项目管理带来巨大的挑战和风险

3、PHP 在 Web 容器下运行确实有很大的性能损耗,包括 apache、nginx 等 Web 容器自身的开销、Web 容器与 PHP 通讯的开销,Web 容器下 PHP 自身每个请求周期反复初始化执行环境最后有销毁一切的开销等。为了避免这些问题,使得 PHP 开发者去用 PHP 实现自己的 Server

4、PHP 的开发效率非常高,例如朋友网 20 多个 PHPer 每天都发布版本很多版本,有时候我自己一天都会发布几个版本。使用 PHP 能够快速开发迭代,迅速占领市场。自然用 PHP 写 Server 也会带来开发效率大大提升的好处。


@zhengkai 说的没错,什么语言适合做什么事情,但我要说的是 PHP 也同样适合写 Server,如果能用合适的又是大家熟悉的语言去做效果会更好。

最后建议 @zhengkai 不要道听途说,“相信业界主流认识是 PHP 不是用来干这个的”,请实践后再下结论。在我看来腾讯以及我现在所在的公司对 PHP 写的 Server 的大规模部署和实践应该足以说明 PHP 同样适合干这个。

--------------------------------------------分割线----------------------------------------------
第 3 条附言  ·  2018-05-08 11:21:43 +08:00
我不是 wm 作者,
我不是 wm 作者,
我不是 wm 作者
104 条回复    2021-05-10 23:35:37 +08:00
1  2  
elarity
    1
elarity  
OP
   2018-05-05 19:20:36 +08:00
补充一下,github 上的 PHP 教程更多是偏向于多进程的 php socket server 方向,博客上的内容更为广泛些,等待指出批评 https://blog.ti-node.com
mailbox
    2
mailbox  
   2018-05-05 20:41:18 +08:00
php 跑 socket 很累的,天生单线程
elarity
    3
elarity  
OP
   2018-05-05 21:22:13 +08:00
@mailbox 是的
Mrun
    4
Mrun  
   2018-05-05 21:40:21 +08:00
我觉得拿 PHP 做这个时候走了歧路,socket 的应用场景在 php 真的很少,也不适合
elarity
    5
elarity  
OP
   2018-05-05 21:43:10 +08:00
MeteorCat
    6
MeteorCat  
   2018-05-05 22:39:13 +08:00
@Mrun 也不能說,我感覺對於小程序|微信游戲這種,`swoole`能夠讓原來 PHP 開發人員迅速轉移開發;不像我們游戲服務端開發已經招了大半年.......
elarity
    7
elarity  
OP
   2018-05-05 22:49:58 +08:00 via Android
@MeteorCat 台湾?
eoo
    8
eoo  
   2018-05-06 02:02:49 +08:00 via Android
socket? 上 nodejs
elarity
    9
elarity  
OP
   2018-05-06 02:33:22 +08:00 via Android
@eoo 抱歉,我会选择 java 或者 go,也不会选这个。
DavidNineRoc
    10
DavidNineRoc  
   2018-05-06 07:47:21 +08:00 via Android
mark
linxl
    11
linxl  
   2018-05-06 09:05:06 +08:00
嗯, php 进阶的一个方向就是这里了.
sagaxu
    12
sagaxu  
   2018-05-06 09:14:34 +08:00 via Android
php 应该保持简单,甚至是极简。用 advanced 修饰的 php,还是用更合适的工具比较好。最适合 phper 的附加技能就是 golang。
askfilm
    13
askfilm  
   2018-05-06 09:16:26 +08:00
已 star, 挺好,值得学习学习
elarity
    14
elarity  
OP
   2018-05-06 09:27:19 +08:00   ❤️ 1
@sagaxu 是的,欢迎对编程语言的不同认知观点参与!
shilyx
    15
shilyx  
   2018-05-06 09:52:29 +08:00
对于 c/c++、java 等开发者来说,转入 php 是有幸福感的,要做的事情更纯粹了,更有针对性了。

但是如果开发者从 php 入门,如果不横向扩展的话,那么世界观将是狭隘的。这种开发者应该扩展一下视野,了解一下整个程序是怎么运作的,而非仅仅是 cgi 模式下的一个 session 的运作。
elarity
    16
elarity  
OP
   2018-05-06 10:02:04 +08:00 via Android
@shilyx 是的,一个 phper 不能离开了 nginx 和 apache 就没法混。即便是转 java go 也一样不会深入,也不会用的更好。这是认知水平的问题,与语言无关。
Mrun
    17
Mrun  
   2018-05-06 13:40:05 +08:00
@elarity 这年头 PHPer 谁不知道 workerman 和 swoole,你还是没有理解我的意思,大部分有 socket 场景的业务会有更加成熟的方案,虽然在你看来,workerman 或者 swoole 非常棒,这两者也确实也非常好,但是抱歉的是,PHP 在这里面确实不是最好的方案
elarity
    18
elarity  
OP
   2018-05-06 13:46:04 +08:00 via Android
@Mrun 我说了的,也没理解错你的意思。不同的认知而已。有人认为不合适,有人认为合适,这才是正确的世界。thx
sagaxu
    19
sagaxu  
   2018-05-06 14:36:33 +08:00 via Android
@shilyx java 转入 php 毫无幸福感,array 代替了 class 定义,自动补全和编译器检查失效了。受制于 fpm 的请求生命周期设定,很多用的顺手的方式都不能用了。放眼望去,没有一个框架能跟 springboot 一样同时做到简洁和弹性还不丢性能。
chenxytw
    20
chenxytw  
   2018-05-06 16:11:41 +08:00
php 这种天生为 web 设计的语言不适合写常驻内存的程序 0 0
不适合的原因在于能力的缺失。要么就是 C 接口的简单封装,要么根本就不支持。
比较成熟可用的解决方案都是通过 C 扩展开发的,受制于解释器能力。这是 PHP 基本特性决定的。
当然,我十分尊重你认为 PHP 也能做好这件事情。只是希望你能认清在 “当前” 你还无法靠 "纯 PHP" 来解决这些事情。
(说个不太贴切的现实就是,甚至 PHP 官方自己都没有去做这件事情)
chenxytw
    21
chenxytw  
   2018-05-06 16:16:38 +08:00
@sagaxu 额。。。。你转入的是 PHP 4 么????
1. 用 array 代替 class 是什么鬼 php 5 开始 就有基本的 OO 能力了好伐 0 0 现在都 php 7 时代了。
2. php 也有 cli mode
elarity
    22
elarity  
OP
   2018-05-06 16:40:11 +08:00
@chenxytw 多谢指教
askfilm
    23
askfilm  
   2018-05-06 16:57:30 +08:00
@sagaxu 你知道 php 的框架 symfony, 整个 symfony 开发是相当有企业标准的(愉悦的),简单的说它是 php 中 spring, 借鉴了非常多的 spring 的先进思想, 可以说是 php 标准的引领者和教父, 有时间你可以了解一下
askfilm
    24
askfilm  
   2018-05-06 17:06:34 +08:00
@chenxytw 我有实际项目经验, 公司里的 php 常驻业务进程, 运行了数年, 非常的安全可靠! 所以我不认同你的看法, 因为你并没有从实践中获得结论, 而是人云亦云 。

你认为 php 天生上有些缺陷,我也认为确实有,但是实践中很多事情其实不需要完美的解决方案, 只要有高效低成本实现,其实就已经够了
shilyx
    25
shilyx  
   2018-05-06 17:45:17 +08:00
@sagaxu 是我表达的不够清楚,我的意思是说 php 针对性的做了一些事,十分的方便。从原生领域转过来的话能体会到这种尝试,所以会觉得很幸福。并非 php 让人很幸福。

事实上,我从未涉足过 php。php、basic 是大约十年前左右划定的我的不征之语言,不看不学不用不研究。
dexterlei
    26
dexterlei  
   2018-05-06 17:47:12 +08:00
手动点个赞
zsxzy
    27
zsxzy  
   2018-05-06 17:54:03 +08:00
赞, 我喜欢用 php7 写点 web 小项目和 api 后台, 非常方便快速
whyiyhw
    28
whyiyhw  
   2018-05-06 18:46:10 +08:00 via Android
手动点赞,作为一个正在横向扩展的 PHPer,自学这块的时候,有时候真的是很难,但是都是一个过程,解决完问题之后还是很有成就感的。我是觉得应该多学几门语言,一是有启发作用,毕竟 PHP 做的太好了,屏蔽了大量底层细节,二是手上只有锤子,那看什么也只能都是钉子。毕竟是一份以解决问题为导向的工作,只要不加班,一切都 OK。
to2false
    29
to2false  
   2018-05-06 19:05:31 +08:00
mark 围观
lxrmido
    30
lxrmido  
   2018-05-06 19:13:12 +08:00
写了六七年 PHP 了,来点个赞
leven87
    31
leven87  
   2018-05-06 19:35:46 +08:00 via Android
php 在 web 端没有对手
nicevar
    32
nicevar  
   2018-05-06 19:47:04 +08:00
好东西,mark 一下
要快速出活选 php 还是很给力的,04 年就开始接触 php,没学过大致能看懂,过去的十来年一直都在写 c/c++/java,今年有个 app 想快点发布,后端选择用 php 的 CI 来写,直接文档+google 没多久就搞完了,非常满意
weirdo
    33
weirdo  
   2018-05-06 20:15:42 +08:00
mark 一下
sagaxu
    34
sagaxu  
   2018-05-06 20:50:35 +08:00
@chenxytw 我最早接触 PHP 已经是 5.2 了,真正开始使用是 PHP7。虽然 PHP 支持 class,但是似乎并不是最佳实践?我看过好多人的写的 PHP 代码,返回值经常是 array 套 array 套了好多层,想弄明白准确的类型定义,没那么方便。特别是很多内部服务,返回值的定义常常因为文档不到位而让人一头雾水,有时只能打出来看看才知道定义。都是年薪 25 万到 50 万之间的 phpers 写的代码,我作为一个比较资浅的 php 开发,欣赏不来这种 array 包打一切的哲学。

@shilyx 从 C 到 Java,Python,Go 甚至任意一门更高层更偏应用的语言,都有这种感觉吧。但是从 Java 到 PHP,只有一句话,动态一时爽,重构 XXX。

=====================================================================================

是有很多大公司在用 PHP,的确可以证明 PHP 也能干 XX 领域,但是并不能证明 PHP 更适合干 XX 领域,因为有更多的反例存在。如果给公司打个语言标签,腾讯和百度是 C++,阿里是 Java,携程是 Java,京东也是 Java。过去几年,估值 10 亿以上的公司 php 转 Java 或 Go 的,能举出 10 个以上例子,反过来的却很少,这难道不能说明一些问题?
elarity
    35
elarity  
OP
   2018-05-06 21:01:38 +08:00 via Android
@sagaxu
是的,确实如此。你把我发的这个帖子中的 php 当成 python 或者 ruby 或者 nodejs 就行了。

我写这个是给初级的一些程序员看的,希望能帮到他们。

你说的是正确的。
k9982874
    36
k9982874  
   2018-05-06 21:06:03 +08:00
之前公司手底下一个人拿 workerman 写游戏后端服务,然后就没有然后了
elarity
    37
elarity  
OP
   2018-05-06 21:10:56 +08:00 via Android
@k9982874 可以考虑换 golang 或者 java 之类
songjiaxin2008
    38
songjiaxin2008  
   2018-05-06 21:31:31 +08:00 via iPhone
@sagaxu 用 dto 呀 php 要写好确实需要很多约束
Stevenv
    39
Stevenv  
   2018-05-06 22:27:55 +08:00
谢谢楼主的话。
fhefh
    40
fhefh  
   2018-05-06 22:42:58 +08:00
@elarity 谢谢楼主的分享
kismetX
    41
kismetX  
   2018-05-06 22:57:52 +08:00
感谢分享,看了前面几篇过来赞一个
huigeer
    42
huigeer  
   2018-05-06 22:58:59 +08:00
给 workman 点赞~~
tomychen
    43
tomychen  
   2018-05-06 23:38:48 +08:00   ❤️ 1
在我看来,楼主更多想证明
“ php 也能干这事”

而不是一定要用 PHP 去干这么些事。

至于性效也好,是否比 Go 优越 是否比 Python 牛 X 等等 没试过怎么知道?
看多了 life is short, use python
看一下世界最牛 x 语言的另类用法也不是坏事嘛
elarity
    44
elarity  
OP
   2018-05-07 04:29:37 +08:00 via Android   ❤️ 1
@tomychen
1. 无意证明"php 也能干这个",因为几乎每个语言多多少少都具有操控某些底层的能力,能不能是语言本身就具备的能力,不需要我来证明。
2. 主题第二段 append 已说明:我个人,认输并承认 php 不适合干这个。
3. 如果实在 php 三个字母觉得不舒服,你就自动将主题中 php 三个字换成 ruby 或者 py 就行,都是脚本语言,彼此之间无需相轻,千万别提什么性能差距。如果追求性能,我会选择 go 或者 c 语言。
4. 任何一个语言的从业者,如果不去尝试深入了解甚至去了解核心源码,似乎是说不过去的。
5. 本人更多无意争辩这些,所以,这个评论希望后来者能看到。
h1367500190
    45
h1367500190  
   2018-05-07 08:47:53 +08:00
支持楼主
superkey
    46
superkey  
   2018-05-07 09:07:46 +08:00
相比用 workman,何不去接触下 swoole.
IntFloat
    47
IntFloat  
   2018-05-07 09:08:34 +08:00
感谢楼主分享
OMGZui
    48
OMGZui  
   2018-05-07 09:18:46 +08:00
justudy
    49
justudy  
   2018-05-07 09:23:01 +08:00
能不能做还是要看公司的具体情况的,不能一棒子打死就说 PHP 不适合搞。
ioth
    50
ioth  
   2018-05-07 09:41:41 +08:00
php 是最好的语言。
其次是 c#
然后是 java
c、c++、py,都不算什么。
ioth
    51
ioth  
   2018-05-07 09:42:57 +08:00
socket 有什么用?通信?有几个人用?本身就不标准。
封装直接 tcp/udp 了。
elarity
    52
elarity  
OP
   2018-05-07 09:55:53 +08:00
@ioth

我认为最好的语言应该是 Java,生态完整,语法规整,性能也在不断无限接近 C++
randyzhao
    53
randyzhao  
   2018-05-07 10:22:28 +08:00
嗯 欣赏楼主讨论问题的方式
好与不好我认为永远是相对的,不是绝对的。
在不了解应用场景和开发人员配备等等条件的情况下,一口咬死合适 or 不合适,我认为是不严谨的。
g8287694
    54
g8287694  
   2018-05-07 10:26:06 +08:00
感谢 LZ 反正 PHP 被鄙视也不是一两天了,鄙视 php,还在标题写有 php 的情况下点进来,然后喷几句 PHP 不行,也确实是对 PHP 爱的深沉
lqlqdenm
    55
lqlqdenm  
   2018-05-07 10:34:58 +08:00
又出现语言之争了,怎么. 楼主的博文不错,相信肯定会让广大的 phper 受益匪浅. php 作为一门应用广泛的语言,肯定有很大的优势,当然也会有很大的问题.但总而言之,使用最顺手的兵器总没有错,把自己的贴身技艺学的更好也没有错
predator
    56
predator  
   2018-05-07 10:54:06 +08:00
Workerman 很好,受益了这么些年,该站台的时候要站台
第一眼看到的时候,那种“哇,原来我不用学别的语言也能实现这样的功能”的感觉现在都还记得
生产上有一个服务器监控体系,用 Channel 体系的;还有一个队列消费的小玩意,现在也都还在跑

很多小企业,招一个 java 程序员来?那是添乱……
Jarvix
    57
Jarvix  
   2018-05-07 11:01:18 +08:00
看到那些上来就一顿 bb 合适不合适,性能不行能的真的好烦,希望 LZ 继续保持并相信自己。mark
chenxytw
    58
chenxytw  
   2018-05-07 11:03:03 +08:00
@sagaxu 啊。。。这只能说你遇到的那些 phper 太不讲究了 0 0
在 php5 里面,php 就支持了部分的 typed params,比较好的一种做法是把参数和返回值都包装成 class,这样子可以在定义函数时限定参数的 type
php7 增加了 typed params 的种类,把一些基础类型补全了,可以说在 php7 里面搞类型限定更好了一些

但我遇到的 phper 也是。。。超级喜欢 return array, 然后在外部用 list 去分割。
有一些还喜欢用 compact 和 extract 结合。然后就产生了一堆安全问题,不知道他们是怎么想的
lqlqdenm
    59
lqlqdenm  
   2018-05-07 11:07:11 +08:00
@predator 这就是适用的应用场景,而不是单纯考量好与不好来决定的
salamanderMH
    60
salamanderMH  
   2018-05-07 11:14:20 +08:00
避免争论,感谢楼主给 PHP 的贡献
jsjscool
    61
jsjscool  
   2018-05-07 11:32:59 +08:00
@mailbox 你说的是单进程吧,NodeJs 是不是单进程? Go 是不是单进程?操作系统都类似一个单进程,自己写调度器都一样。
GoPHP
    62
GoPHP  
   2018-05-07 11:38:52 +08:00
你们都错了,不知道 lz 的意思,其实很简单,矮子里面找个高个子嘛!

PHP 被歧视不是一两天了,都说拿来写 web 比较好使,但是写业务代码能写出什么花来?这时候如果有人能用 PHP 写出一个 Windows 客户端出来那就牛逼了?就像那个 swoole,某人吹了多久我也没看见有什么成熟的应用和框架出来,那个文档是拿来给人用的吗?我要是看懂源码我就自己造了。包括那个 yaf,所谓的高性能 C 扩展框架,啥都没有当然高性能,全部自己造轮子多好!

我比较赞同的是不同语言有不同的应用场景,比如 PHP 就是 web 快速开发,你非得常驻内存你为什么不去用 Java ?你非得搞多线程为什么不去用 golang ?写爬虫你为什么不去用 Python ?

写 c 扩展的话,你拿 php 写个操作系统应该也没问题的,毕竟 c 语言是所有语言老祖宗,但是自己玩玩可以,还是不要把别人往坑里面带了!
elarity
    63
elarity  
OP
   2018-05-07 12:27:20 +08:00
@GoPHP 十分中肯,分析到位,句句命中 php 软肋,php 让您受累,应该是“世界上最不该诞生的语言”
snailsir
    64
snailsir  
   2018-05-07 13:24:05 +08:00
博客受益颇多,很多我之前调研和使用过的技术场景,赞一个。

ps: 国人就是喜欢争个是非,没有那种匠人精神,语言终究是工具,能干完活就行。
nosay
    65
nosay  
   2018-05-07 13:38:45 +08:00   ❤️ 1
楼主我支持你,已 STAR。

楼上几位 ID 看着眼熟,本贴好像潜伏一群 PHP 黑子。抬眼瞅到那个说 “矮子里面找个高个子嘛! ” 的兄弟,好像前段时间用 go 随便写段程序把自己写的 php 程序给搞趴了,然后开始到处黑 PHP,真是 233333。

楼主这些文章,最起码的可以提高一部分 phper 的认知,科普了一些很有用的东西,很有价值。
MushishiXian
    66
MushishiXian  
   2018-05-07 13:44:04 +08:00
有时间去黑一门语言的人,还不如用这些时间去提升自己,道听途说或者走个 demo 的,不觉得自己很无知么
askfilm
    67
askfilm  
   2018-05-07 13:46:21 +08:00
@GoPHP 你的想法就是"何不食肉糜"

另外别人在传授经验和知识, 你居然说他把别人往“坑”里带? 不尊重别人的劳动成果和好意, 只知道动嘴皮子乱喷, 所以请自重!
virus94
    68
virus94  
   2018-05-07 15:11:07 +08:00
php 现在就这么不堪么? 虽然没有之前火了,可毕竟还有很多人在用,没必要一直喷吧.
再说楼主是在分享经验,讨论技术,楼下的评论怎么都越来越偏了
lepig
    69
lepig  
   2018-05-07 15:31:30 +08:00
别的不说 看了楼主的追评 我先 star 一波
topthink
    70
topthink  
   2018-05-07 15:42:20 +08:00
楼主,支持转载不:) 这种教程对于很多 PHP 开发者还是有用处的
elarity
    71
elarity  
OP
   2018-05-07 15:51:08 +08:00
@topthink 对大家有帮助,可以转载,处于私心,建议保留下出处。一两年前,我是喷过 thinkphp 的,现在想想以前的做法和想法确实都不太成熟,欠缺考虑。希望 tp 越来越好。
topthink
    72
topthink  
   2018-05-07 16:03:46 +08:00
@elarity 我会转载到看云 不过你也可以认领后面 如果需要的话 作为电子书的方式 方便用户阅读
另外关于 tp5 和 workerman 的整合 以后多多探讨
anewg
    73
anewg  
   2018-05-07 16:06:04 +08:00
@virus94 编程语言分两大类,被人黑的,和没人用的。
elarity
    74
elarity  
OP
   2018-05-07 16:11:18 +08:00
@topthink 1,👌 , 有劳!
Junjunya
    75
Junjunya  
   2018-05-07 16:13:16 +08:00
@topthink tp5 和 workerman 或者 swoole 的整合并不是一件简单的事。
毕竟大部分框架都没考虑常驻内存的情景。
目前发现较好的一种方式是自己实现路由 然后引入 tp5 的独立包
比如 现在 easyswoole 可以引入 think-orm、think-template 包的方式来使用部分 tp 的功能
虽然现在来说 easyswoole 并不成熟
elarity
    76
elarity  
OP
   2018-05-07 16:18:34 +08:00
@Junjunya wm 官方有些整合 tp5 的解决方案,不过,如果 tp 官网有时间,可以修改适配一个 wm 版本的 tp
topthink
    77
topthink  
   2018-05-07 18:01:55 +08:00
@Junjunya 整合目前的框架肯定是不太容易的 但规划好也是有可能更方便的 框架也有改进的空间的 我的希望是官方内核做一些改进后面能尽量简单一些

@elarity 嗯,可以提供参考或者交流 我们有计划对下一个版本 改进下对 workerman 或者 swoole 的支持
GoPHP
    78
GoPHP  
   2018-05-07 18:07:52 +08:00
再补充一句,如果想真正研究技术不如个靠谱的书来看看,比如 Unix 网络编程之类的,没必要死磕什么 PHP socket,要知道 php 底层也就调个 C 的 api 而已,难不成 PHP 还能玩出花来?
elarity
    79
elarity  
OP
   2018-05-07 18:49:49 +08:00 via Android
@GoPHP
1. 如您所想,php 不能玩出花,我们也都是闹着玩的
2. 托您指导,刚知道 richard 还写过这书,井底之蛙开眼界了
3. 再次感谢莅临指导
elarity
    80
elarity  
OP
   2018-05-07 19:04:43 +08:00
@topthink 我企鹅 ID:four two 677833,方便联系~
uhohoo
    81
uhohoo  
   2018-05-07 19:13:55 +08:00 via Android
感谢 LZ 的分享,写得通俗易懂
至少让能 phper 接触到这方面的知识
至于能深入到什么程度,那就是个人的追求了
wujunze
    82
wujunze  
   2018-05-07 19:20:13 +08:00
感谢分享 👍
GoPHP
    83
GoPHP  
   2018-05-07 19:30:36 +08:00
PHP 开发业务最快!
PHP 写多线程最好!
PHP 异步 IO 吊炸天!
PHPsocket 秒天秒地!

总结:PHP 是世界上最好的语言!
pzzrudlf
    84
pzzrudlf  
   2018-05-07 19:34:20 +08:00 via Android
感谢楼主的分享,这对于学习 PHP 大有裨益。
elarity
    85
elarity  
OP
   2018-05-07 19:48:57 +08:00
@GoPHP

恕我直言,不敢苟同您的说法。
而且您前后言论似乎不一,不知道是不是出了什么问题。
linxl
    86
linxl  
   2018-05-07 19:58:29 +08:00
@elarity 这种人, 阴阳怪气的
linxb
    87
linxb  
   2018-05-07 19:59:07 +08:00
@GoPHP 戾气有点重了
FYK
    88
FYK  
   2018-05-07 21:00:51 +08:00
@chenxytw 您好啊,我想请教下您在 #58 的相关说法。

1. 关于 typed params 是指参数的类型声明?
2. 关于「把参数和返回值都包装成 class,这样子可以在定义函数时限定参数的 type 」是指?如果要限定函数参数的类型,我记得目前 php 是支持的,在参数名之前加类型即可,可能因为版本的原因,逐步引入更多类型,所以我们对此的印象不同也有可能。以及为什么要用类来包装参数和返回值,我这里完全不了解,连基本概念都没有,所以也不知道如何问才算是正确的,请问有相关的关键词可以帮助我去搜索吗?
wtcoder
    89
wtcoder  
   2018-05-07 23:23:51 +08:00
什么语言都好, 能解决问题是最关键的。 老板才不关心你用什么语言。

楼主至少用 PHP 帮很多人解决了现实问题,让很多人开阔了眼界。 先点个赞。

喷子们有这功夫,麻烦在你们的领域多创造点价值..
chenxytw
    90
chenxytw  
   2018-05-08 00:01:03 +08:00   ❤️ 1
@FYK
问题 1: 是的
问题 2: 在 php5 中,不支持将类型限定为 int, float, string, bool 等基础类型,这些是在 php7 中加进来的。
至于将参数包装为 class, 是一种仁者见仁智者见智的经验吧,也不是说要把所有参数都包装起来,是那些有需要的参数。
主要是有两个方面的考虑
1. 是在 php5 时期补完 typed params 的缺陷,毕竟 class 类型的声明是最早支持的,在 5.0 时期就支持了,比 array 还早
2. 是方便参数扩展,当然这个用 array 也可以完成,但如果考虑兼容的话,array 需要额外去做一些 default 值,isset 判断操作,虽然也可以包装成函数统一做,但个人认为用 class 继承一个统一的基类看起来更好看一些。
(不过缺点也很明显,就是会变得很罗嗦很冗长,所以一般我也就是把一些配置类的参数搞成这样子,
不过也和我接手的是老项目有关系,OO 的程度不是很高,没有很好的利用起来成员变量)
DiverRD
    91
DiverRD  
   2018-05-08 00:15:02 +08:00 via iPhone
说个题外话,v2 有些程序员智商是高,但是情商真的低得可怕,连交流都是一种障碍。我是 php 初学者,也是 php 受益者。php 给我在入行带来迅速的开发,诚然 php 是有一些缺点。甚至对比一些其他语言是致命的缺点。但 php 也有他的长处。php 可能不能擅长做某些事,但是并不代表他不能做某些事。作为 phper 真心不希望别人只看到 php 的缺点而不去关注他的优点。
另外楼主,一在 v2 友好的传播知识,二也没在贴里带节奏,为啥就要被攻击,如果真的这样,那分享知识还有意义吗?真的大佬早就熟悉几门语言。知道什么时间什么场景需要哪些语言去做擅长的事。
最后我想说,码仔何必为难码仔。

如果言论过于严厉,望轻喷。
suit
    92
suit  
   2018-05-08 00:42:53 +08:00
干货很多,支持一下(有些看着好眼熟,总感觉在哪看过)
changwei
    93
changwei  
   2018-05-08 01:37:45 +08:00 via Android
我猜,如果楼主一开始就把 append 的自我介绍写在正文,估计下面都是一片“感谢”,“支持”,“已收藏”之类的回复了。
还有那些成天争论语言优劣,吐槽 php 是单线程,吐槽这个语言卡那个语言慢的人,估计 c 语言下都从来没有使用过 epoll.h,pthread.h,sem.h,也没学过编译原理吧。
把这些时间花在研究研究语言底层实现上,估计也已经成了一个大牛了。
sagaxu
    94
sagaxu  
   2018-05-08 09:44:47 +08:00 via Android   ❤️ 1
@chenxytw 我个人感觉,核心数据,服务间接口,返回 3 次以上的返回值类型,嵌套层数超过 2 层或者单层超过 10 个 key 时,可以考虑定义明确的类型。遗憾的是中高级 php 开发们似乎不大认同这种做法,他们还是能返回 array 的地方都返回了 array,class 只是用来聚合 method。像 Java 那样拒绝 map,处处定义 vo/dto 又是另一个极端。
elarity
    95
elarity  
OP
   2018-05-08 10:04:19 +08:00
@chenxytw
@FYK

补充一下,参数传入对象以及执行返回对象,都可以使用对象来实现。 @FYK 你可以继承 arrayAccess 接口,使得对象本身也具备像 php 数组那样的使用方法,甚至可以使用__set 方法实现对元素类型的校验。
利用这些一些技巧,可以保证 php 返回的数据类型不会莫名其妙变化,导致敏感客户端的 crash

PHP 的数组很强大,强大到成了灾难,就像北方抗击沙尘绿化用杨柳,结果柳絮满天飞一样。
elarity
    96
elarity  
OP
   2018-05-08 10:06:01 +08:00
@sagaxu 说的很中肯,大多数 phper 都是直接返回 array,array 再嵌套 array,如果是 web 编程还可能会好些,如果是 api 实现,客户端的人受不了。
lqlqdenm
    97
lqlqdenm  
   2018-05-08 10:24:44 +08:00
@elarity php 提供纯的对象 stdClass,或者 ArrayObject 对象需要类型返回的数据不错
respect11
    98
respect11  
   2018-05-08 14:17:19 +08:00
@GoPHP 不知道虎牙算不算 swoole 的一次应用
chenxytw
    99
chenxytw  
   2018-05-08 14:36:12 +08:00
@sagaxu 他们应用的 OO 程度太低了.....
还有就是有些人(包括我)受不了 Java 那种什么都要封装成 class 的做法.....
chenxytw
    100
chenxytw  
   2018-05-08 14:36:57 +08:00
@elarity 太过灵活了,就对代码质量有比较高的要求。。。不然就会 Bug 满天飞....
1  2  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1030 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 29ms · UTC 21:25 · PVG 05:25 · LAX 13:25 · JFK 16:25
Developed with CodeLauncher
♥ Do have faith in what you're doing.