<?
//------------------------------------------------------------------------------
//Version 1.3 Update: 26.04.2007
//
// Пример использования
//
// Пример 1
// define('CLX_Key','такой_то'

;
// require_once($_SERVER['DOCUMENT_ROOT'].'/'.CLX_Key.'/1.php'

;
//
// echo($clx->GetPVSCod(1000));
//
// где 1000 - номер сайта, необъязательный второй параметр 1 - обновить код, -1 - запретить обновление кода (тогда код необходимо обновлять в cron)
//
// Пример 2 (с указанием кодировки и текущей страницы)
// define('CLX_Key','такой_то'

;
// require_once($_SERVER['DOCUMENT_ROOT'].'/'.CLX_Key.'/1.php'

;
// $clx->Set_Charset("KOI8-r"

;
// $clx->Set_Page("/info.html"

;
// echo($clx->GetPVSCod(1000));
//------------------------------------------------------------------------------
class CLX
{
var $charset=""; //Необходимая вам кодировка. (WINDOWS-1251, UTF8, KOI8-r)
var $server="такой_то";
var $life=1800; //Период обновления кода
var $ertime=300; //Период обновления кода после ошибки
var $sockettimeout=10; //Ожидание кода, секунд
var $userdir=""; //Нет необходимости изменять. Переопределение стандартной папки для кэширования
var $password="такой_то"; //Пароль (единый на один аккаунт), используется для передачи данных с серверов CLX (в случае если на вашем сервере не удалось подобрать способов подключения)
// Служебные переменные (для работы их изменение не требуется)
var $key="";
var $file="";
var $n_af="";
var $page="";
var $error;
function CLX()
{
$this->key=CLX_Key;
}
function Set_Charset($param)
{
$this->charset=$param;
}
function Set_DownLoadType($param)
{
$this->dtype=$param;
}
function Set_Life($param)
{
$this->life=$param;
}
function Set_SocketTimeOut($param)
{
if ($param!="socket"

$this->error.="<br>Не верный способ подключения к серверу. Возможные варианты: socket, file<br>";
else
$this->sockettimeout=$param;
}
function Set_Dir($param)
{
$this->userdir=$param;
}
function Set_Page($param)
{
if ($param==""
{
$this->page=$_SERVER['REQUEST_URI'];
}
else
$this->page=trim($param);
$this->page=$this->UpdateMD5Url($this->page);
}
function UpdateMD5Url($s)
{
$m=split('\?',trim($s));
if (count($m)>1)
{
$s2=$m[1];
$m2=split('\&',$s2);
if (count($m2)>0)
{
$max=count($m2);
for ($i=0;$i<$max;$i++)
{
$s3=$m2[$i];
$m3=split('=',$s3);
if (eregi("^[a-f0-9]{32}$",$m3[1]) )
{
unset($m2[$i]);
}
}
}
$s2=implode("&",$m2);
if ($s2!=""

$s2="?".$s2;
$s=$m[0].$s2;
}
return $s;
}
function CreateLinkFile($file)
{
if ($userdir==""

$this->file=$_SERVER['DOCUMENT_ROOT'].'/'.$this->key."/".$file;
else
$this->file=$this->userdir."/".$file;
}
function MySaveFile($cod)
{
@$f=fopen($this->file,'w'

;
if ($f)
{
@fwrite($f,$cod,strlen($cod));
@fclose($f);
}
}
function MyReadFile()
{
$cod="";
if (!file_exists($this->file)) $this->error.="<br>Файл $this->file не существует! Проверьте права на запись в этот файл.<br>";
$dir=dirname($this->file);
if (!is_writable($dir))
{
$this->error.="<br>Папка $dir не доступна на запись! Установленные права: ".substr(sprintf('%o', fileperms($dir)), -4).", необходимо 0777<br>";
}
$f=@fopen($this->file,'r'

;
if ($f)
{
$cod=fread($f,filesize($this->file));
@fclose($f);
}
return $cod;
}
function DownLoad($get)
{
$cod="";
if ((((@filemtime($this->file)<(time()-$this->life)) or (@filesize($this->file)==0)) and ($this->update==0)) or ($this->update==1))
{
if (!function_exists("fsockopen"

)
{
@ini_set("allow_url_fopen",1);
if (ini_get("allow_url_fopen"

==1) $this->Set_DownLoadType("file"

;
else $this->Set_DownLoadType(""

;
}
else
$this->Set_DownLoadType("socket"

;
@touch($this->file,(time()-$this->life+$this->ertime));
if ($this->dtype=="socket"

$cod=$this->_Socket($get);
elseif ($this->dtype=="file"

$cod=$this->_GetFile($get);
if ($cod!=""

$this->MYSaveFile($cod);
}
$cod=$this->MYReadFile();
$cod=$this->error.$cod;
return $cod;
}
function ShowPVSCod($cod)
{
$cod=unserialize($cod);
$res=$cod[$this->page];
if (($this->charset!=""

and ($this->charset!="WINDOWS-1251"

) $res=iconv("WINDOWS-1251",$this->charset,$res);
if ($res==""

$res=str_replace("%%page%%",$this->page,$cod[0]);
return $res;
}
function GetPVSCod($n_af,$update=0)
{
$this->update=$update;
$this->CreateLinkFile("pvs_$n_af.cgi"

;
if ($this->page==""

$this->Set_Page($param);
$get="/pvs_data.jsp?key=$this->key&n_af=$n_af";
$s=$this->ShowPVSCod($this->DownLoad($get));
return $s;
}
function _GetFile($get)
{
$res="";
$url="http://$this->server$get";
$res=implode("",file($url));
return $res;
}
function _Socket($get)
{
$res="";
$f=fsockopen($this->server,80,$errno,$errstr,$this->sockettimeout);
if ($f)
{
$out="GET $get HTTP/1.0\r\n";
$out.="Host: $this->server\r\n";
$out.= "Connection: Close\r\n\r\n";
fwrite($f,$out);
while (!@feof($f)) $temp.= @fgets($f,1024);
@fclose($f);
$temp = explode("\r\n\r\n", $temp);
$res=trim($temp[1]);
}
return $res;
}
function SavePost($a)
{
$res=-1;
$n_af=intval($a[n_af]);
$this->key=str_replace(".","",$a[key]);
$this->key=str_replace("/","",$this->key);
$this->CreateLinkFile("pvs_$n_af.cgi"

;
$p=$a[pass];
$data=base64_decode($a[data]);
$md5=md5($this->key.$n_af.$this->password."_".$a[data]);
if ($md5==$p)
{
$this->MySaveFile($data);
$res=1;
}
echo("$res"

;
}
}
$clx = new CLX();
if (isset($_POST[data]) and (strlen($_POST[pass])==32) and $_POST[n_af]>0 and isset($_POST[key]))
{
$clx->SavePOST($_POST);
}
?>