我现在做一个网站后台系统,一个学 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 开发呢?
如果 问了一个蠢问题,请多多海涵,我对多进程和多线程真的没概念。
1
barbery 2017-06-26 17:17:26 +08:00
弄个异步队列不就完了么
|
2
jasonz 2017-06-26 17:18:19 +08:00
> Threading in PHP should therefore remain to CLI-based applications only.
开个外部程序单独跑 |
3
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) |
4
zgk 2017-06-26 17:23:40 +08:00 via Android
我觉得楼主需要理解一下 PHP 运行的机制,作为 web 服务器的时候它是按照 CGI 的方式来工作的,这时候就不能多线程了
|
5
Jakesoft 2017-06-26 17:23:55 +08:00
#3 逗大家一笑,无其他含义,忽略
|
6
zgk 2017-06-26 17:25:10 +08:00 via Android
在知乎上搜到一个相关的问题,希望能带来帮助
https://www.zhihu.com/question/30672017 |
7
chenqh 2017-06-26 17:29:09 +08:00
再土一点,可以搞个 crontab。。
|
8
zgk 2017-06-26 17:32:39 +08:00 via Android
“ CGI 是 HTTP Server 和一个独立的进程之间的协议,把 HTTP Request 的 Header 设置成进程的环境变量,HTTP Request 的正文设置成进程的标准输入,而进程的标准输出就是 HTTP Response 包括 Header 和正文。”
也就是说,服务器在收到 HTTP 请求之后是把这个请求作为环境变量和标准输入来启动 PHP 进程的,这时候多线程的话会出现很多问题,所以它和你说不能这么用。 当你的应用是通过命令行来启动的话,类似 swoole 框架,这时候用这个扩展就没有什么问题了。 |
9
z5864703 2017-06-26 17:40:13 +08:00
用异步队列,是最佳解决方案
|
10
zjsxwc 2017-06-26 18:27:02 +08:00
如果只发一个邮件那么怎么发都没关系,当然要优化用户体验也可以用黑魔法 fastcgi_finish_request。
如果是批量发邮件那么用队列就好了,pthreads 就是个玩具,避免在生产环境使用。 |
11
Actrace 2017-06-26 18:51:08 +08:00
3 年前玩过一年的 pthreads,PHP 的 pthreads 坑很多,我刚刚又看了一下,似乎很多 Bug 都解决了,很好。
但是还是可能会有隐藏的 Bug。因此不推荐用来作为一种解决手段。 批量发送邮件的话,可以在 web 上接收请求并写入数据库,然后另起一个 PHP 进程来处理这些邮件发送的队列。如果愿意的话,可以用多进程来处理。 |
12
Moker 2017-06-26 20:24:30 +08:00
异步队列正解....... 土一点就 crontab 也是可以的。
PHP 队列推荐可以试试 php-resque 基于 pcntl |