假设我想使用数据库中某些行的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错误:
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:
function repararImgRota(img, recurso) {
img.onerror = '';
img.src = '/images/default/'+recurso;
return true;
}
<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个请求。)
答案 0 :(得分:1)
最佳和最优化的方法是使用异步服务从服务器端执行此作业。
将您的PHP代码放入一个文件中,例如:cronscript.php并每天执行一次或两次 cron jobs。您的服务器将启动任务,您将避免检查每次客户访问。
此cronscript.php必须激活或取消激活数据库中图像可用性的标记。