RXP/Stimul - посылка клика javascript-ом
В движках RXP (и, насколько мне известно Stimula) данные о заргрузке страницы (клике) отправляется в админку из php скрипта, генерящего страницу шопа. Вероятно, у такого способа есть преимущества, например, RXP получает полные данные об индексации шопа поисковиками, но и немало минусов. Прежде всего, тормозится загрузка страницы - пока скрипт достучится до кликхоста. А ведь последний может и лежать... Далее, в статистику попадает масса кликов (правильнее было бы сказать - заходов) сделанных не людьми (а сволочами какими-то :). RXP пытается их фильтровать, но эффект от фильтрования далек от идеального.
Когда я внедрил на своих шопах первую версию JS-клика, то оказалось, что каждый чел мне приносит раз в 10 больше денег - человеков на самом деле оказалось мало.
Вобщем, перейдем к реализации. Отправка клика осуществляется методом send_click, расположенным в файле Cart.class.php.
Было:
if ($_SERVER['RX_DEBUG'])
{ if (0) warn($query_string); }
elseif (is_resource($sock = @fsockopen(gethostbyname($host), 80, $errno, $errstr)))
{
@fputs($sock, "GET /click.php?$query_string HTTP/1.0\r\nHost:$host\r\n\r\n");
@fclose($sock);
}
else warn("send_click() failed via $errstr/$errno ($host)");
Стало:
if ($_SERVER['RX_DEBUG'])
{ if (0) warn($query_string); }
// elseif (is_resource($sock = @fsockopen(gethostbyname($host), 80, $errno, $errstr)))
else
{
$query_string = base64_encode($query_string);
$rand = rand(111111111,999999999);
print <<<QQQ
<script language="javascript">
document.cookie = "click=$query_string";
document.write('<img src="/click.php?$rand" border="0" width="1" height="1">');</script>
QQQ;
// @fputs($sock, "GET /click.php?$query_string HTTP/1.0\r\nHost:$host\r\n\r\n");
// @fclose($sock);
}
// else warn("send_click() failed via $errstr/$errno ($host)");
То есть удаляем/комментарим ту часть кода, которая открывает кликхост и отправляет ему инфу, а вместо нее пишем print, печатающий джаваскрипт. Последний записывает куку, содержащую данные о клике и печатает код, вызывающий рисунок отдаваемый файлом /click.php. Вот - его код:
include "config.php";
if (file_exists("config_def.php")) include "config_def.php";
$imgfile = file_get_contents("imgs/spacer.gif");
$click_url = @$config['click_script'];
if (!$click_url) $click_url = "http://$config[click_host]/click.php";
$query_str = $_COOKIE['click'];
if (!$query_str) die();
$query_str = base64_decode($query_str);
$purl = parse_url($click_url);
$query_str = urldecode(urlencode($query_str));
if (isset($_GET['debug']))
{
print "click_url: $click_url";
print "
query_str: ".htmlentities($query_str);
die();
}
if ($_SERVER['REMOTE_ADDR']=='127.0.0.1') die();
$sock = fsockopen(gethostbyname($purl['host']), 80, $errno, $errstr);
if ($sock)
{
fputs($sock, "GET /click.php?$query_str HTTP/1.0\r\nHost: $purl[host]\r\n\r\n");
fclose($sock);
}
// date in the past
header("Expires: Mon, 1 Jan 2000 00:00:00 GMT");
// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
// HTTP/1.0
header("Pragma: no-cache");
header("Content-Type: image/gif");
header("Content-Length: ".strlen($imgfile));
print $imgfile;
Понятно, что файл click.php должен находиться в корне. Этот скрипт читает из куки данные о клике и отсылает их в на кликхост. Таким образом, будут пересылаться данные только о тех заходах, где выполняется джаваскрипт и поддерживаются куки. Также, отправка данных будет отвязана от загрузки страницы, и не будет ее тормозить.
Версия движка ваших шопов может отличаться от последней, для которой я привел код, но смышленный программер сообразит что где подправить, не забыв заранее сохраниться ;)
Надеюсь, нечто подобное намечается в третьей версии движка

в версии EdSelection (и,
в версии EdSelection (и, возможно, других) 2.5 эта фича встроена, но не активированна. чтоб ее активировать, надо в файле aff_camp.php установить
'USE_EXTERNAL_CLICK_SCRIPT'=>'1'
update
в тескт вкралась ошибка (спасибо - sky), точнее друпал ее вкрал 8-[]
там теги < br > в ненужном месте были, если кто ставил патч и не добился результата, то сейчас доступен правильный вариант.