2016-12-16 92 views
1

我試圖讓Pthreads工作,但不幸的是,所有過時的文檔都很難弄清楚什麼是當前和發生了什麼變化。以及沒有得到任何錯誤返回。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文件? – Robbie

回答

3

我得到兩個錯誤在你的代碼,無論是在

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

首先,它應該在$this->i(簡單的拼寫錯誤)

二是setGarbage找不到,因爲它是的Collectablehttp://php.net/manual/en/collectable.setgarbage.php屬性 - 注意:手冊記錄了舊的PHP 5/API版本2類,這已更改爲PHP 7/API版本3的接口)。因此,您需要

class UptimeWork extends Threaded Implements Collectable { 

可以訪問setGarbage()。由於Collectable是一個接口,您還需要編寫接口方法。

這是你的工作代碼:

$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是擴展Threaded類的接口,不是接口 – bwoebi

+1

這是針對PHP 5.6,API版本2的,如PHP手冊中所述。這個問題是關於PHP 7,API版本3.檢查https://github.com/krakjoe/pthreads/blob/master/examples/stub.php以及github存儲庫中的自述文件。 – Robbie

+0

哦,我確實看過手冊,對不起,然後有我的upvote ;-) – bwoebi

0

就打算在這裏添加另注:

原來,與blackfire模塊啓用它只是「掛」同樣沒有返回任何錯誤,而禁用黑火模塊實際上會像預期的那樣返回輸出/錯誤。

因此對於遇到同樣奇怪問題的人,如果安裝了黑火模塊,則將其禁用