繁体   English   中英

PHP-FPM和pthreads

[英]PHP-FPM and pthreads

我使用PHP-FPM运行Phalcon应用程序并刚刚安装了pthread,因此我可以异步开始运行任务。 我目前使用命令行界面使用pthreads:

<?php

/**
 * Author: Abu Ashraf Masnun
 * URL: http://masnun.me
 */

class WorkerThreads extends Thread
{
    private $workerId;

    public function __construct($id)
    {
        $this->workerId = $id;
    }

    public function run()
    {
        usleep(2000000); // 2 seconds
        echo "Worker {$this->workerId} ran" . PHP_EOL;
    }
}

// Worker pool
$workers = [];

// Initialize and start the threads
foreach (range(0, 5) as $i) {
    $workers[$i] = new WorkerThreads($i);
    $workers[$i]->start();
}

// Let the threads come back
foreach (range(0, 5) as $i) {
    $workers[$i]->join();
}

die('finished');

^^所有这些都可以从shell运行php test.php

但我无法让这个例子使用快速流程管理器。 我有一个控制器初始化一个线程对象并调用start() ,但run()方法中没有任何逻辑按原样执行。

控制器:

<?php

public function indexAction()
{

$threads=[];
for ( $i = 0; $i < 2; $i++ )
{
    $threads[$i] = new AsyncThread();
    $a = $threads[$i]->start();
    $b = $threads[$i]->isStarted();
    Phalcon\DI::getDefault()->get('logger')->log(json_encode($a));
    Phalcon\DI::getDefault()->get('logger')->log(json_encode($b));
}
for ( $i = 0; $i < 2; $i++ )
{
    $threads[$i]->join();
}
die('done');

AsyncThread.php:

<?php

class AsyncThread extends Thread
{

    public function __construct()
    {
        Phalcon\DI::getDefault()->get('logger')->log( 'construct' );
    }

    public function run()
    {
        usleep(2000000); // 2 seconds
        Phalcon\DI::getDefault()->get('logger')->log( 'running' );
    }

}

当这运行我的日志显示:

[Tue, 17 Nov 15 22:10:43 +0000][INFO][][] construct
[Tue, 17 Nov 15 22:10:43 +0000][INFO][][] true
[Tue, 17 Nov 15 22:10:43 +0000][INFO][][] true
[Tue, 17 Nov 15 22:10:43 +0000][INFO][][] construct
[Tue, 17 Nov 15 22:10:43 +0000][INFO][][] true
[Tue, 17 Nov 15 22:10:43 +0000][INFO][][] true

我期望异步地看到“运行”日志,但它根本不会记录。

我的目标是获得一个使用PHP-FPM的posix线程的hello world示例,这样我就可以开始为我的需求构建一个经过深思熟虑的解决方案。

如果您使用旧版本的PHP和pthreads(<PHP7),那么线程将在没有正确设置stdout的情况下运行(因为FPM和Zend无法设置它)。

最新版本的pthreads(用于PHP7)禁止在CLI以外的任何地方执行。

在您的应用程序的前端没有办法明智地使用线程。

考虑一个控制器创建一个合理数量的线程的情况,假设是8.如果100个客户端同时请求控制器,您将要求您的硬件同时执行800内核线程,并且流量很小

这种架构无法扩展。

你一直使用异步这个词取代并行,这让我觉得你可能根本就不想要线程。

如果手头的任务是发出一些异步Web请求,那么最好的方法是使用非阻塞I / O, 而不是线程

如果你正确地使用了异步这个词,并且实际上意味着并行,那么你将需要为应用程序的那些部分找到另一种方法,这些部分需要与Web服务器一起扩展,以及需要并行并发的那些应用程序部分。彼此沟通。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM