SASGIS

Веб-картография и навигация

Поддержка PHP скриптов

Форум для обсуждения деталей разработки программы SAS.Планета

Модераторы: vdemidov, Tolik

Re: Поддержка PHP скриптов

Сообщение zed » 02 апр 2011, 10:29

Сам скрипт:
Код: Выделить всё
$Url .= "x=".$X."&y=".$Y."&z=".$Z;
   $MIMEType = "image/jpg";
    $CookieStr = '';
   $ErrStr = '';
   
    $host = '127.0.0.1';
    $port = 8081;     
   
    // подготавливаем запрос
    $request =  "GET " . "/jpegfile?db=earth&ver=0&date=0&x=" . $X . "&y=" . $Y . "&z=" . $Z . " HTTP/1.1\r\n".
                "Host: " . $host . "\r\n".
                "User-Agent: Mozilla/5.0 Firefox/3.6.12\r\n".
                "Accept: image/jpg\r\n".
                "Connection: Close\r\n\r\n";
   
    // открываем сокет
    if (($fp = @fsockopen($host, $port, $errno, $errstr)) == false) {
        $DownloadResult = 2; // ErrorInternetOpen
        $ErrStr = 'fsockopen error '.$errno; // Заменяет стандартное сообщение об ошибке на тайле
        die;
    }
    // устанавливаем тайм-аут соединения
    stream_set_timeout($fp, 0, 30*1000);
   
    // отправляем запрос серверу
    fputs($fp, $request);
   
    // забираем ответ от сервера
    $response = '';
    while ($line = fgets($fp))
        $response .= $line;
   
    // закрываем соединение
    fclose($fp);
   
    // анализируем ответ
    $response_size = strlen($response);
   
    if (($body_start_pos = strpos($response, "\r\n\r\n")) == false){
        $DownloadResult = 6; //DownloadError
      $ErrStr = 'DownloadError';
        die;
    }
   
   $body_start_pos = strpos($response, "\r\n\r\n");
    $body_start_pos = $body_start_pos + 4;
    $head = substr($response, 0, $response_size - $body_start_pos);
    $body = substr($response, $body_start_pos);
   
    if ($body != '') {   
       $DownloadResult = 0; //OK
        print $body;        
   }
   else {
      $DownloadResult = 7;   //TileNotExists
      $ErrStr = 'TileNotExists ';
   }    


P.S. Я ведь почему просил кого-нибудь сделать мне скрипт для тестов - чтоб быть уверенным, что ошибок на стороне php не будет. Сам я с php знаком очень отдалённо.

P.P.S. Да, и не считая этих 2-х байт в конце тела тайла (которые особо не мешают SAS нормального его отображать), с прикручиванием php с большего закончено. Так что, желающие могут начинать писать скрипты под конкретные сервисы, мешающие жить своим баном :)
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 568 раз.

Re: Поддержка PHP скриптов

Сообщение Parasite » 02 апр 2011, 10:57

Если два доп.байта прилетают из сокета - то вот это правило
Код: Выделить всё
if ($body != '')

будет всегда TRUE (то есть пустое тело ответа никогда не выловится - там всегда будет как минимум 2 байта).

Да, и саму отдачу на сторону клиента лучше делать не по print а по echo:
Код: Выделить всё
if (file_exists($loc)) {      
   $h = fopen("$loc","r");
   $content = fread($h,filesize("$loc"));
   fclose($h);

   header('HTTP/1.0 200 OK');
   header('Content-Type: application/octet-stream');
   #header('Expires: 0');
   #header('Cache-Control: no-cache,no-store');
   #header('Date: '.date("D, d M Y G:i:s").' GMT');
   #header('Server: btfe');
   header('Content-Length:'.strlen($content));
   #header('Connection: Keep-Alive');
   header('');

   echo $content;    
}

Возможно, ошибка как раз тут, бо print предназначен для строк.
The only difference between me and a mad man is that I am not mad. /Salvador Dali/
Изображение
Аватара пользователя
Parasite
Администратор
 
Сообщения: 5646
Зарегистрирован: 23 окт 2008, 17:38
Благодарил (а): 124 раз.
Поблагодарили: 512 раз.

Re: Поддержка PHP скриптов

Сообщение zed » 02 апр 2011, 11:01

Пробовал и echo и printf - всё одинаково. Если попробовать отрезать эти 2 байта ДО отправки в SAS, то тут уже ругается SAS, что файл повреждён (т.е. в $body у нас таки ничего лишнего нет).
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 568 раз.

Re: Поддержка PHP скриптов

Сообщение Parasite » 02 апр 2011, 11:18

zed писал(а):Пробовал и echo и printf - всё одинаково. Если попробовать отрезать эти 2 байта ДО отправки в SAS, то тут уже ругается SAS, что файл повреждён (т.е. в $body у нас таки ничего лишнего нет).

Так это. А что будет видно, если сам ответ сдампить в файл - еще ДО всех операций над данными в скрипте? Там и будет видно - приходит ли это извне или уже результат последующих операций в скрипте.
То есть, между строчек
Код: Выделить всё
while ($line = fgets($fp))
        $response .= $line;
              >>>   сюда   <<<   
    // закрываем соединение
    fclose($fp);


добавить например вот это:
Код: Выделить всё
$dump_temp = fopen("dump.dat", "w");fwrite($dump_temp, $response);fclose($dump_temp);


