gpt4 book ai didi

php - PHP 中的多线程/多任务处理

转载 作者:IT王子 更新时间:2023-10-29 00:03:40 24 4
gpt4 key购买 nike

在 PHP 中,我们通常在不考虑服务器功能的情况下进行编码。现在甚至 PC 也有多个内核并处理 64 位数据。据我所知,PHP 引擎本身经过优化以利用多核。我们程序员如何才能进一步优化代码以利用多核。

换句话说,我想知道将教我编写代码的技术,这些代码将更有可能被 php 引擎考虑并行处理。

我不是在要求任何用户定义/开源排队方法,而是以利用多核且运行速度更快的方式编写相同的代码。

如果您已经在做这样的事情,请提出您的想法并分享您的经验。

我希望我们可以进一步优化代码。

最佳答案

自 2000 年 5 月 22 日首次发布 PHP4 以来,PHP 已经拥有线程模型很长时间了。

前端线程

在 Web 应用程序的前端创建用户线程没有任何意义;很难扩展。 Apache Worker MPM 二进制文件和 mod_php 使用的每个客户端模型的线程并不是你想要用来为你的网站提供服务的东西,当然如果你正在使用它,你不想创建额外的线程来直接响应任何 Web 请求。

为什么前端线程不是一个好主意?

您可能经常听到开发人员说前端的线程没有意义,但没有提供此类断言的基本原理。当您学会以所需的方式思考系统时,问题就会变得显而易见:

如果客户端脚本创建 8 个线程以直接响应 Web 请求,并且 100 个客户端同时请求该脚本,则您请求您的硬件同时执行 800 个线程。

CPU 的外观和工作方式确实非常不同,才能成为一个好主意

我们能做些什么?

企业解决方案很可能有一个面向公众的 PHP 网站,但系统的实际大脑是用对构建企业解决方案所需的那些东西有良好支持的语言编写的,例如 Java、C#、C++ 或任何语言- 当天是。

你应该以同样的方式使用pthreads;通过设计组件相互分离的系统,仅通过精心设计的高性能 (RPC) API 连接,这样设计多线程架构所固有的复杂性就完全与面向公众的网站隔离开来,简单的,此类网站需要的可扩展设置。

你现在可以识别危险代码了

让我们从 Hello World 开始:

<?php
class My extends Thread {
public function run() {
printf("Hello World\n");
}
}

/* create a new Thread */
$my = new My();

/* start the Thread */
$my->start();

/* do not allow PHP to manage the shutdown of your Threads */
/* if a variable goes out of scope in PHP it is destroyed */
/* joining explicitly ensures integrity of the data contained in an objects */
/* members while other contexts may be accessing them */
$my->join();
?>

无聊,但我希望你能读懂它;)

所以在一个真实的系统中,你真的不想如此明确地创建线程,你肯定只想将任务提交给一些执行服务,所有复杂的系统,就它们的多任务要求而言,我见过用这样的东西......

<?php
class My extends Threaded {
public function run() {
printf("Hello World from %s#%lu\n",
__CLASS__, Thread::getCurrentThreadId());
}
}

/* create a Pool of four threads */
/* threads in a pool are created when required */
$pool = new Pool(4);

/* submit a few tasks to the pool */
$tasks = 100;
while ($tasks--) {
$pool->submit(new My());
}

/* shutting down the pool is tantamount to joining all workers */
/* remember what I said about joining ? */
$pool->shutdown();
?>

对于复杂的事情,我已经给了你非常简短的解释,你应该努力阅读所有你能读的:

许多例子可以在这里找到:https://github.com/krakjoe/pthreads/tree/master/examples

免责声明:使用线程的服务器架构并没有什么错,但是当你开始创建额外的线程时,你就限制了它的可扩展性和按设计执行的能力,我可以想象设计良好的架构确实有前端线程的能力,但这不是一件容易的事情。此外,对于高性能 Web 目标应用程序,线程并不是工具箱中唯一的东西;研究所有选项。

关于php - PHP 中的多线程/多任务处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10714618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com