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

Imd*_*dad 15 php optimization multiprocessing

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

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

我不是要求任何用户定义/开源排队方法,而是以这样的方式编写相同的代码,即它利用多核并且工作得更快.

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

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

Joe*_*ins 16

从2000年5月22日PHP4的第一个版本开始,PHP就有了很长时间的线程模型.

穿在前端

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

为什么前端的线程是个坏主意?

您可能经常听到开发人员说前端的线程没有意义,没有提供这种断言的理由.当您学会以所需方式思考系统时问题变得明显:

如果客户端脚本在直接响应Web请求时创建8个线程,并且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();
?>
Run Code Online (Sandbox Code Playgroud)

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

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

<?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();
?>
Run Code Online (Sandbox Code Playgroud)

我已经给你非常简短的解释复杂的事情,你应该尽力阅读:

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

免责声明:使用线程的服务器架构没有什么问题,但是当你开始创建额外的线程时,你限制了它的可扩展性和按设计执行的能力,我可以想象设计良好的架构,它具有线程化的能力在前端,但目标并不容易.此外,当涉及高性能Web目标应用程序时,线程并不是工具箱中唯一的东西; 研究你所有的选择.


Jon*_*oni 10

使用PHP的最常见方式是通过Apache等多进程Web服务器运行它.这意味着即使PHP本身不具备多核感知能力,操作系统也会尽力平衡可用CPU之间Web服务器进程所产生的负载.

如果你有一个独立的长期运行的PHP程序,你自己在一个进程中运行,你将不得不考虑线程或将程序分解到不同的进程,以便能够利用多个CPU.哪个更好/更容易取决于您的特定情况:将任务分解为多么容易,需要多少进程间/线程通信,需要多少同步等等.

虽然标准的PHP发行版本身似乎没有线程支持,但有一些扩展例如php-pthreads允许使用本机pthreadsAPI.

要将长时间运行的PHP程序划分为多个进程,可以使用pcntl库或proc_*函数系列.至于IPC ..这又取决于你的需求.

  • 所有体面的进程调度程序都试图等于核心之间的负载.你不需要做任何事情. (3认同)
  • @Imdad"嗯"?是的,PHP在轻负载下会比在重负载下表现更好......但是,这并不意味着它会在任意负载下"比其他语言表现更好".当然,"足够好"是"足够好",一些大型网站运行PHP ... (2认同)