【问题标题】:pthreads with phalcon 3.3 - PHP Fatal errorpthreads with phalcon 3.3 - PHP致命错误
【发布时间】:2018-07-31 11:32:42
【问题描述】:

我是 Phalcon 和 Pthreads 的新手。

我的环境如下:

$ php -v PHP 7.2.2 (cli) (build: Feb 19 2018 10:04:19) (ZTS DEBUG) 版权所有 (c) 1997-2018 PHP 集团 Zend Engine v3.2.0,版权所有 (c) 1998-2018 Zend Technologies Zend OPcache v7.2.2,版权所有 (c) 1999-2018,由 Zend Technologies 提供

$ php -m | grep pthreads 线程

phpinfo() 说明如下:

PHP 版本 7.0.25-0ubuntu0.16.04.1

线程安全禁用

尽管使用 --enable-maintainer-zts \ --with-tsrm-pthreads 进行编译

我按照以下说明进行操作: https://blog.programster.org/ubuntu16-04-compile-php-7-2-with-pthreads

我在同一个文件夹中有两段代码:

class Task extends Threaded
{
    private $value;

    public function __construct(int $i){
        $this->value = $i;
    }

    public function run(){
        $s=0;

        $rand = rand(1, 100);
        $sleep = rand(1, 500);

        for ($i=0; $i<$rand; $i++){
            $s++;
            time_nanosleep (0, $sleep);
        }

        echo "Task: {$this->value}\n";
    }
}

# Create a pool of $n threads
$n = 16;
$pool = new Pool($n);

for ($i = 0; $i < 1000; ++$i){
    $pool->submit(new Task($i));
}

while ($pool->collect());

$pool->shutdown();

这段代码运行完美。

我的另一段代码是从 phalcon 实例化的。

<?php
class MultiapiPool
{
    private $providers;
    private $dependencies;
    private $input;

    public function __construct($p, $d, $i){
        $this->providers = $p;
        $this->dependencies = $d;
        $this->input = $i;
    }

    private function getProviders(){
        return $this->providers;
    }

    private function getDependencies(){
        return $this->dependencies;
    }

    private function getInput(){
        return $this->input;
    }

    public function run(){

        $providers = $this->getProviders();
        $pool = new Pool(count($providers));

        return array(
            'input' =>$this->getInput(),
            'dependencies'=>$this->getDependencies(),
            'providers'=>$providers);
    }
}

这个类抛出一个错误:

PHP 致命错误:未捕获的错误:在 /var/www/html/tutorial/app/libraries/MultiapiPool.php:29 中找不到类“Pool”

违规行是:$pool = new Pool(count($providers));

我的问题是:

  1. new Pool() 如何在一个文件中工作而不在另一个文件中工作? 工作文件中没有特殊的包含。

  2. 线程安全已禁用

尽管使用 --enable-maintainer-zts \ --with-tsrm-pthreads 进行编译

【问题讨论】:

    标签: php pthreads threadpool phalcon pool


    【解决方案1】:

    您的工作类正在扩展 Threaded:

    class Task extends Threaded

    您不起作用的类没有扩展 Threaded:

    class MultiapiPool

    尝试扩展 MultiapiPool 以使用 Threaded 并查看是否可以解决问题:

    class MultiapiPool extends Threaded

    【讨论】:

    • 按照您的建议:
    • 这意味着 pthreads 扩展没有加载。 extension_loaded("pthreads") 应该返回 true。 MultiapiPool 是如何被实例化的?在实例化对象之前检查 extension_loaded("pthreads") 是否返回 true。
    • 感谢您的建议。在我的简单测试脚本中,extension_loaded("pthreads") 返回 true,但是从 MultiapiPool 调用时,extension_loaded("pthreads") 返回 false。下面的代码位于 Phalcon 控制器中。 //extension_loaded("pthreads") 在这里返回 false $map = new MultiapiPool($providers, $dependencies, $input); $out = $map->run();
    • 我对 Phalcon 没有任何经验,所以我在这里不胜枚举,但你并不是唯一一个遇到这个问题的人:forum.phalconphp.com/discussion/17359/…
    • 深入挖掘后发现pthreads只能通过CLI调用。
    猜你喜欢
    • 2014-05-19
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    相关资源
    最近更新 更多