2016-12-16 12 views
1

私はPthreadsを動作させようとしていますが、残念なことに古いものはすべて現在のものと変更されたものを理解するのが難しいです。エラーが返されないだけでなく、pthreadsがプールにぶら下がっています - > submit

のpthreadsの最新バージョンでPHP7.2.0-devの実行とXdebugを

現在、私は

<?php 

$THREADS = 3; 

class UptimeWorker extends Worker { 
    public function start(?int $options = null) { 
     return parent::start(PTHREADS_INHERIT_CLASSES | PTHREADS_INHERIT_CONSTANTS | PTHREADS_INHERIT_FUNCTIONS); 
    } 
} 

class UptimeWork extends Threaded { 

    private $i; 

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

    public function run() { 
     echo "I am ".$i.PHP_EOL; 
     $this->setGarbage(); 
    } 

} 

$pool = new Pool($THREADS, UptimeWorker::class); 

for($i=0;$i<10;$i++) { 
    var_dump($i); 
    $pool->submit(new UptimeWork($i)); 
} 

echo "pre-shutdown".PHP_EOL; 

$pool->shutdown(); 

echo "finished".PHP_EOL; 

を持っており、出力のみがそこから、for声明の中で最初var_dump呼び出しからint(0)ですプロセスはハングアップしているように見え、終了せず、それ以上の出力は行われません。

ここで何がうまくいかず、これが機能するには何が起こる必要がありますか?

+0

他にもいくつかの質問がありますので、邪魔になるかもしれません。あなたはphp7(no-dev)上でコードを試しましたか?xDebugなしで試してみましたか?自分でライブラリを構築したのか、Windows用にダウンロードしたのですか(Windows用の7.2バージョンはありません)。そして、error.logファイルを含む「no errors」と言ったら? – Robbie

答えて

3

私は両方それが$this->i(シンプルタイプミス)

セカンドをすべき初

public function run() { 
    echo "I am ".$i.PHP_EOL; 
    $this->setGarbage(); 
} 
で、あなたのコード内の2つのエラーを取得するには、それが Collectablehttp://php.net/manual/en/collectable.setgarbage.phpの財産だとして setGarbageが発見されていないということです - 注意:このマニュアルでは、古いPHP 5/APIバージョン2のクラスについて説明しています。これはPHP 7/APIバージョン3のインターフェイスに変更されています)。したがって、あなたは setGarbage()へのアクセスを得るために

class UptimeWork extends Threaded Implements Collectable { 

を必要としています。 Collectableはインターフェイスなので、インターフェイスメソッドも記述する必要があります。ここで

は、作業コードです:

blackfireモジュールを有効にしてそれだけで再び「ハング」ということが判明したすべてのエラーを返さずに:ちょうどここに別のノートを追加しようとして

$THREADS = 3; 

class UptimeWorker extends Worker { 
    public function start(?int $options = null) { 
     return parent::start(PTHREADS_INHERIT_CLASSES | PTHREADS_INHERIT_CONSTANTS | PTHREADS_INHERIT_FUNCTIONS); 
    } 
} 


class UptimeWork extends Threaded Implements Collectable { 

    private $i; 
    private $isGarbage = false; 

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

    public function run() { 
     echo "I am ".$this->i.PHP_EOL; 
     $this->setGarbage(); 
    } 

    public function setGarbage() { 
     echo "Setting garbage ".$this->i.PHP_EOL; 
     $this->isGarbage = true; 
    } 

    public function isGarbage() : bool { 
     return $this->isGarbage; 
    } 

} 

$pool = new Pool($THREADS, UptimeWorker::class); 

for($i=0;$i<10;$i++) { 
    var_dump($i); 
    $pool->submit(new UptimeWork($i)); 
} 

echo "pre-shutdown".PHP_EOL; 

$pool->shutdown(); 

echo "finished".PHP_EOL; 
+0

Collectableは、インタフェースではなくスレッド化されたクラスを継承するクラスです – bwoebi

+1

これは、PHPマニュアルに書かれているように、PHP 5.6、APIバージョン2用です。この質問はPHP 7のAPIバージョン3です。https://github.com/krakjoe/pthreads/blob/master/examples/stub.phpとgithubリポジトリのreadmeを確認してください。 – Robbie

+0

ああ、実際にマニュアルを見て、残念ながら、代わりに私のupvoteを持って;-) – bwoebi

0

ブラックファイアモジュールを無効にすると、実際には期待通りに出力/エラーが返されます。

同じ奇妙な問題を抱えている人は、ブラックファイアモジュールをインストールしている場合は、を無効にしてを無効にしてください。

関連する問題