Я недавно перекомпилировал свой сервер, чтобы я мог использовать многопоточность в PHP (используя pThreads). Я уже получил работу с pthreads и использовал их в других сценариях, однако заставить их работать в пуле становится более сложной задачей, чем я думал.
В настоящее время у меня есть это доказательство концепции сценария:
$tArray = array();
class APIWork extends Collectable {
protected $complete;
public $status;
public $file;
public $url;
public function __construct($pFile, $pUrl){
//transfer all the variables to local variables
$this->complete = false;
$this->status = 'never ran';
$this->file = $pFile;
$this->url = $pUrl;
}
public function run(){
$this->status = 'started';
usleep(3000);
$this->status = 'completed';
$this->complete = true;
}
public function isGarbage() {
return $this->complete;
}
}
$pool = new Pool(3);
$counter = 0;
$filename = 'testfile';
$url = 'asdf';
for($i=0;$i<5;$i++) {
$tArray[$counter] = new Threaded();
$pool->submit(new APIWork($filename, $url));
$counter++;
}
$retArr = array();
$pool->collect(function(APIWork $task){
global $retArr;
//$task->join();
$tmpObj = new stdclass();
$tmpObj->filePath = $task->file;
$tmpObj->url = $task->url;
$tmpObj->status = $task->status;
$tmpObj->complete = $task->complete;
array_push($retArr, $tmpObj);
return $task->isGarbage();
});
$pool->shutdown();
echo '<pre>';
print_r($retArr); //return the array of results
echo '</pre>';
То, что я получаю, выглядит примерно так:
Array
(
[0] => stdClass Object
(
[filePath] => testfile
[url] => asdf
[status] => completed
[complete] => 1
)
[1] => stdClass Object
(
[filePath] => testfile
[url] => asdf
[status] => started
[complete] =>
)
[2] => stdClass Object
(
[filePath] => testfile
[url] => asdf
[status] => started
[complete] =>
)
[3] => stdClass Object
(
[filePath] => testfile
[url] => asdf
[status] => started
[complete] =>
)
[4] => stdClass Object
(
[filePath] => testfile
[url] => asdf
[status] => never ran
[complete] =>
)
)
Похоже, что хотя я убедился, чтобы запустить $pool->shutdown();
команда, pthreads не разрешается завершить. Может кто-нибудь, пожалуйста, помогите мне понять, как сделать так, чтобы пул потоков позволял завершать потоки.
Примечание: я использую PHP 5.6.18 с Pthreads 2.0.10 на веб-сервере Ubuntu, если это поможет.
Кроме того, я попытался смоделировать свой код после следующего, так как я считаю, что этот парень — главный авторитет в pThreads, но я добавил и удалил, чтобы передавать данные туда, где мне было нужно:
pThreads Pool пример от krakjoe
Задача ещё не решена.
Других решений пока нет …