多线程/多任务的PHP(Multi Threading / Multi Tasking in PHP

2019-07-29 12:25发布

在PHP中我们平常编码不考虑什么服务器能。 现在,即使是一个天电脑有多个内核,还可以处理64个数据。 据我所知道的PHP引擎本身的优化,以多核的优势。 我们如何才能程序员可以进一步优化代码采取多核心的优势。

换句话说,我想知道,会教我写的代码,这将是更容易被PHP引擎被认为是平行处理技术。

我不要求任何用户定义/开源排队的方法,但写相同的代码,它采用多核心的优势,更快的工作这种方式。

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

我希望应该有我们可以进一步优化代码的方式。

Answer 1:

PHP已经有很长一段时间的线程模型,因为PHP4的第一个版本,2000年5月22日。

线程在前端

在Web应用程序没有任何意义的前端创建用户线程; 它是规模非常困难。 每个客户端模型线程Apache的工人MPM二进制和mod_php的聘请是不是真的要使用以满足您的网站,当然,如果你使用它的东西,你不希望创建任何Web请求直接回应额外的线程。

为什么在前端螺纹一个坏主意?

你可能经常听到开发商说,在前台线程没有意义,没有对这种论断提供了理由。 当你学会思考所要求的方式系统的问题变得很明显:

如果客户端脚本会在直接回应8个线程的web请求,100个客户端同时请求脚本,您请求您的硬件上执行800个线程并发。

CPU的将不得不外观和工作方式非常与众不同的确做出一个好主意

我们对于它可以做些什么呢 ?

企业解决方案很可能有一个PHP的网站面向公众,但对那些东西很好的支持系统都写在语言的实际脑子,你需要建立企业解决方案,如Java,C#,C ++或任何语言OF-当日是。

你应该用同样的方式并行线程; 通过设计其部件从彼此分离系统中,仅通过精心设计的,高性能(RPC)API的连接,使得在设计多线程架构的固有复杂度从您的面向公众的网站的完全隔离,且简单,可扩展的设置,这样的网站需要。

U可以现在HAZ码

让我们先从用的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://gist.github.com/krakjoe/6437782
  • https://gist.github.com/krakjoe/9384409
  • http://php.net/pthreads

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

免责声明:有没有什么错与使用线程的服务器体系结构的,但你开始创建额外的线程的那一刻,你限制它的可扩展性和执行,因为它的设计,我可以想像,精心设计的架构,确实有线程的能力,能力在前端,但它不是瞄准一件容易的事情。 另外,线程是不是在工具箱中的唯一的事情,当涉及到高性能的网络目标应用; 研究所有选项。



Answer 2:

使用PHP的最常见的方式是使其通过多进程的Web服务器,如Apache。 这意味着,即使PHP本身是不支持多核心意识到,操作系统将尽最大努力,以平衡由可用的CPU之间的Web服务器进程产生的负载。

如果您有关于自己的一个进程中运行一个独立的长期运行PHP程序,你必须寻找到任何线程或打破程序到不同的流程,能够利用多个CPU的优势。 哪个更好/更容易要看您的具体情况:它是多么容易打破你的任务成片,需要多少间进程/线程通信,你有多少同步的需要,等等。

虽然标准的PHP发行本身似乎并不具有线程支持,有扩展如PHP-并行线程 ,使本机的使用pthreads API。

对于将长期运行PHP程序分成几个工序就可以使用pcntl库或proc_*功能的家庭。 至于IPC ..再次,它取决于你的需求。



Answer 3:

还有的解释已经提供这样直接将代码。 所有你问可使用线程来实现。

require_once( 'Thread.php' );

// test to see if threading is available
if( ! Thread::available() ) 
{
   die( 'Threads not supported' );
}

// function to be ran on separate threads
function paralel( $_limit, $_name ) 
{
    for ( $index = 0; $index < $_limit; $index++ ) 
    {
        echo 'Now running thread ' . $_name . PHP_EOL;
        sleep( 1 );
    }
}

// create 2 thread objects
$t1 = new Thread( 'paralel' );
$t2 = new Thread( 'paralel' );

// start them
$t1->start( 10, 't1' );
$t2->start( 10, 't2' );

// keep the program running until the threads finish
while( $t1->isAlive() && $t2->isAlive() ) 
{
}

记住PHP本身不支持多线程。 更详细的信息可以在这里找到http://blog.motane.lu/2009/01/02/multithreading-in-php/

您也可以按照这个答案,这也解释了一个好一点时,它是关于PHP和线程与代码示例为好。

我个人不会用PHP线程去,因为线程大多被分裂成不同的线程来加快进程,如果你的网站获得高流量那么操作系统将自身管理流程到CPU的不同内核。 所以,我不认为你应该担心PHP线程,可这是PHP小组不关注它(这只是我的想法)的原因。



Answer 4:

PHP是不是真正设计时考虑多线程(它是围绕一个短寿命的请求/响应模型构建的)。 有一对夫妇的选择,虽然。

PCNTL extenstion:产卵和管理子进程。 这不是多线程,因为每个子进程是一个新的PHP实例。 因此,它是相当耗费资源。 在Windows中不可用。

并行线程扩展:允许在PHP脚本中产卵和线程管理。 这是(据我可以从文档告诉)可在Windows和线程应该至少在理论上是一个有点比产卵过程更加轻便,但也有一个可怕的很多需要注意的地方使用它。 例如,你的PHP必须被编译为线程安全的,这可能对不带螺纹的代码性能产生不利影响,并能防止使用不支持线程安全扩展。

ReactPHP:PHP代码库,其提供的东西,如一个事件循环和非阻塞IO。 它不严格地说支持线程(虽然我知道有工作正在进行中,为他们提供),但它确实提供了很多有用的功能,应该需要线程那么迫切。 https://github.com/reactphp/react/wiki/FAQ包括线程支持状态的讨论。



文章来源: Multi Threading / Multi Tasking in PHP