PS: при этом возможно строку $response .= $line; понадобится взять в фигурные скобки.

PPS: можно также попробовать взять контент напрямую из бинарного файла на диске (что исключит и GC, и сокеты) - и сдампить в новый файл. А потом и сравнить оба два.
Взять [небольшой] файл - это строки:
Код: Выделить всё
      $dump = fopen("on_demand.dat", "r");
      while (!feof($dump)) {
          $data = fread($dump,1024);
         };
      fclose ($dump);
The only difference between me and a mad man is that I am not mad. /Salvador Dali/
Изображение
Аватара пользователя
Parasite
Администратор
 
Сообщения: 5646
Зарегистрирован: 23 окт 2008, 17:38
Благодарил (а): 124 раз.
Поблагодарили: 512 раз.

Re: Поддержка PHP скриптов

Сообщение zed » 02 апр 2011, 12:20

Проверил:
Код: Выделить всё
$body = '';
   
   $dump = fopen("c:\dump.read.jpg", "r");
   while (!feof($dump)) {
     $body .= fread($dump,1024);
    };
   fclose ($dump);
   
   $dump_temp = fopen("c:\dump.write.jpg", "w");
   fwrite($dump_temp, $body);
   fclose($dump_temp);
   
    if ($body != '') {   
       $DownloadResult = 0; //OK
        echo $body;        
   }
   else {
      $DownloadResult = 7;   //TileNotExists
      $ErrStr = 'TileNotExists ';
   }

Во всех случаях из php всё сохраняется без мусора, а вот в SAS уже приходит с лишними байтами - т.е. оно либо добавляется внутрях компонента (php4delphi) либо где-то до него.
Короче, вопрос закрыт - поставил проверку на лишний перевод строки в теле ответа, если присутствует - делается обрезание.
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 568 раз.

Re: Поддержка PHP скриптов

Сообщение Parasite » 02 апр 2011, 12:28

zed писал(а):проверку на лишний перевод строки в теле ответа, если присутствует - делается обрезание.

А если (вот совершенно случайно) в самом жпеге встретится такая комбинация всего лишь двух байт? Обрежет с середины жпега и до конца? ;)
The only difference between me and a mad man is that I am not mad. /Salvador Dali/
Изображение
Аватара пользователя
Parasite
Администратор
 
Сообщения: 5646
Зарегистрирован: 23 окт 2008, 17:38
Благодарил (а): 124 раз.
Поблагодарили: 512 раз.

Re: Поддержка PHP скриптов

Сообщение zed » 02 апр 2011, 12:32

Parasite писал(а):
zed писал(а):проверку на лишний перевод строки в теле ответа, если присутствует - делается обрезание.

А если (вот совершенно случайно) в самом жпеге встретится такая комбинация всего лишь двух байт? Обрежет с середины жпега и до конца? ;)

Нет, проверяется лишь 2 последних байта на равенство 0D 0A. Остальное тело никаким проверкам и модификациям не подвергается. И обрезается тело не более чем на 2 байта и даже учтён момент, что тело может быть и меньше либо равно 2-м байтам (в этом случае тоже никаких модификаций и проверок не делается).
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 568 раз.

Re: Поддержка PHP скриптов

Сообщение Parasite » 02 апр 2011, 12:46

zed писал(а):
Parasite писал(а):
zed писал(а):проверку на лишний перевод строки в теле ответа, если присутствует - делается обрезание.

А если (вот совершенно случайно) в самом жпеге встретится такая комбинация всего лишь двух байт? Обрежет с середины жпега и до конца? ;)

Нет, проверяется лишь 2 последних байта на равенство 0D 0A.

Имхо, все равно костыль. Я бы вот например поразбирался бы, откуда они берутся (но не сегодня).

А при пуске в консоли и запросе тайла браузером (режим прокси-скриптика и без САСа) - такое же поведение, или все ОК?
The only difference between me and a mad man is that I am not mad. /Salvador Dali/
Изображение
Аватара пользователя
Parasite
Администратор
 
Сообщения: 5646
Зарегистрирован: 23 окт 2008, 17:38
Благодарил (а): 124 раз.
Поблагодарили: 512 раз.

Re: Поддержка PHP скриптов

Сообщение zed » 02 апр 2011, 12:54

Parasite писал(а):А при пуске в консоли и запросе тайла браузером (режим прокси-скриптика и без САСа) - такое же поведение, или все ОК?

Кстати, да - поведение аналогичное: присутствует перевод строки в конце:
Image 1.jpg
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 568 раз.

Re: Поддержка PHP скриптов

Сообщение Parasite » 02 апр 2011, 13:12

zed писал(а):
Parasite писал(а):А при пуске в консоли и запросе тайла браузером (режим прокси-скриптика и без САСа) - такое же поведение, или все ОК?

Кстати, да - поведение аналогичное: присутствует перевод строки в конце

Тю...ну теперь осталось брать референс-файл с винта, и отдавать его в консоль. И смотреть, на каком шаге начнут вылазить OD OA. :)
The only difference between me and a mad man is that I am not mad. /Salvador Dali/
Изображение
Аватара пользователя
Parasite
Администратор
 
Сообщения: 5646
Зарегистрирован: 23 окт 2008, 17:38
Благодарил (а): 124 раз.
Поблагодарили: 512 раз.

Пред.След.

Вернуться в Раздел для разработчиков программы SAS.Планета

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4