Картинка формируемая скриптом - проблемы.

12 3
malls
На сайте с 08.08.2005
Offline
255
1512

Может кто-нибудь сталкивался.

Есть PHP скрипт - формирует картинку (png) и выдает ее...

<?php

header ("Content-type: image/png");

// здесь собственно составляем картинку

imagepng ($im);
imagedestroy ($im);
?>

Картинка всегда одно и того же размера (ширина/высота), но в зависимости от переданных параметров содержит разные данные и как следствие может весить от 20Кб до 100Кб (больше не видел).

По сути это карта с масштабированием и наложением на нее разных объектов. Масштабирование не меняет ширину и высоту изображения, а меняет лишь кусок карты которые на изображении отображается.

В зависимости от передаваемых параметров и зума - меняется время генерации (на локалке правда дольше трех секунд не видел, на минимальном зуме (т.е. при максимальной карте))

Вызов картинки:

map.php?zoom=1&data=... - вся карта (3 сек. в локале)

map.php?zoom=10&data=... - 1/100 часть карты, (в локале -0 сек, с сервера 1-2 сек)

Проблема в том что если в локалке все работает, то с сервака не работает zoom=1, но работает zoom=10

Не работает в том смысле что браузер (FOX/Opera/IE) просто обрывает загрузки и не показывает изображение. Больше того - Fox предлагает "загрузить PHP файл". Эта проблема правда снялась modrewrit-ом - теперь вызов идет на map.png - но картинка все равно не показыватся на больших масштабах.

Посмотрел логи сервака - на проблемный вызов сервак откликается как HTTP/1.1 200 , т.е. все в порядке - должен сливать инфу.

Что это может быть?

[Удален]
#1

А каким образом от zoom зависит размер картинки?

Есть конечно маловероятное предположение что в процессе буферизации вывода происходит imagedestroy(), и картинка кончается. Попробуйте её закомментить, все равно по окаончании выполнения убьется объект.

Можете еще попробовать передавать заголовок Content-Length чтобы явно сказать браузеру сколько байт надо получить.

malls
На сайте с 08.08.2005
Offline
255
#2
neolord:
А каким образом от zoom зависит размер картинки?

Допустим все карта (zoom=1) это 100х100 клеток в размере 500х500px, при zoom=10 это будет 10х10 клеток в размере 500х500px.

neolord:
Есть конечно маловероятное предположение что в процессе буферизации вывода происходит imagedestroy(), и картинка кончается. Попробуйте её закомментить, все равно по окаончании выполнения убьется объект.

Думал об этом - убрал (хотя он и в конце) - не помогает. 🔥

neolord:
Можете еще попробовать передавать заголовок Content-Length чтобы явно сказать браузеру сколько байт надо получить.

О таком тоже думал - но не знаю как посчитать это дело для случая объекта $im. А сохранять картинку в кэш не хочется.

[Удален]
#3

т.е. с сервака не отдается слишком большая картинка. ясно.

Покажите пожалуйста все заголовки ответа (или урл дайте в пм)

[Удален]
#4

malls а больше точно ни каких header не указанно нигде?

вот например скриптик но для работы не только с png


<?
// использование thumb(путь до картинки, ширина);
function thumb($path,$x,$y=0)
{

$t=getimagesize ($path) or die('Unknown type of image');

$with=$t[0];
if ($x == "")
$x = $with;

$height=$t[1];
switch ($t[2])
{
case 1:
$type='GIF';
$img=imagecreatefromgif($path);
break;
case 2:
$type='JPEG';
$img=imagecreatefromjpeg($path);
break;
case 3:
$type='PNG';
$img=imagecreatefrompng($path);
break;
}
if($y==0)
{$y=$x*($height/$with);}

header("Content-type: image/".$type);
$thumb=ImageCreateTrueColor($x,$y);

imagecopyresampled($thumb,$img,0,0,0,0,$x,$y,$with,$height);
$thumb=imagejpeg($thumb);
return $thumb;
}

if (isset ($_GET['id'])) $id = $_GET['id'];
if (isset ($_GET['w'])) $w = $_GET['w'];
else $w = "";

if ($id)
{
echo thumb($id,$w);
}

?>

ощущение того, что отдаются еще какие то заголовки.

malls
На сайте с 08.08.2005
Offline
255
#5
neolord:
т.е. с сервака не отдается слишком большая картинка. ясно.
Покажите пожалуйста все заголовки ответа (или урл дайте в пм)

Это при ошибочном запросе:

(Status-Line)	HTTP/1.1 200 OK

Date Tue, 24 Feb 2009 12:52:07 GMT
Server Apache/2.2.3 (Debian) PHP/5.2.0-8+etch13 mod_ssl/2.2.3 OpenSSL/0.9.8c
X-Powered-By PHP/5.2.0-8+etch13
Content-Length 0
Keep-Alive timeout=15, max=100
Connection Keep-Alive
Content-Type image/png

Это при нормальном:

(Status-Line)	HTTP/1.1 200 OK

Date Tue, 24 Feb 2009 12:53:49 GMT
Server Apache/2.2.3 (Debian) PHP/5.2.0-8+etch13 mod_ssl/2.2.3 OpenSSL/0.9.8c
X-Powered-By PHP/5.2.0-8+etch13
Keep-Alive timeout=15, max=100
Connection Keep-Alive
Transfer-Encoding chunked
Content-Type image/png
[Удален]
#6

Transfer-Encoding:Chunked используется когда размер передаваемых данных неизвестен, можно попробовать его насильно прописать через header

А вообще дело таки видимо в конфигурации апача.

Я бы еще попробовал image_png обернуть в ob_start/ob_end_flush с гзиповским сжатием.

funky
На сайте с 15.02.2009
Offline
35
#7

ненене уважаемые. png и так гзипованный :) тогда уж без гзипа ob_start/ob_end_flush

[Удален]
#8

что за глупости. Во первых там не gzip а deflate-сжатие, во вторых смысл этого телодвижения не объем уменьшить, а изменить характер восприятия браузером данных

malls
На сайте с 08.08.2005
Offline
255
#9
neolord:
Transfer-Encoding:Chunked используется когда размер передаваемых данных неизвестен, можно попробовать его насильно прописать через header
А вообще дело таки видимо в конфигурации апача.
Я бы еще попробовал image_png обернуть в ob_start/ob_end_flush с гзиповским сжатием.

Transfer-Encoding уже пробовал - :) не помогает.

А вот на счет перехвата вывода - предлагаете поймать - сжать и выплюнуть обратно что получилось? Поймет ли бразер нас?

[Удален]
#10

Да ему пофиг, у меня все картинки сжимаются gzip через htaccess, лишь бы он был у пхп. Попробуйте.

Если не поможет то придется ковыряться в конфиге апача/пхп, видимо там лимит памяти кончается или еще что-то подобное

да кстати а jpeg не пробовали?)) Может все дело в размере тупо?

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий