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

时间:2015-01-15 21:25:52

标签: javascript php html performance

假设我想使用数据库中某些行的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,以便用户看不到损坏的图像。

但也有另一种方法,始终服务生成的URL存在或不存在于客户端Web浏览器。然后,如果找不到图像(客户端Web浏览器出现404错误和图像损坏),请在客户端使用javascript替换默认值的URL:

Javascript代码

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')" />

接下来是问题:

为了在我的网络服务器中获得更好的性能,建议使用哪种方法,以免因为很多用户访问网页而崩溃?(比方说,列出生成的网址中的图片的网页将会每天收到100,000个请求。)

1 个答案:

答案 0 :(得分:1)

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

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

此cronscript.php必须激活或取消激活数据库中图像可用性的标记。