2010-09-22 4 views
1

У меня есть сценарий, который будет запускаться через CRON каждую ночь и будет принимать записи в одной базе данных и обрабатывать их. Мне любопытно, какие методы лучше всего использовать, чтобы я не использовал слишком много памяти/ошибок или потенциально мог запастись сервером. Там может быть где угодно до 6000 записей, которые необходимо обработать ...Каковы наилучшие способы управления памятью на большой петле PHP?

Мне любопытно, какие методы следует использовать для смягчения нагрузки. Я уверен, что только увеличение предела памяти может вызвать другие проблемы один раз он проходит определенную точку. Спасибо.

+0

http://www.php.net/manual/en/features.gc.refcounting-basics.php http://www.php.net/manual/en/features.gc.collecting-cycles.php http : //www.php.net/manual/en/features.gc.performance-considerations.php – teemitzitrone

+0

Должен добавить, что я использую Doctrine ORM, который, как я знаю, использует PDO, просто нужно найти, как его использовать. – gokujou

ответ

4

Используйте курсор базы данных, и вам не нужно загружать все в память.

Предполагая, что вы используете PDO, просто сделайте PDOStatement->fetch() для каждого элемента набора результатов.

4

Я согласен с @Skilldrick, убедитесь, что вы обрабатываете запрос к базе данных, выводит по одной строке за раз. Например, если вы используете MySQL:

  • внутр/MySQL: использование mysql_unbuffered_query()
  • внутр/MySQLi: используйте mysqli_use_result()
  • внутр/Pdo_Mysql: установить атрибут PDO::MYSQL_ATTR_USE_BUFFERED_QUERY в false. См. example.

Для получения дополнительной информации см. Документацию.

В Доктрине 1.2 с PDO, вы можете сделать это:

$masterConn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); 

Обратите внимание, что PHP не имеет предела памяти при вызове ее с помощью командной строки или хрон. Извинения, это неправильно, PHP действительно уважает ограничение памяти - я ошибочно думал о максимальном времени ввода, которое по умолчанию для CLI составляет false.

+0

Билл, memory_limit, безусловно, соблюдается при вызове через командную строку. – webbiedave

+0

@webbiedave, спасибо, я отредактировал выше. –

0

Если вы выберете элемент за элемент, обработайте его, сохраните и удалите переменные и получите другую часть данных, он не будет использовать много памяти.

Проблема может быть, если вы извлекаете все данные и обрабатываете их.

0

Вы можете подсчитать и пометить каждую обработанную строку, чтобы вы могли настроить свой cron каждые 10 минут, например, и каждый раз, когда вы запускаете код, вы можете обрабатывать определенное количество строк. При этом вы никогда не превысите время или ограничение памяти.

Вы можете сначала протестировать, чтобы знать максимальные строки, принятые вашим сервером, без проблем для каждого вызова сценария, а затем установить его.

Смежные вопросы