Задать вопрос

Как на PHP выполнить долгий скрипт?

Добрый день!

Стоит задача по выполнению долгого скрипта на php, который выполняется через консоль (cron).
При попытке выполнить скрипт php -f test/update.php

Пример скрипта:
// допустим $items имеет милион записей
ob_start();
$number = 0;
foreach($items as $key=>$item)
{
     // скрипт обновления данных 

     if($number>=1000){
          $number = 0;
          ob_flush();
	  flush();
     }

     $number ++;
} 
ob_end_clean();


Ошибка:
[root@allpbspb www]# php -f test/update.php
PHP Fatal error:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 1198085 bytes) in /home/bitrix/ext_www/website/www/test/update.php on line 168

Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 1198085 bytes) in /home/bitrix/ext_www/website/www/test/update.php on line 168

[root@allpbspb www]# php -f test/update.php
PHP Fatal error:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 82 bytes) in /home/bitrix/ext_www/website/www/bitrix/modules/main/classes/general/usertype.php on line 2797

Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 82 bytes) in /home/bitrix/ext_www/website/www/bitrix/modules/main/classes/general/usertype.php on line 2797
  • Вопрос задан
  • 2426 просмотров
Подписаться 1 Оценить 2 комментария
Решения вопроса 2
riky
@riky
Laravel
у вас проблема не со временем, а в том что память заканчивается, или memory limit поднимайте или оптимизируйте алгоритм.
очень подозрительный код, если это консоль, то зачем там ob_* функции и flush ?
данные не нужно накапливать в памяти сохраняйте обработанные данные сразу в базу или файлы
Ответ написан
@heahoh
Full stackoverflow developer
Как я понял у вас проблема не во времени выполнения скрипта, а в количестве памяти, которое ему требуется. Попробуйте увеличить memory_limit в php.ini или оптимизируйте скрипт, снизив количество данных, которое ему требуется хранить - запускать скрипт несколько раз с сохранением состояния, на котором он остановился (к примеру используя флаги в tmp файле)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Может вам стоит попробовать генераторы, если версия php позволит, тогда вопрос с памятью отпадет
Ответ написан
Комментировать
@McBernar
Через ob_start(); вы накапливаете результат в буфере. Очевидно, что вам нужно использовать просто какое-то внешнее хранилище — БД или банально файл.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы