Использование 2-х header

Pegiy

Guest
Использование 2-х header

Есть такая задача: 1-й массив shops и 2-й массив cats
необходимо над всеми сочетаниями произвести ряд определенных действий. Т.е. всего таких действий count($shops) * count($cat)
Решается все двумя вложенными циклами.
Но из-за того что действия могут быть достаточно продолжительными (в сумме до 10 минут), чтобы не устанавливать set_time_limit, я пошел по такой схеме:
PHP:
if ($current_shop<count($shops))
 {
 foreach ($cats as $i => $current_cats)
   {
   выполняем действия над всеми cats
   }
  header (этот же скрипт с $current_shop+1)
 }
Все работало пока обработка массива cats тоже не перестала укладываться в 30 сек.
Тогда я сделал 2 header - сначала скрипт вызывается со следующим значением $current_cat, затем header c новым $current_shop.
Не работает, причем такое ощущение, что просто игнорируется 1-й header, хотя очередь до него доходит
Два вопроса:
1. Почему игнорируется header
2. Есть ли вообще другие способы решения проблемы

P.S. При необходимости могу привести кусок кода
Спасибо
 

Кром

Новичок
>При необходимости могу привести кусок кода

Приведи. Я думаю это будет ОЧЕНЬ интересно.
 

Pegiy

Guest
PHP:
if ($current_shop<=$count_shop)
  {
  if ($current_cat<=$count_cat)
	{
	$pl = new PRICELIST($set_shop[$current_shop],  $set_cat[$current_cat]);
    switch ($choice) 
      {
      case "download":
      $pl->download();
      break;	
      }
    $current_cat++;		
    header ("Location: $PHP_SELF?current_shop=$current_shop&count_shop=$count_shop&current_cat=$current_cat&count_cat=$count_cat&choice=$choice"); 
    }
  $current_cat = 1;	
  $current_shop++; 	  
  header ("Location: $PHP_SELF?current_shop=$current_shop&count_shop=$count_shop&current_cat=$current_cat&count_cat=$count_cat&choice=$choice"); 
  }
 

Linker

Guest
Pegiy:

А может сделать два файла (разбить этот один скрипт на два аналогичных)?

Примерно что-то типа:

получили массив, прошли в цикле (может даже и не раз)
$current_shop++; // в цикле опять же
Header("Location: второй_файл_скрипта.php?".$current_shop);
exit;

Во втором файле проверка if (массив ещё не закончился)
{ следующие 1 или 10 итераций; $current_shop++; }
Header("Location: первый_файл_скрипта.php?".$current_shop);
exit;
 

Pegiy

Guest
Да, можно-то и еще проще - сначала сделать массив - все пары значений:
$set[$i]['shop']
$set[$i]['cat']
ну а потом уже гонять его одним header
Но все это как-то не спортивно...
 

Linker

Guest
Тогда ещё вариант - запустить процесс в дополнительном скрипте через exec();
да и foreach бы заменить на for, желательно бы как-нибудь.

А самое главное, все "долгоиграющие" процессы (имхо, конечно) желательно разбивать на этапы и создавать, например, файл очереди, этап выполнен - удаляется текущая очередь - добавляется следующая, не выполнен - сообщение об ошибке и либо заново, либо переход к следующей очереди и т.д.
 

nagash

Guest
поставить set_time_limit и не придумывать себе проблем...
зачем самому себе проблемы создавать и высасывать проблему из пальца...
 

Linker

Guest
nagash:

Одно дело если выбран неверный подход и скрипт выполняет лишнюю работу, (ну или php - не совсем по назначению используется), а другое дело если действительно длительный процесс и никак этого не избежать, такое иногда ведь бывает?

Если это первый случай - то всё понятно, а если второй, то никакие set_time_limit не спасут (есть ещё timeout у сервера) да и не каждый хостер позволит лимиты превышать.
 
Сверху