ericgui
V2EX  ›  PHP

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

  •  
  •   ericgui · Jun 26, 2017 · 4470 views
    This topic created in 3417 days ago, the information mentioned may be changed or developed.

    我现在做一个网站后台系统,一个学 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 开发呢?

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

    16 replies  •  2017-06-27 11:07:01 +08:00
    barbery
    barbery
    Jun 26, 2017
    1
    弄个异步队列不就完了么
    jasonz
    jasonz
    Jun 26, 2017
    2
    > Threading in PHP should therefore remain to CLI-based applications only.

    开个外部程序单独跑
    Jakesoft
    Jakesoft
    Jun 26, 2017
    3
    所以我向来想去上 V2EX 问问,看到这个网站上面也有这么一句话:

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

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

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

    批量发送邮件的话,可以在 web 上接收请求并写入数据库,然后另起一个 PHP 进程来处理这些邮件发送的队列。如果愿意的话,可以用多进程来处理。
    Moker
    Moker
    Jun 26, 2017
    12
    异步队列正解....... 土一点就 crontab 也是可以的。
    PHP 队列推荐可以试试 php-resque 基于 pcntl
    ericgui
    ericgui
    OP
    Jun 26, 2017
    13
    @barbery
    @z5864703
    @zjsxwc
    @Moker 非常感谢!我试试异步队列。
    ericgui
    ericgui
    OP
    Jun 26, 2017
    14
    @zgk 谢谢,我去学习一下
    ericgui
    ericgui
    OP
    Jun 26, 2017
    15
    @Actrace 谢谢,那我就不用 pthreads 了
    z5864703
    z5864703
    Jun 27, 2017
    16
    @ericgui 别把多线程的应用场景搞错了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4917 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 08:07 · PVG 16:07 · LAX 00:07 · JFK 03:07
    ♥ Do have faith in what you're doing.