У меня есть изображение, которое разорвано PHP-скриптом. Я называю это так.
<img src="/index.php/image-name.jpg">
Если возраст изображения превышает 5 минут, мой сценарий извлечет новую копию изображения из поставщика данных, а затем отобразит новое изображение.
Когда веб-сайт, который предоставляет изображения, загружен, и этот скрипт запускает выборку новой копии, он часто отображает только верхнюю часть изображения. Firebug скажет мне, что изображение повреждено или усечено. Если я открою изображение в новой вкладке, у моего сервера будет полная копия. Если я запускаю скрипт второй раз в течение 5 минут, он работает отлично.
Выглядит так, будто для получения изображения, на которое он выходит из строя, уходит больше определенного времени, и отображается только верхняя часть. Любые мысли о том, как заставить его ждать дольше, прежде чем сдаться? Или, может быть, я полностью на неправильном пути с тем, что идет не так.
<?php
// get the image name from the uri
$path= $_SERVER['REQUEST_URI'];
$image = explode("/", $path);
$image=$image[3];//Get the file name
$image=str_replace('%20',' ', $image); //make it all spaces
$localimage='./road_images/'.$image; //where to find the image on the sever
// check if the image exists, this prevents some kinds of attacks
if (is_file($localimage)) {
$age = filemtime($localimage); // get the file age
if ($age < time() - (60*5)) { // 5 mins old
$simage='http://www.someplace/cams/'.$image;
$simage=str_replace(' ', '%20', $simage);//need to remove the spaces for URLs
copy($simage, $localimage);
}
// serve the image to the user.
$fp = fopen($localimage, 'r');
// send the right headers
header("Content-Type: image/jpg");
header("Content-Length: " . filesize($localimage));
// dump the picture and stop the script
fpassthru($fp);
exit();
}
else
{
echo("Error, no such file: '$image'");
}
?>
РЕДАКТИРОВАТЬ: обнаружили это, отредактировав
header("Content-Length: " . filesize($localimage));
Работает как положено. Все еще пытаюсь понять, почему.
Это было больно. Я передал неправильное значение заголовка Content-Length. Редактирование длины контента решило проблему так, чтобы она работала просто отлично. Учитывая, что это статический контент, я не знаю, почему то, что у меня есть выше, не работает.
С большим количеством исследований выяснили, как это работает.
я кладу ob_start()
близко к началу
Новый заголовок Content-Length header('Content-Length: ' . ob_get_length());
идет внизу, непосредственно перед выходом скрипта.
Сделано таким образом, это работает каждый раз и приятно для браузера.
Других решений пока нет …