База данных не имеет достаточно времени, чтобы сохранить запись

Я работаю над проектом на CakePHP 2.4.4. И я сталкиваюсь со следующей проблемой: мой класс загрузки поставщика вызывает одну функцию newImage который создает новое изображение. Когда я загружаю более одного изображения, например, пять раз, эта функция вызывается пять раз подряд. Эта функция содержит код вроде:

...
...initializing Uploader class
...
//creating image
$this->Orderimage->create();
$data = array(
'order_id' => $order_id,
'filename' => $filename,
'date' => date('Y-m-d'),
'extension' => $result['ext'],
);
$this->Orderimage->save($data);

Но здесь я встречаю свою проблему. Когда я пытаюсь загрузить более 4 изображений, это означает, что я вызываю эту функцию более 4 раз подряд, некоторые изображения не загружаются, и вместо них загружаются предыдущие изображения. Причина этого в том, что эти изображения получают одно и то же имя файла. Но имя файла задается последним созданным изображением + 1. Следовательно, ошибка заключается в том, что в базе данных не хватает времени для сохранения изображения при следующем поступлении. И это причина того, что одно изображение перезаписывает другое. Как я мог это исправить?

0

Решение

Попробуйте установить имя файла как нечто уникальное, а не просто используя +1,

Например:

$filename = CakeText::uuid() . '.jpg'; // or try String::uuid()

Таким образом, вам не нужно беспокоиться о случайном совпадении имени файла.

https://book.cakephp.org/2.0/en/core-utility-libraries/string.html#CakeText::uuid

Примечание: если вы загружаете много файлов в один каталог, рекомендуется поместить их во вложенные каталоги (обычно 3 глубины). Например что-то вроде:

$filename = rand(0,99) . DS . rand(0,99) . DS . rand(0,99) . $file;

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

ПРИМЕЧАНИЕ: я только что написал этот код в голове — я не проверял его на синтаксис … и т. Д., Но он должен дать вам идею.

1

Другие решения

Решение Daves должно решить вашу проблему, но если вы настаиваете на использовании соглашения об именах пользователей, получите последний вставленный идентификатор и создайте все изображения в цикле с $lastInsertedId + $counter спаси их. Запишите массив изображений отверстий впоследствии в вашу базу данных.

ПРИМЕЧАНИЕ: вы должны использовать это решение, только если у вас нет одновременных запросов на запись!

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector