受密码保护的相册PHP / MySQL服务器加载

时间:2016-09-08 03:57:53

标签: php mysql ajax server lamp

我正在创建一个网站,允许用户与缩略图共享可搜索的相册,这些缩略图将受密码保护。我的计划是验证密码并将PHP会话设置为相册的ID。然后,当用户加载相册时,服务器将提供所有图片参考ID的列表。使用ajax调用,客户端将使用GET请求(包括照片ID)请求满足请求条件的所有图片。然后使用PHP我将检查当前会话是否已获得该专辑的授权,然后对图片位置进行MySQL查询,然后返回图片。

现在您已经阅读了我的设计理念,我担心如果相册足够大,服务器加载会迅速增加,因为每个缩略图都需要单独的请求和MySQL查询。我还没有实施和测试,但想知道我是否应该重新开始我的设计。

有没有更好的方法来解决这个问题?

从简单的PHP脚本和MySQL查询加载会非常大吗?

1 个答案:

答案 0 :(得分:1)

没有理由为什么每个缩略图都需要单独的请求甚至是单独的查询。您可以在单个请求和单个查询中同时执行这两项操作。

想象一下,您的缩略图存储为数据库中的URL并与相册ID相关联。这意味着像这样的单个查询可以检索相册的所有缩略图。

SELECT
    thumbnails.url
FROM
    thumbnails
JOIN
    albums ON thumbnails.album_id = albums.id
WHERE
    thumbnails.album_id = 1

现在您可以简单地对这些结果进行分页以减少服务器负载。假设您希望每页最多加载50个缩略图。

SELECT
    thumbnails.url
FROM
    thumbnails
JOIN
    albums ON thumbnails.album_id = albums.id
WHERE
    thumbnails.album_id = 1
LIMIT
    0,50

然后,对于下一页,您可以LIMIT 50,50和下一页LIMIT 100,50等等。

您可以将缩略图结果列表作为JSON发送回AJAX响应中的客户端,客户端可以通过javascript将每个缩略图加载到页面上。

为什么你可能认为这不起作用

如果您认为需要对这些缩略图进行单独请求,因为您希望PHP验证用户是否有权查看相册,那么您很难一次解决两个问题。

将缩略图URL提供给客户端的问题是一步。通过检查用户的$_SESSION可以轻松完成,就像您计划进行的那样,并确保在您执行查询之前可以访问album_id并将它们发回JSON结果。

下一步是限制对相册及其缩略图图像的访问。不幸的是,您必须在HTTP / 1.1中对此进行单独请求。没有办法,这仍然不需要昂贵。

您只需使用PHP验证$_SESSION变量是否包含所需的album_id检查,并依赖您的网络服务器Sendfile capabilities来处理向客户端提供实际图像。< / p>

因此,PHP只处理验证用户是否有权查看图像的部分。您的网络服务器处理提供服务的部分。此请求中不执行任何数据库查询。所以它不是数据库负载问题。

在PHP中,使用Apache httpd(作为示例),这将是这样的。

if (isset($_SESSION['album_id']) && $_SESSION['album_id'] === $_GET['album_id']) {
    // User has access
    header("X-Sendfile: " . $pathToImageOnFileSystem);
    exit;
} else {
    // User is not authorized :/
    echo "Unauthorized access!";
}

这样做是将响应标头发送回您的网络服务器,让它知道“您需要将$pathToImageOnFileSystem中指定的文件提供给客户端”。将该标头发送回您的Web服务器后,PHP的角色结束。然后,网络服务器完成剩下的工作。所以PHP并没有被束缚。

棘手的部分是确保以将URL指向图像ID的方式定义Web服务器重写规则,您可以将其映射到文件系统上的文件。例如,您可以将图像存储在/home/myapp/images/{album_id}/{image_id}中,以便Web服务器读取像http://www.example.com/images/1/1这样的URL并发送到PHP,然后PHP可以确定$pathToImageOnFileSystem应该是/home/myapp/images/1/1 }。 PHP已经知道用户是否具有访问权限,方法是检查albumb_id是否在$_SESSION中,因为它将从先前的身份验证中存储它们。

当然,还要确保文件在您的网络服务器提供时发送回正确的mime类型和文件扩展名。因此,您可能希望将/home/myapp/images/{album_id}/{image_id}映射到/home/myapp/images/{album_id}/{image_id}.*或类似的内容。

相关问题