#php
#php
Вопрос:
Должен ли я использовать сериализацию php?
Существует ли ограничение на размер файла для сериализации? Файлы JPG могут занимать до 10 МБ.
Комментарии:
1. чтобы вы знали, PHP уже сериализует переменные сеанса. Но послушайте, что сказал Artefacto.
Ответ №1:
Я не думаю, что есть какие-либо ограничения, кроме памяти, доступной для PHP. Однако сохранение больших файлов в сеансе приведет к ненужным задержкам, поскольку объекты сеанса должны быть не сериализованы в начале или не сериализованы в конце каждого запроса (за исключением тех запросов, в которых вы не загружаете сеанс).
Вместо этого вы можете сохранить файлы во временном расположении и сохранить только имя файла в сеансе.
Ответ №2:
Вы можете хранить двоичные данные в переменной сеанса, поэтому ее вообще не нужно изменять. Файлы сеанса уже (более или менее) сериализованы.
В качестве альтернативы вы можете base64 кодировать данные изображения для хранения в данных сеанса.
Сказав это, это кажется плохой идеей — вы бы добавили намного больше нагрузки на сервер для кодирования / декодирования данных изображения при загрузке сеанса (даже больше, если бы вам также пришлось декодировать его в base64), и вы бы загрузили весь файл в память. Я бы сбросил изображение во временный файл и вместо этого сохранил путь к файлу в данных сеанса.
Ответ №3:
Пока вы не превысите memory_limit, у вас должно быть все в порядке с его сохранением.
Тем не менее, вот метод, который я использовал для $_FILES
входа в сеанс, предполагая:
$_SESSION['File']
где мы его храним$uploadFile
загружается ли изображение (например, ссылка на$_FILES
)- Вы уже установили сеанс
if ($uploadFile['error'] == UPLOAD_ERR_OK)
{
// try reading directly from temp directory
if (is_readable($uploadFile['tmp_name']))
{
$_SESSION['File'] = file_get_contents($uploadFile['tmp_name']);
}
// not readable as-is, make sure we can move it
else
{
$moveTo = 'uploads' . DIRECTORY_SEPARATOR . $uploadFile['name'];
if (is_writeable(dirname($moveTo)) amp;amp; move_uploaded_file($uploadFile['tmp_name'],$moveTo) !== false)
{
// read now that its been moved
$_SESSION['File'] = file_get_contents($moveTo);
// cleanup
@unlink($moveTo);
}
}
}
В противном случае, если все остальное не удается, его невозможно сохранить в сеансе
Ответ №4:
Сеансы PHP ограничены ограничением использования памяти PHP. Так что 10 мб, вероятно, будет в порядке, но…
Я не думаю, что «сеанс» является правильным выбором для хранения больших двоичных данных. Загруженные файлы отправляются во временную папку на сервере, и вы можете некоторое время получать к ним доступ из этого каталога. Итак, если вам нужно будет получить доступ к этому файлу позже, вы можете просто сохранить временный путь к файлу сеанса.
Пример кода:
session_start();
$_SESSION["uploaded_file"] = $_FILES["file"];
Затем, когда вам нужно скопировать этот файл в реальный путь, вы можете сделать что-то вроде:
move_uploaded_file($_SESSION["uploaded_file"]["tmp_name"], "images/".$_SESSION["uploaded_file"]["name"]);
Вы также можете получить доступ к элементам «тип», «размер» и «ошибка» из $ _SESSION[«uploaded_file»], если они вам нужны.
Комментарии:
1.
if you need to reach that file later, you can simply store the temporary file path to the session.
— тьфу, правда?2. -1 Это false. Временные файлы удаляются в конце запроса, поэтому вы не можете сохранить их путь в сеансе и переместить его позже.
3. вы правы, моя ошибка. я проделал аналогичную вещь в скрипте задания cron. конечно, сеанс php был непрерывным некоторое время. пожалуйста, измените принятый ответ. извините.