Jump to content
  • 0

обработать элементы в цикле по 5 итераций


rediskavet
 Share

Question

неправильно назвал тему. Должно быть "Обработать 5 элементов за одну итерацию цикла"

В API яндекс директ есть метод "CreateNewReport". Он создает на серверах яндекса статистические отчеты по рекламным компаниям. Одновременно можно хранить до 5 отчетов. Я за один раз собираю отчеты для 50 и больше компаний.

С горем пополам написал скрипт, который умеет:

  1. создавать отчет, занимает примерно 30 секунд
  2. проверять что отчет готов, если готов то переходим к след.пункту если нет то через пол минуты снова проверяем.
  3. скачивать отчет
  4. удалять уже скачанный отчет с сервера яндекса(одновременно яндекс хранит только 5 отчетов).
  5. переходит к следующей компаний в все по новой с первого пункта

Создать и скачать самые базовые отчеты(статистика за один день), занимает около 30 минут. А если нужно будет за пару лет прошедших, то это на пару дней нужно будет скрипт запускать.

Сейчас код цикла выглядит примерно так:


for($i = 0; $i<(массив id компний);$i++){
$idReport = создать_отчет(массив id компний[$i]);
$checkReport = проверить_что_отчет_готов($idreport);
if(!$checkReport)
$checkReport = проверить_что_отчет_готов($idreport);
$saveReport = сохранить_отчет_в_файл($checkReport);
$remove = удалить_отчет($checkReport);
}

Теперь сам вопрос, как мне данный цикл можно переписать? Так чтобы в одной итерации он все действия делал для пяти отчетов одновременно и только после того как все пять сохранены, переходил к следующим пяти.

Edited by rediskavet
Link to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 0

а можно пример? я не совсем программист.

Ну и еще как мне сам цикл for переписать чтобы он по пять элементов обрабатывал, а после переходил к следующим пяти.

в php нет многопоточности в чистом виде. Если вы не программист вы ничего сделать не сможете. Бессмысленно переписывать ваш цикл чтобы запустить обработку 5 задач одновременно, php не начнет обрабатывать следующий виток цикла пока не обработает предыдущий.

Можете почитать про эмуляцию многопоточности к примеру тут http://raven.esiteq.com/2011/04/php-multithreading/ либо поискать примеры эмуляции и решения в сети сами.

Link to comment
Share on other sites

  • 0
Бессмысленно переписывать ваш цикл чтобы запустить обработку 5 задач одновременно, php не начнет обрабатывать следующий виток цикла пока не обработает предыдущий.

Мне и не надо обрабатывать следующий виток цикла, мне нужно в одном витке обрабатывать по 5 элементов одновременно. Это что не реальное требование к PHP? Мне в это не верится, выглядит вполне себе элементарной задачей, я же не один такой кому это надо, наверное есть какие то решения просто нужно искать.

Link to comment
Share on other sites

  • 0
Бессмысленно переписывать ваш цикл чтобы запустить обработку 5 задач одновременно, php не начнет обрабатывать следующий виток цикла пока не обработает предыдущий.

Мне и не надо обрабатывать следующий виток цикла, мне нужно в одном витке обрабатывать по 5 элементов одновременно. Это что не реальное требование к PHP? Мне в это не верится, выглядит вполне себе элементарной задачей, я же не один такой кому это надо, наверное есть какие то решения просто нужно искать.

5 элементов одновременно это и есть многопоточность, её в php нет.Пока не кончится оработка одной операции следующая не начнется.

Если вы не понимаете о чем я говорю я обьясню, предположим у вас есть цикл в котором последовательно вызываются 5 функций:


for(.......){
func1();
func2();
func3();
func4();
func5();
}

Ну так вот, пока не отработает func1() следующие функции не будут запущены. Пока не отработают все 5 функций не начнется следующий виток цикла. Так понятнее?

ЗЫ а про решения я уже вам дал ссылку на один из примеров, как можно организовать эмуляцию многопоточного выполнения задач в php.

ЗЫЗЫ хотите многопоточности посмотрите в сторону Perl или Puthon, там она есть.

Edited by wwt
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy