我应该使用php序列化吗?
是否有序列化文件大小的限制?jpg文件最大可达10mb
我认为除了PHP可用的内存之外没有任何限制。然而,在会话中存储大文件会导致不必要的延迟,因为会话对象必须在每个请求(除了那些不加载会话的请求)的开始和结束时进行反序列化。
您可以将文件保存在一个临时位置,并且在会话中只保存文件名。
您可以将二进制数据存储在会话变量中,因此根本不需要修改它。会话文件已经(或多或少)序列化了。
或者您可以对图像数据进行base64编码以存储在会话数据中。
话虽如此,这似乎是一个坏主意-你会添加更多的服务器负载编码/解码图像数据时,会话加载(甚至更多,如果你还必须base64解码它),你会加载整个文件到内存中。我会将图像转储到临时文件中,并将文件的路径存储在会话数据中。
只要不超过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)) && move_uploaded_file($uploadFile['tmp_name'],$moveTo) !== false)
{
// read now that its been moved
$_SESSION['File'] = file_get_contents($moveTo);
// cleanup
@unlink($moveTo);
}
}
}
否则,如果所有这些都失败,它将无法存储在会话
PHP会话受PHP内存使用限制。所以10mb可能就可以了,但是…
我不认为"session"是存储大量二进制数据的正确选择。上传的文件将进入服务器上的一个临时文件夹,您可以从该目录访问它们一段时间。因此,如果稍后需要访问该文件,可以简单地将临时文件路径存储到会话。
示例代码:
session_start();
$_SESSION["uploaded_file"] = $_FILES["file"];
然后,当您需要将该文件复制到实际路径时,可以这样做:
move_uploaded_file($_SESSION["uploaded_file"]["tmp_name"], "images/".$_SESSION["uploaded_file"]["name"]);
如果你需要,你也可以从$_SESSION["uploaded_file"]中找到"type", "size"answers"error"项