Но нужно серьёзно протестировать.
Инструкция простая:
1. Включаем использование php в params.txt: UsePHPScript=1
2. Пишем скрипт и кладём его в zmp. Есть ряд предопределённых переменных, которым в скрипте в обязательном порядке нужно что-то присвоить (описание см. в примере ниже), иначе сас откажется работать. Скрипт должен называться downloader.php и никак иначе.
3. Запускаем и пользуем. Предварительно убеждаемся, в том что у нас php либо установлен в систему, либо в директории с сас лежит php5ts.dll.
Скрипт которым я тестил (немного кривой, но рабочий - в конце тайлов остаются 2 лишних байта: 0D 0A):
- Код: Выделить всё
<?php
/*
Предопределённые переменные:
1. $errstr - строка, любая текстовая информация об ошибке скрипта - возвращается в SAS (необязательный параметр)
2. $download_result - число от 0 до 9 - возвращается в SAS (обязательный параметр)
0 - OK
1 - SameTileSize
2 - ErrorInternetOpen
3 - ErrorInternetOpenURL
4 - ProxyAuthError
5 - ErrorMIMEType
6 - DownloadError
7 - TileNotExists
8 - BanError
9 - UnknownError
3. $url - строка, полный url запроса - возвращается в SAS (обязательный параметр)
4. $mme_type - строка, тип контента - возвращается в SAS (обязательный параметр)
5. $cookie - строка, любая информация передаваемая между скриптами - возвращается в SAS (необязательный параметр)
6. $x,$y,$z - числа, параметры карты ($z - нумерация с нуля)
7. $old_tile_sz - число, размер имеющего тайла в кэше, либо -1
*/
/* --------------------------------------------------------------------------------------------------------- */
$download_result = 9;
$url = "http://127.0.0.1:8081/jpegfile?db=earth&ver=0&date=0&x=".$x."&y=".$y."&z=".$z;
$mme_type = "image/jpg";
$body = '';
$cookie = '';
$errstr = '';
$z = $z + 1;
$body = http_request(
'GET',
'127.0.0.1',
8081,
"/jpegfile?db=earth&ver=0&date=0&x=".$x."&y=".$y."&z=".$z,
array(),
array(),
array('Cookie' => 'TestCookie'),
array('Referer' => 'TestReferer'),
30000,
false,
false
);
if ($body != '') {
$download_result = 0; // говорим сас - OK
print $body; // и отдаём тайл (без хидеров)
}
else
$download_result = 7; // говорим, что тайл отсутствует
/* --------------------------------------------------------------------------------------------------------- */
function http_request(
$verb = 'GET', /* HTTP Request Method (GET and POST supported) */
$ip, /* Target IP/Hostname */
$port = 80, /* Target TCP port */
$uri = '/', /* Target URI */
$getdata = array(), /* HTTP GET Data ie. array('var1' => 'val1', 'var2' => 'val2') */
$postdata = array(), /* HTTP POST Data ie. array('var1' => 'val1', 'var2' => 'val2') */
$cookie = array(), /* HTTP Cookie Data ie. array('var1' => 'val1', 'var2' => 'val2') */
$custom_headers = array(), /* Custom HTTP headers ie. array('Referer: http://localhost/ */
$timeout = 1000, /* Socket timeout in milliseconds */
$req_hdr = false, /* Include HTTP request headers */
$res_hdr = false /* Include HTTP response headers */
)
{
$ret = '';
$verb = strtoupper($verb);
$cookie_str = '';
$getdata_str = count($getdata) ? '?' : '';
$postdata_str = '';
foreach ($getdata as $k => $v)
$getdata_str .= urlencode($k) .'='. urlencode($v);
foreach ($postdata as $k => $v)
$postdata_str .= urlencode($k) .'='. urlencode($v) .'&';
foreach ($cookie as $k => $v)
$cookie_str .= urlencode($k) .'='. urlencode($v) .'; ';
$crlf = "\r\n";
$req = $verb .' '. $uri . $getdata_str .' HTTP/1.1' . $crlf;
$req .= 'Host: '. $ip . $crlf;
$req .= 'User-Agent: Mozilla/5.0 Firefox/3.6.12' . $crlf;
$req .= 'Accept: image/jpg' . $crlf;
foreach ($custom_headers as $k => $v)
$req .= $k .': '. $v . $crlf;
if (!empty($cookie_str))
$req .= 'Cookie: '. substr($cookie_str, 0, -2) . $crlf;
if ($verb == 'POST' && !empty($postdata_str))
{
$postdata_str = substr($postdata_str, 0, -1);
$req .= 'Content-Type: application/x-www-form-urlencoded' . $crlf;
$req .= 'Content-Length: '. strlen($postdata_str) . $crlf . $crlf;
$req .= $postdata_str;
}
else $req .= $crlf;
if ($req_hdr)
$ret .= $req;
if (($fp = @fsockopen($ip, $port, $errno, $errstr)) == false)
return "Error $errno: $errstr\n";
stream_set_timeout($fp, 0, $timeout * 1000);
fputs($fp, $req);
while ($line = fgets($fp)) $ret .= $line;
fclose($fp);
if (!$res_hdr)
$ret = substr($ret, strpos($ret, "\r\n\r\n") + 4);
return $ret;
}
?>
Ссылка: http://narod.ru/disk/8870874001/sas.php.test.zip.html - sas + php5ts.dll + тестовая карта с активированным скриптом (настроен на GeoCacher).