【问题标题】:Working with Threads using Apache and PHP使用 Apache 和 PHP 处理线程
【发布时间】:2014-11-23 14:23:59
【问题描述】:

在 Linux/Windows 上是否可以通过 Apache(使用浏览器)在 PHP 中使用 threads

【问题讨论】:

  • 你试过用谷歌搜索,比如'PHP thread'吗?
  • 是的,当然。但结果并不明确。我正在使用 Apache(通过浏览器)搜索 PHP 线程。 Google 从命令行返回使用 PHP 的线程。
  • 不要对我的问题投反对票。这是相关的。
  • @Richard:你的问题太宽泛,不清楚(“通过浏览器”-通过浏览器的服务器端线程?),没有显示任何代码或认真研究的迹象。请原谅我,有很多理由不赞成和标记您的问题。
  • 好吧...这是您的权利。

标签: php linux windows multithreading apache


【解决方案1】:

仅仅是可以做某事的事实,并不能说明它是否合适。

事实是,pthreads+PHP使用的线程模型是1:1的,也就是说一个用户线程对一个内核线程。

在 apache 内部的 Web 应用程序的前端部署这个模型并没有什么意义;如果前端控制器指示硬件创建少量线程,例如 8 个,并且 100 个客户端同时请求控制器,您将要求您的硬件执行 800 个线程。

pthreads 可以部署在 apache 内部,但不应该这样。您应该做的是尝试隔离应用程序中需要线程提供的部分,并通过某种合理的 RPC 形式与隔离的多线程子系统进行通信。

我写了 pthreads,请听。

【讨论】:

    【解决方案2】:

    非常气馁。

    pcntl_fork 函数(如果您的设置完全允许)将分叉 Apache 工作程序本身,而不是脚本,并且很可能在子进程完成后您将无法声明它。 这会导致许多僵尸 Apache 进程。

    我建议使用后台工作程序池,作为守护程序/服务正确运行,或者至少与启动控制台正确分离(例如使用 screen),并且您的同步 PHP/Apache 脚本会将作业请求推送到此池, 使用套接字。

    有帮助吗?

    [编辑] 我会提供以上作为评论,但我没有足够的声誉这样做(顺便说一句,我觉得很奇怪,因为你太初级而无法发表评论)。

    [Edit2] pthread 似乎是一个有效的解决方案! (我没有尝试过,所以我不能建议)

    【讨论】:

    • 您能否提供一些参考,关于您的建议,我可以遵循?
    • 当 PHP 用作 Apache 模块时,不能使用函数 'pcntl_fork'。您只能在 CGI 模式或命令行中使用 pcntl_fork。
    • “不可能”是什么意思?如“不会按预期工作”?还是在“未在此上下文中定义的功能”中?因为如果是后者,只需在 PHP.ini 中正确启用它即可。但是,确实不建议这样做,因为它会分叉 Apache 工作程序,而这不是您想要做的。
    • 是的,它在那里读取“未定义函数”,但实际上它只取决于您的 php.ini,尤其是 disable_functions 属性。您可以完美地启用它并...在几分钟内关闭您的整个系统:)
    • Gabriel 有一个很好的答案,因为它解释了一些有意义的事情——因为分叉将分叉 Apache 工作线程而不仅仅是 php 进程。我可以明白为什么这不是我们想要的。我怀疑 Richard 真的想要一种将特定函数作为后台线程运行的方法,就像在许多其他语言中一样,这不涉及对整个进程的副本进行分叉。不是每个人都将 LAMP 系统用于公共 Web 服务,我们将它们用于 Intranet 上的工程系统。有时,如果有备用内核来运行它们,您想要的只是一组并行执行的步骤。
    猜你喜欢
    • 2013-10-17
    • 1970-01-01
    • 2013-09-04
    • 2023-03-31
    • 2023-03-29
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多