#php #yield #amphp
Вопрос:
Извините, ребята, но я как бы схожу с ума сейчас, проводя Часы и просто не могу понять, что не так.
Итак, у меня есть класс загрузки, который должен разделять загрузку по частям, а затем запрашивать каждый фрагмент в виде отдельного запроса.Все в порядке, где я вроде как ничего не добиваюсь, это мои обещания, мой доход никогда ничего не возвращает, но и не выдает никаких ошибок.
Что он должен сделать, так это пройти через разбитый массив блоков, затем выполнить обещания для активных блоков, дождаться завершения, а затем продолжить.
Это мой тест в базе кода:
/** * Start Download * * @return void */ private function download() { $app = $this-gt;app; $_this = $this; $chunks = array(); for ($i=0; $i lt; $this-gt;chunkCount 20; $i ) { $start = $i * $this-gt;chunkSize; $end = ($i 1)*$this-gt;chunkSize; if($i == $this-gt;chunkCount-1) { $end = $this-gt;size; } $chunks[] = (object) ['id' =gt; ($i 1), 'start'=gt;$start , 'end'=gt;$end, $path = $this-gt;path."/".$i]; } $chunkedChunks = array_chunk($chunks, $this-gt;connections); foreach($chunkedChunks as $key =gt; $chunkedChunk) { $urls = [ 'https://secure.php.net', 'https://amphp.org', 'https://github.com', ]; $promises = []; foreach ($urls as $url) { $promises[$url] = Ampcall(function() use ($url) { $deferred = new AmpDeferred(); AmpLoop::delay(3 * 1000, function () use ($url, $deferred) { $deferred-gt;resolve($url); }); return $deferred-gt;promise(); }); } $responses = yield AmpPromiseall($promises); foreach ($responses as $url =gt; $response) { printf("Read %d bytes from %sn", strlen($response), $url); } } }
Я попробовал по крайней мере 20 вариантов, и это просто не сработает, весь код выполняется в цикле::run
Я знаю, как решить эту проблему по-другому, вручную назначая задачи с помощью цикла::повтор, но на самом деле это не лучший способ.
Я был бы благодарен за помощь, возможно, я просто теряю представление о том, что происходит, или что-то неправильно понимаю.
Ответ №1:
Обертывание каждого блока в отдельный asyncCall в конце концов решило эту проблему.