- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个网站,允许用户共享带有缩略图的可搜索相册,这些相册将受密码保护。我的计划是验证密码并将 PHP session 设置为等于相册的 ID。然后当用户加载相册时,服务器将提供所有图片引用 ID 的列表。然后,使用 ajax 调用,客户端将通过 GET 请求(包括照片 ID)请求所有符合请求条件的图片。然后我将使用 PHP 检查当前 session 是否已获得该相册的授权,然后对图片位置进行 MySQL 查询,然后返回图片。
既然您已经阅读了我的设计思路,我担心如果相册足够大,服务器负载会迅速增加,因为每个缩略图都需要单独的请求和 MySQL 查询。我还没有实现和测试,但想知道我是否应该重新开始我的设计。
有没有更好的方法来解决这个问题?
一个简单的 PHP 脚本和 MySQL 查询的负载是否会很大?
最佳答案
没有理由要求每个单独的缩略图都需要单独的请求甚至单独的查询。您可以在单个请求和单个查询中同时执行这两项操作。
假设您的缩略图作为 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
等等。
您可以在 AJAX 响应中将缩略图结果列表作为 JSON 发送回客户端,客户端可以通过 javascript 将每个缩略图加载到页面上。
如果您的想法是您需要对这些缩略图进行单独请求,因为您希望 PHP 验证用户是否有权查看相册,那么您就太过努力地同时解决两个问题了。
将缩略图 URL 获取到客户端的问题是第一步。这很容易通过检查用户的 $_SESSION
来实现,就像您计划做的那样,并确保在您进行查询之前他们可以访问 album_id
并将他们发回JSON 结果。
下一步是限制对相册及其缩略图的访问。不幸的是,您必须在 HTTP/1.1 中为此单独请求。没有办法解决这个问题,但是这仍然不需要很昂贵。
您只需使用 PHP 来验证 $_SESSION
变量是否包含所需的 album_id
检查并依赖您的网络服务器的 Sendfile capabilities处理向客户提供实际图像。
因此 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!";
}
这样做是将响应 header 发送回您的网络服务器,让它知道“您需要将 $pathToImageOnFileSystem
中指定的文件提供给客户端”。在将该 header 发送回您的 Web 服务器后,PHP 的角色结束。网络服务器然后完成其余的工作。所以 PHP 没有被束缚。
棘手的部分是确保以一种将 URL 指向图像 ID 的方式定义网络服务器重写规则,您可以在其中将其映射到文件系统上的文件。例如,您可以将图像存储在 /home/myapp/images/{album_id}/{image_id}
中,以便像 http://www.example.com/images/1/1 这样的 URL由您的 Web 服务器读取并发送到 PHP,然后 PHP 可以确定 $pathToImageOnFileSystem
应该是 /home/myapp/images/1/1
。 PHP 通过检查 $_SESSION
中的 albumb_id 已经知道用户是否具有访问权限,因为它会在之前的身份验证中存储。
当然,还需要确保文件在由您的网络服务器提供时发回正确的 MIME 类型和文件扩展名。因此,您可能希望将 /home/myapp/images/{album_id}/{image_id}
映射到 /home/myapp/images/{album_id}/{image_id}.*
或类似的内容。
关于php - 受密码保护的相册 PHP/MySQL 服务器负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39382367/
在 Web 应用程序架构设计期间,我必须从概念上计算我的服务器之一可以服务多少个当前客户端。然后我可以预算它。 那么,有什么公式可以遵循吗?或者,你如何计算这个?或者,通常,一个 httpd/tomc
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是
我正在使用 Angular 5,我正在尝试在加载 div 的背景图像时获取加载图标。 如果它是一个普通的 img,我对此没有问题,但如果我尝试将它作为背景,它就不起作用。 这里是一些示例代码 app.
我们怎么知道我们的程序在 CPU 上有多少负载? 我尝试使用 htop 找到它。但是 htop 不会给 cpu 负载。它实际上给出了我程序的 cpu 利用率(使用 pid)。 我正在使用 C 编程,L
我们发现从Spark 1.3到当前的Spark 2.0.1以来,从Oracle数据库使用Spark的API加载数据一直很慢。典型的代码在Java中是这样的: Map options =
我有时会收到 mnesia overloaded主要使用时的错误消息 async_dirty查询和 ram_copies表。所以为了了解发生了什么,我想获得更多关于 mnesia 状态的信息,例如每秒
对于通常使用很少 CPU 的程序来说,内核 CPU 非常高。 Linux 机器在状态之间交替。大多数时候,程序使用低 CPU 正常执行。在 CPU“激增”期间,程序使用 100% 可用 CPU 使用高
我正在使用 Raspberry Pi 2 来路由 wifi-eth 连接。因此,从 eth 方面来看,我有一台可以使用 Pi wifi 连接到互联网的计算机。在 Raspberry 上我启动 htop
基本上我有一个网页,其中有一个 iframe 可以从不同的域加载另一个网页。它移动得很慢,我想证明整个页面很慢只是因为 iframe 内的页面。 有什么方法可以测量总页面负载以及总页面负载中有多少%来
我们有一个基于 Spring 的应用程序,它充当使用其他 Rest API 的编排层。我只想测试这个组件的性能,而不测试正在使用的下游 api。 我正在寻找有关如何完成此操作的任何架构建议? 当前的方
我正在学习 hibernate 。为了进行测试,我使用无效 key 调用了 session.load 。当我在调试器(JB Idea)中跨过该行后,没有任何反应 - 我预计会得到 ObjectNotF
我正在开发一个小型的待办事项 PHP 应用程序。我正在使用 jQuery 构建 HTML。其中一个是一个按钮,用于启动一个模式,允许用户编辑该项目。我很好奇加载数据时更好的方法是什么: 1) 在初始加
我尝试在 twitch 播放器中使用 angular 作为覆盖标记。 我将 ng-repear 与(键,值)结合使用。 //player is here 设置是一个全局对象。但是当我尝试加载页面
我即将了解 C 语言中的特定进程如何在特定时间范围内加载 CPU。该进程可能会在运行时切换处理器核心,因此我也需要处理这个问题。 CPU为ARM处理器。 我研究了从标准顶部获取负载的不同方法,perf
这个问题在这里已经有了答案: XMLHttpRequest Origin null is not allowed Access-Control-Allow-Origin for file:/// t
您好,我正在用 Java 开发负载平衡算法。在我的系统中将有一个主节点和 n 个从节点。主节点将接收查询分发给它的从节点。但是在将查询分发到其从节点之一之前,我想测量从节点中的当前负载,以检查特定从节
我正在渲染由大约 50 万个三角形组成的相当重的对象。我使用 opengl 显示列表,在渲染方法中只调用 glCallList。我认为一旦图形基元被编译成显示列表,cpu 的工作就完成了,它只是告诉
我正在尝试加密 Sipdroid,为此我必须在 RTP 数据包获得编码的音频负载后对其进行加密。我在 RTP 数据包类中使用这个函数: public byte[] getPayload() {
我正在尝试解析以下 JSON 负载: { "results":[ [ 298.648132, 280.68692, 356.54
在动画期间 cpu 负载非常高(高达 75%) 是否有优化代码以降低 CPU 负载的方法? 我的代码: ImageView myImageView = (ImageView)findViewById(
我是一名优秀的程序员,十分优秀!