检查服务器端或客户端是否存在某些 Web 资源是否更好

Is it better to check if some web resources exists in the server-side or in the client-side?

本文关键字:是否 Web 资源 更好 存在 服务器端 客户端 检查      更新时间:2023-09-26

假设我想使用数据库中某些行的 ID 从外部域中检索网页中列表的 12 张图像。例如,对于 id 为 1,2,3,4 的行,呈现的网页中的 HTML 将是:

<img src="https://external.domain.com/images/product/1.jpg" />
<img src="https://external.domain.com/images/product/2.jpg" />
<img src="https://external.domain.com/images/product/3.jpg" />
<img src="https://external.domain.com/images/product/4.jpg" />

但是其中一些图像不可用,因为这个站点没有我的数据库中所有行的所有图像。我研究了一下,我可以使用如下代码检查是否有任何请求在服务器端返回 404 错误:

PHP代码

public function existeRecurso($url)
{
    $recurso = curl_init($url);
    curl_setopt($recurso, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($recurso, CURLOPT_NOBODY, TRUE);
    // Hacer la petición para obtener los headers y saber si el resultado será un error 404
    $respuesta = curl_exec($recurso);
    $codigoHTTP = curl_getinfo($recurso, CURLINFO_HTTP_CODE);
    curl_close($recurso);
    if ($codigoHTTP == 404) {
        return false;
    } else {
        return true;
    }
}

之后,我在使用 PHP 渲染 HTML 时使用 PHP 函数,如果图像不存在,我将替换默认 URL,以便用户看不到损坏的图像。

但还有另一种方法,始终向客户端 Web 浏览器提供生成的 URL 存在或不存在。然后,如果未找到图像(客户端 Web 浏览器收到 404 错误和损坏的图像),请在客户端使用 javascript 替换默认 URL:

Javascript Code

function repararImgRota(img, recurso) {
    img.onerror = '';
    img.src = '/images/default/'+recurso;
    return true;
}

由 PHP 生成的 HTML 代码

<img src="https://external.domain.com/images/product/1.jpg" onerror="repararImgRota(this, 'producto.jpg')" />
<img src="https://external.domain.com/images/product/2.jpg" onerror="repararImgRota(this, 'producto.jpg')" />
<img src="https://external.domain.com/images/product/3.jpg" onerror="repararImgRota(this, 'producto.jpg')" />
<img src="https://external.domain.com/images/product/4.jpg" onerror="repararImgRota(this, 'producto.jpg')" />

那么问题来了:

建议使用哪种方法在我的 Web 服务器中获得更好的性能,这样它就不会因为许多用户将访问该网页而崩溃?(假设列出来自生成的 URL 的图像的网页每天将收到 100,000 个请求)。

最好和最优化的方法是使用异步服务从服务器端执行此作业。

将你的 php 代码放入一个文件中,例如:cronscript.php并每天执行一次或两次克龙工作 . 您的服务器将启动任务,您将避免检查每次客户端访问。

此 cronscript.php 必须激活或停用数据库上图像可用性的标志。