pthreads 有一个非常困惑的地方,能否请老司机指点一二?

2017-06-26 17:12:24 +08:00
 ericgui

我现在做一个网站后台系统,一个学 Java 的老司机告诉我,email 发送很耗时,因此要多开一个线程。 但奈何我一点都不懂多线程和多进程。

所以请老司机能否推荐一下这方面资料?

另外,我在看 pthreads 时,发现一个非常困惑的地方:

我看了一个 github 的 repo,https://github.com/krakjoe/pthreads 它的网站上有这么一句话: http://pthreads.org/ It includes all the tools you need to create multi-threaded applications targeted at the Web or the Console.

但在 PHP 官网上,http://docs.php.net/manual/en/book.pthreads.php 有这么一段话: Warning The pthreads extension cannot be used in a web server environment. Threading in PHP should therefore remain to CLI-based applications only.

所以我到底能不能用于 web 开发呢?

如果 问了一个蠢问题,请多多海涵,我对多进程和多线程真的没概念。

3527 次点击
所在节点    PHP
16 条回复
barbery
2017-06-26 17:17:26 +08:00
弄个异步队列不就完了么
jasonz
2017-06-26 17:18:19 +08:00
> Threading in PHP should therefore remain to CLI-based applications only.

开个外部程序单独跑
Jakesoft
2017-06-26 17:22:48 +08:00
所以我向来想去上 V2EX 问问,看到这个网站上面也有这么一句话:

> There are many ways to solve your problem, and the most right way is to search it with [百度]( https://www.baidu.com)
zgk
2017-06-26 17:23:40 +08:00
我觉得楼主需要理解一下 PHP 运行的机制,作为 web 服务器的时候它是按照 CGI 的方式来工作的,这时候就不能多线程了
Jakesoft
2017-06-26 17:23:55 +08:00
#3 逗大家一笑,无其他含义,忽略
zgk
2017-06-26 17:25:10 +08:00
在知乎上搜到一个相关的问题,希望能带来帮助
https://www.zhihu.com/question/30672017
chenqh
2017-06-26 17:29:09 +08:00
再土一点,可以搞个 crontab。。
zgk
2017-06-26 17:32:39 +08:00
“ CGI 是 HTTP Server 和一个独立的进程之间的协议,把 HTTP Request 的 Header 设置成进程的环境变量,HTTP Request 的正文设置成进程的标准输入,而进程的标准输出就是 HTTP Response 包括 Header 和正文。”

也就是说,服务器在收到 HTTP 请求之后是把这个请求作为环境变量和标准输入来启动 PHP 进程的,这时候多线程的话会出现很多问题,所以它和你说不能这么用。

当你的应用是通过命令行来启动的话,类似 swoole 框架,这时候用这个扩展就没有什么问题了。
z5864703
2017-06-26 17:40:13 +08:00
用异步队列,是最佳解决方案
zjsxwc
2017-06-26 18:27:02 +08:00
如果只发一个邮件那么怎么发都没关系,当然要优化用户体验也可以用黑魔法 fastcgi_finish_request。
如果是批量发邮件那么用队列就好了,pthreads 就是个玩具,避免在生产环境使用。
Actrace
2017-06-26 18:51:08 +08:00
3 年前玩过一年的 pthreads,PHP 的 pthreads 坑很多,我刚刚又看了一下,似乎很多 Bug 都解决了,很好。
但是还是可能会有隐藏的 Bug。因此不推荐用来作为一种解决手段。

批量发送邮件的话,可以在 web 上接收请求并写入数据库,然后另起一个 PHP 进程来处理这些邮件发送的队列。如果愿意的话,可以用多进程来处理。
Moker
2017-06-26 20:24:30 +08:00
异步队列正解....... 土一点就 crontab 也是可以的。
PHP 队列推荐可以试试 php-resque 基于 pcntl
ericgui
2017-06-26 22:12:11 +08:00
@barbery
@z5864703
@zjsxwc
@Moker 非常感谢!我试试异步队列。
ericgui
2017-06-26 22:16:56 +08:00
@zgk 谢谢,我去学习一下
ericgui
2017-06-26 22:17:17 +08:00
@Actrace 谢谢,那我就不用 pthreads 了
z5864703
2017-06-27 11:07:01 +08:00
@ericgui 别把多线程的应用场景搞错了

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

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

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

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

© 2021 V2EX