一开始博客都是在 cnblog,大多数复制粘贴,一小部分是自己写,主要功能就是记录记忆功能
后来整理了一些有用的部分,然后自己又写了一些,基本都是关于 php 的多进程、socket 以及 stream 相关的一些教程,放到了 github 上,当然,目前还在继续更新中,这是一个长期的活儿。
github 地址: https://github.com/elarity/advanced-php
欢迎指出其中错误的地方!
1
elarity OP 补充一下,github 上的 PHP 教程更多是偏向于多进程的 php socket server 方向,博客上的内容更为广泛些,等待指出批评 https://blog.ti-node.com
|
2
mailbox 2018-05-05 20:41:18 +08:00
php 跑 socket 很累的,天生单线程
|
4
Mrun 2018-05-05 21:40:21 +08:00
我觉得拿 PHP 做这个时候走了歧路,socket 的应用场景在 php 真的很少,也不适合
|
5
elarity OP |
6
MeteorCat 2018-05-05 22:39:13 +08:00
@Mrun 也不能說,我感覺對於小程序|微信游戲這種,`swoole`能夠讓原來 PHP 開發人員迅速轉移開發;不像我們游戲服務端開發已經招了大半年.......
|
8
eoo 2018-05-06 02:02:49 +08:00 via Android
socket? 上 nodejs
|
10
DavidNineRoc 2018-05-06 07:47:21 +08:00 via Android
mark
|
11
linxl 2018-05-06 09:05:06 +08:00
嗯, php 进阶的一个方向就是这里了.
|
12
sagaxu 2018-05-06 09:14:34 +08:00 via Android
php 应该保持简单,甚至是极简。用 advanced 修饰的 php,还是用更合适的工具比较好。最适合 phper 的附加技能就是 golang。
|
13
askfilm 2018-05-06 09:16:26 +08:00
已 star, 挺好,值得学习学习
|
15
shilyx 2018-05-06 09:52:29 +08:00
对于 c/c++、java 等开发者来说,转入 php 是有幸福感的,要做的事情更纯粹了,更有针对性了。
但是如果开发者从 php 入门,如果不横向扩展的话,那么世界观将是狭隘的。这种开发者应该扩展一下视野,了解一下整个程序是怎么运作的,而非仅仅是 cgi 模式下的一个 session 的运作。 |
16
elarity OP @shilyx 是的,一个 phper 不能离开了 nginx 和 apache 就没法混。即便是转 java go 也一样不会深入,也不会用的更好。这是认知水平的问题,与语言无关。
|
17
Mrun 2018-05-06 13:40:05 +08:00
@elarity 这年头 PHPer 谁不知道 workerman 和 swoole,你还是没有理解我的意思,大部分有 socket 场景的业务会有更加成熟的方案,虽然在你看来,workerman 或者 swoole 非常棒,这两者也确实也非常好,但是抱歉的是,PHP 在这里面确实不是最好的方案
|
18
elarity OP @Mrun 我说了的,也没理解错你的意思。不同的认知而已。有人认为不合适,有人认为合适,这才是正确的世界。thx
|
19
sagaxu 2018-05-06 14:36:33 +08:00 via Android
@shilyx java 转入 php 毫无幸福感,array 代替了 class 定义,自动补全和编译器检查失效了。受制于 fpm 的请求生命周期设定,很多用的顺手的方式都不能用了。放眼望去,没有一个框架能跟 springboot 一样同时做到简洁和弹性还不丢性能。
|
20
chenxytw 2018-05-06 16:11:41 +08:00
php 这种天生为 web 设计的语言不适合写常驻内存的程序 0 0
不适合的原因在于能力的缺失。要么就是 C 接口的简单封装,要么根本就不支持。 比较成熟可用的解决方案都是通过 C 扩展开发的,受制于解释器能力。这是 PHP 基本特性决定的。 当然,我十分尊重你认为 PHP 也能做好这件事情。只是希望你能认清在 “当前” 你还无法靠 "纯 PHP" 来解决这些事情。 (说个不太贴切的现实就是,甚至 PHP 官方自己都没有去做这件事情) |
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 |
23
askfilm 2018-05-06 16:57:30 +08:00
@sagaxu 你知道 php 的框架 symfony, 整个 symfony 开发是相当有企业标准的(愉悦的),简单的说它是 php 中 spring, 借鉴了非常多的 spring 的先进思想, 可以说是 php 标准的引领者和教父, 有时间你可以了解一下
|
24
askfilm 2018-05-06 17:06:34 +08:00
@chenxytw 我有实际项目经验, 公司里的 php 常驻业务进程, 运行了数年, 非常的安全可靠! 所以我不认同你的看法, 因为你并没有从实践中获得结论, 而是人云亦云 。
你认为 php 天生上有些缺陷,我也认为确实有,但是实践中很多事情其实不需要完美的解决方案, 只要有高效低成本实现,其实就已经够了 |
25
shilyx 2018-05-06 17:45:17 +08:00
@sagaxu 是我表达的不够清楚,我的意思是说 php 针对性的做了一些事,十分的方便。从原生领域转过来的话能体会到这种尝试,所以会觉得很幸福。并非 php 让人很幸福。
事实上,我从未涉足过 php。php、basic 是大约十年前左右划定的我的不征之语言,不看不学不用不研究。 |
26
dexterlei 2018-05-06 17:47:12 +08:00
手动点个赞
|
27
zsxzy 2018-05-06 17:54:03 +08:00
赞, 我喜欢用 php7 写点 web 小项目和 api 后台, 非常方便快速
|
28
whyiyhw 2018-05-06 18:46:10 +08:00 via Android
手动点赞,作为一个正在横向扩展的 PHPer,自学这块的时候,有时候真的是很难,但是都是一个过程,解决完问题之后还是很有成就感的。我是觉得应该多学几门语言,一是有启发作用,毕竟 PHP 做的太好了,屏蔽了大量底层细节,二是手上只有锤子,那看什么也只能都是钉子。毕竟是一份以解决问题为导向的工作,只要不加班,一切都 OK。
|
29
to2false 2018-05-06 19:05:31 +08:00
mark 围观
|
30
lxrmido 2018-05-06 19:13:12 +08:00
写了六七年 PHP 了,来点个赞
|
31
leven87 2018-05-06 19:35:46 +08:00 via Android
php 在 web 端没有对手
|
32
nicevar 2018-05-06 19:47:04 +08:00
好东西,mark 一下
要快速出活选 php 还是很给力的,04 年就开始接触 php,没学过大致能看懂,过去的十来年一直都在写 c/c++/java,今年有个 app 想快点发布,后端选择用 php 的 CI 来写,直接文档+google 没多久就搞完了,非常满意 |
33
weirdo 2018-05-06 20:15:42 +08:00
mark 一下
|
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 个以上例子,反过来的却很少,这难道不能说明一些问题? |
35
elarity OP |
36
k9982874 2018-05-06 21:06:03 +08:00
之前公司手底下一个人拿 workerman 写游戏后端服务,然后就没有然后了
|
38
songjiaxin2008 2018-05-06 21:31:31 +08:00 via iPhone
@sagaxu 用 dto 呀 php 要写好确实需要很多约束
|
39
Stevenv 2018-05-06 22:27:55 +08:00
谢谢楼主的话。
|
41
kismetX 2018-05-06 22:57:52 +08:00
感谢分享,看了前面几篇过来赞一个
|
42
huigeer 2018-05-06 22:58:59 +08:00
给 workman 点赞~~
|
43
tomychen 2018-05-06 23:38:48 +08:00 1
在我看来,楼主更多想证明
“ php 也能干这事” 而不是一定要用 PHP 去干这么些事。 至于性效也好,是否比 Go 优越 是否比 Python 牛 X 等等 没试过怎么知道? 看多了 life is short, use python 看一下世界最牛 x 语言的另类用法也不是坏事嘛 |
44
elarity OP @tomychen
1. 无意证明"php 也能干这个",因为几乎每个语言多多少少都具有操控某些底层的能力,能不能是语言本身就具备的能力,不需要我来证明。 2. 主题第二段 append 已说明:我个人,认输并承认 php 不适合干这个。 3. 如果实在 php 三个字母觉得不舒服,你就自动将主题中 php 三个字换成 ruby 或者 py 就行,都是脚本语言,彼此之间无需相轻,千万别提什么性能差距。如果追求性能,我会选择 go 或者 c 语言。 4. 任何一个语言的从业者,如果不去尝试深入了解甚至去了解核心源码,似乎是说不过去的。 5. 本人更多无意争辩这些,所以,这个评论希望后来者能看到。 |
45
h1367500190 2018-05-07 08:47:53 +08:00
支持楼主
|
46
superkey 2018-05-07 09:07:46 +08:00
相比用 workman,何不去接触下 swoole.
|
47
IntFloat 2018-05-07 09:08:34 +08:00
感谢楼主分享
|
48
OMGZui 2018-05-07 09:18:46 +08:00
赞
|
49
justudy 2018-05-07 09:23:01 +08:00
能不能做还是要看公司的具体情况的,不能一棒子打死就说 PHP 不适合搞。
|
50
ioth 2018-05-07 09:41:41 +08:00
php 是最好的语言。
其次是 c# 然后是 java c、c++、py,都不算什么。 |
51
ioth 2018-05-07 09:42:57 +08:00
socket 有什么用?通信?有几个人用?本身就不标准。
封装直接 tcp/udp 了。 |
53
randyzhao 2018-05-07 10:22:28 +08:00
嗯 欣赏楼主讨论问题的方式
好与不好我认为永远是相对的,不是绝对的。 在不了解应用场景和开发人员配备等等条件的情况下,一口咬死合适 or 不合适,我认为是不严谨的。 |
54
g8287694 2018-05-07 10:26:06 +08:00
感谢 LZ 反正 PHP 被鄙视也不是一两天了,鄙视 php,还在标题写有 php 的情况下点进来,然后喷几句 PHP 不行,也确实是对 PHP 爱的深沉
|
55
lqlqdenm 2018-05-07 10:34:58 +08:00
又出现语言之争了,怎么. 楼主的博文不错,相信肯定会让广大的 phper 受益匪浅. php 作为一门应用广泛的语言,肯定有很大的优势,当然也会有很大的问题.但总而言之,使用最顺手的兵器总没有错,把自己的贴身技艺学的更好也没有错
|
56
predator 2018-05-07 10:54:06 +08:00
Workerman 很好,受益了这么些年,该站台的时候要站台
第一眼看到的时候,那种“哇,原来我不用学别的语言也能实现这样的功能”的感觉现在都还记得 生产上有一个服务器监控体系,用 Channel 体系的;还有一个队列消费的小玩意,现在也都还在跑 很多小企业,招一个 java 程序员来?那是添乱…… |
57
Jarvix 2018-05-07 11:01:18 +08:00
看到那些上来就一顿 bb 合适不合适,性能不行能的真的好烦,希望 LZ 继续保持并相信自己。mark
|
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 结合。然后就产生了一堆安全问题,不知道他们是怎么想的 |
60
salamanderMH 2018-05-07 11:14:20 +08:00
避免争论,感谢楼主给 PHP 的贡献
|
61
jsjscool 2018-05-07 11:32:59 +08:00
@mailbox 你说的是单进程吧,NodeJs 是不是单进程? Go 是不是单进程?操作系统都类似一个单进程,自己写调度器都一样。
|
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 语言是所有语言老祖宗,但是自己玩玩可以,还是不要把别人往坑里面带了! |
64
snailsir 2018-05-07 13:24:05 +08:00
博客受益颇多,很多我之前调研和使用过的技术场景,赞一个。
ps: 国人就是喜欢争个是非,没有那种匠人精神,语言终究是工具,能干完活就行。 |
65
nosay 2018-05-07 13:38:45 +08:00 1
楼主我支持你,已 STAR。
楼上几位 ID 看着眼熟,本贴好像潜伏一群 PHP 黑子。抬眼瞅到那个说 “矮子里面找个高个子嘛! ” 的兄弟,好像前段时间用 go 随便写段程序把自己写的 php 程序给搞趴了,然后开始到处黑 PHP,真是 233333。 楼主这些文章,最起码的可以提高一部分 phper 的认知,科普了一些很有用的东西,很有价值。 |
66
MushishiXian 2018-05-07 13:44:04 +08:00
有时间去黑一门语言的人,还不如用这些时间去提升自己,道听途说或者走个 demo 的,不觉得自己很无知么
|
67
askfilm 2018-05-07 13:46:21 +08:00
|
68
virus94 2018-05-07 15:11:07 +08:00
php 现在就这么不堪么? 虽然没有之前火了,可毕竟还有很多人在用,没必要一直喷吧.
再说楼主是在分享经验,讨论技术,楼下的评论怎么都越来越偏了 |
69
lepig 2018-05-07 15:31:30 +08:00
别的不说 看了楼主的追评 我先 star 一波
|
70
topthink 2018-05-07 15:42:20 +08:00
楼主,支持转载不:) 这种教程对于很多 PHP 开发者还是有用处的
|
71
elarity OP @topthink 对大家有帮助,可以转载,处于私心,建议保留下出处。一两年前,我是喷过 thinkphp 的,现在想想以前的做法和想法确实都不太成熟,欠缺考虑。希望 tp 越来越好。
|
72
topthink 2018-05-07 16:03:46 +08:00
@elarity 我会转载到看云 不过你也可以认领后面 如果需要的话 作为电子书的方式 方便用户阅读
另外关于 tp5 和 workerman 的整合 以后多多探讨 |
75
Junjunya 2018-05-07 16:13:16 +08:00
@topthink tp5 和 workerman 或者 swoole 的整合并不是一件简单的事。
毕竟大部分框架都没考虑常驻内存的情景。 目前发现较好的一种方式是自己实现路由 然后引入 tp5 的独立包 比如 现在 easyswoole 可以引入 think-orm、think-template 包的方式来使用部分 tp 的功能 虽然现在来说 easyswoole 并不成熟 |
76
elarity OP @Junjunya wm 官方有些整合 tp5 的解决方案,不过,如果 tp 官网有时间,可以修改适配一个 wm 版本的 tp
|
77
topthink 2018-05-07 18:01:55 +08:00
|
78
GoPHP 2018-05-07 18:07:52 +08:00
再补充一句,如果想真正研究技术不如个靠谱的书来看看,比如 Unix 网络编程之类的,没必要死磕什么 PHP socket,要知道 php 底层也就调个 C 的 api 而已,难不成 PHP 还能玩出花来?
|
79
elarity OP |
81
uhohoo 2018-05-07 19:13:55 +08:00 via Android
感谢 LZ 的分享,写得通俗易懂
至少让能 phper 接触到这方面的知识 至于能深入到什么程度,那就是个人的追求了 |
82
wujunze 2018-05-07 19:20:13 +08:00
感谢分享 👍
|
83
GoPHP 2018-05-07 19:30:36 +08:00
PHP 开发业务最快!
PHP 写多线程最好! PHP 异步 IO 吊炸天! PHPsocket 秒天秒地! 总结:PHP 是世界上最好的语言! |
84
pzzrudlf 2018-05-07 19:34:20 +08:00 via Android
感谢楼主的分享,这对于学习 PHP 大有裨益。
|
88
FYK 2018-05-07 21:00:51 +08:00
@chenxytw 您好啊,我想请教下您在 #58 的相关说法。
1. 关于 typed params 是指参数的类型声明? 2. 关于「把参数和返回值都包装成 class,这样子可以在定义函数时限定参数的 type 」是指?如果要限定函数参数的类型,我记得目前 php 是支持的,在参数名之前加类型即可,可能因为版本的原因,逐步引入更多类型,所以我们对此的印象不同也有可能。以及为什么要用类来包装参数和返回值,我这里完全不了解,连基本概念都没有,所以也不知道如何问才算是正确的,请问有相关的关键词可以帮助我去搜索吗? |
89
wtcoder 2018-05-07 23:23:51 +08:00
什么语言都好, 能解决问题是最关键的。 老板才不关心你用什么语言。
楼主至少用 PHP 帮很多人解决了现实问题,让很多人开阔了眼界。 先点个赞。 喷子们有这功夫,麻烦在你们的领域多创造点价值.. |
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 的程度不是很高,没有很好的利用起来成员变量) |
91
DiverRD 2018-05-08 00:15:02 +08:00 via iPhone
说个题外话,v2 有些程序员智商是高,但是情商真的低得可怕,连交流都是一种障碍。我是 php 初学者,也是 php 受益者。php 给我在入行带来迅速的开发,诚然 php 是有一些缺点。甚至对比一些其他语言是致命的缺点。但 php 也有他的长处。php 可能不能擅长做某些事,但是并不代表他不能做某些事。作为 phper 真心不希望别人只看到 php 的缺点而不去关注他的优点。
另外楼主,一在 v2 友好的传播知识,二也没在贴里带节奏,为啥就要被攻击,如果真的这样,那分享知识还有意义吗?真的大佬早就熟悉几门语言。知道什么时间什么场景需要哪些语言去做擅长的事。 最后我想说,码仔何必为难码仔。 如果言论过于严厉,望轻喷。 |
92
suit 2018-05-08 00:42:53 +08:00
干货很多,支持一下(有些看着好眼熟,总感觉在哪看过)
|
93
changwei 2018-05-08 01:37:45 +08:00 via Android
我猜,如果楼主一开始就把 append 的自我介绍写在正文,估计下面都是一片“感谢”,“支持”,“已收藏”之类的回复了。
还有那些成天争论语言优劣,吐槽 php 是单线程,吐槽这个语言卡那个语言慢的人,估计 c 语言下都从来没有使用过 epoll.h,pthread.h,sem.h,也没学过编译原理吧。 把这些时间花在研究研究语言底层实现上,估计也已经成了一个大牛了。 |
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 又是另一个极端。
|
95
elarity OP |
96
elarity OP @sagaxu 说的很中肯,大多数 phper 都是直接返回 array,array 再嵌套 array,如果是 web 编程还可能会好些,如果是 api 实现,客户端的人受不了。
|