【问题标题】:PHP-FPM and pthreadsPHP-FPM 和 pthreads
【发布时间】:2015-11-17 22:34:44
【问题描述】:

我正在使用 PHP-FPM 运行 Phalcon 应用程序,并且刚刚安装了 pthreads,因此我可以开始异步运行任务。我目前有 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 phalcon


    【解决方案1】:

    如果您使用的是旧版本的 PHP 和 pthreads (

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

    没有办法在应用程序的前端合理地使用线程。

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

    这种架构无法扩展。

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

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

    如果您错误地使用了“异步”这个词,并且实际上意味着并行,那么您将需要为那些需要与 Web 服务器扩展的应用程序部分以及那些需要并行并发相互通信。

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 1970-01-01
      • 2015-10-01
      • 2020-12-10
      • 1970-01-01
      • 2017-11-19
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多