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

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

  •  
  •   ericgui · 2017-06-26 17:12:24 +08:00 · 3502 次点击
    这是一个创建于 2708 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在做一个网站后台系统,一个学 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 条回复    2017-06-27 11:07:01 +08:00
    barbery
        1
    barbery  
       2017-06-26 17:17:26 +08:00
    弄个异步队列不就完了么
    jasonz
        2
    jasonz  
       2017-06-26 17:18:19 +08:00
    > Threading in PHP should therefore remain to CLI-based applications only.

    开个外部程序单独跑
    Jakesoft
        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)
    zgk
        4
    zgk  
       2017-06-26 17:23:40 +08:00 via Android
    我觉得楼主需要理解一下 PHP 运行的机制,作为 web 服务器的时候它是按照 CGI 的方式来工作的,这时候就不能多线程了
    Jakesoft
        5
    Jakesoft  
       2017-06-26 17:23:55 +08:00
    #3 逗大家一笑,无其他含义,忽略
    zgk
        6
    zgk  
       2017-06-26 17:25:10 +08:00 via Android
    在知乎上搜到一个相关的问题,希望能带来帮助
    https://www.zhihu.com/question/30672017
    chenqh
        7
    chenqh  
       2017-06-26 17:29:09 +08:00
    再土一点,可以搞个 crontab。。
    zgk
        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 框架,这时候用这个扩展就没有什么问题了。
    z5864703
        9
    z5864703  
       2017-06-26 17:40:13 +08:00
    用异步队列,是最佳解决方案
    zjsxwc
        10
    zjsxwc  
       2017-06-26 18:27:02 +08:00
    如果只发一个邮件那么怎么发都没关系,当然要优化用户体验也可以用黑魔法 fastcgi_finish_request。
    如果是批量发邮件那么用队列就好了,pthreads 就是个玩具,避免在生产环境使用。
    Actrace
        11
    Actrace  
       2017-06-26 18:51:08 +08:00
    3 年前玩过一年的 pthreads,PHP 的 pthreads 坑很多,我刚刚又看了一下,似乎很多 Bug 都解决了,很好。
    但是还是可能会有隐藏的 Bug。因此不推荐用来作为一种解决手段。

    批量发送邮件的话,可以在 web 上接收请求并写入数据库,然后另起一个 PHP 进程来处理这些邮件发送的队列。如果愿意的话,可以用多进程来处理。
    Moker
        12
    Moker  
       2017-06-26 20:24:30 +08:00
    异步队列正解....... 土一点就 crontab 也是可以的。
    PHP 队列推荐可以试试 php-resque 基于 pcntl
    ericgui
        13
    ericgui  
    OP
       2017-06-26 22:12:11 +08:00
    @barbery
    @z5864703
    @zjsxwc
    @Moker 非常感谢!我试试异步队列。
    ericgui
        14
    ericgui  
    OP
       2017-06-26 22:16:56 +08:00
    @zgk 谢谢,我去学习一下
    ericgui
        15
    ericgui  
    OP
       2017-06-26 22:17:17 +08:00
    @Actrace 谢谢,那我就不用 pthreads 了
    z5864703
        16
    z5864703  
       2017-06-27 11:07:01 +08:00
    @ericgui 别把多线程的应用场景搞错了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2743 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:35 · PVG 19:35 · LAX 03:35 · JFK 06:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.