áúðчðть - Xakep Online
áúðчðть - Xakep Online
áúðчðть - Xakep Online
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Ëåãêî ïîíÿòü, ÷òî $params — ýòî ïåðåìåííàÿ<br />
êëàññà, ïîëó÷åíèå ïàðàìåòðîâ îñóùåñòâëÿåòñÿ<br />
ïðè ïîìîùè ìåòîäà getParam(). Çàòåì ïðîèñõîäèò<br />
ïðîâåðêà íà êîððåêòíîñòü ïîëó÷åííûõ äàííûõ,<br />
ñîñòàâëÿåòñÿ ýëåìåíòàðíûé çàïðîñ, ñ÷èòàåòñÿ<br />
êîëè÷åñòâî âîçâðàùåííûõ çàïèñåé, ñîçäàåòñÿ<br />
íîâàÿ ïåðåìåííàÿ êëàññà XML_RPC_Value,<br />
à çàòåì âîçâðàùàåòñÿ îòâåò ñåðâåðà.<br />
Ïîñëå îïèñàíèÿ ïðîöåäóðû íåîáõîäèìî ñîçäàòü<br />
ýêçåìïëÿð XML_RPC_Server è ñîïîñòàâèòü<br />
ñèìâîëè÷åñêîìó ìåòîäó numberOfBots íàøó<br />
ôóíêöèþ NumBots. Äåëàåòñÿ ýòî òàê:<br />
$server = new XML_RPC_Server(<br />
array(<br />
'numberOfBots' =><br />
array(<br />
'function' => 'NumBots'<br />
)<br />
));<br />
><br />
Âîò, â îáùåì-òî, è âñå :). Ñîãëàñèñü, âñå ÷ðåçâû-<br />
÷àéíî ïðîñòî. Íî ÷òîáû ïðèäàòü çàêîí÷åííîñòü<br />
íàøåé ñèñòåìå, íåîáõîäèìî íàïèñàòü åùå êëèåíòñêóþ<br />
÷àñòü. Ïåðâàÿ ñòðîêà ó âñåõ êëèåíòîâ îäèíàêîâàÿ,<br />
íóæíî ïîäêëþ÷èòü ôàéë RPC.php:<br />
require_once 'XML_RPC-1.4.3/RPC.php';<br />
Çàòåì èç ïåðåäàâàåìîé GET'îì ïåðåìåííîé<br />
$_GET[date_r] íóæíî ñäåëàòü ìàññèâ ïåðåìåííûõ<br />
XML_RPC_Value:<br />
$params = array(new XML_RPC_Value($_GET[date_r],<br />
'string'));<br />
Îáðàòè âíèìàíèå, ÷òî êîíñòðóêòîð ýòîãî êëàññà<br />
ïåðâûì ïàðàìåòðîì ïðèíèìàåò ñàìè äàííûå,<br />
à âî âòîðîì óêàçûâàåòñÿ òèï — â íàøåì<br />
ñëó÷àå — ñòðîêà string. Ïîñëå ýòîãî ñîçäàåòñÿ<br />
RPC-ñîîáùåíèå, êîòîðîå âûçûâàåò ìåòîä, ïåðåäàâàÿ<br />
åìó ïàðàìåòðû $params:<br />
$msg = new XML_RPC_Message('numberOf-<br />
Bots', $params);<br />
Çàòåì íåîáõîäèìî ñîçäàòü êëèåíòà è îòîñëàòü<br />
íàøå ñîîáùåíèå:<br />
$cli = new XML_RPC_Client('/te/se.php', 'ired.inins.ru');<br />
$resp = $cli->send($msg);<br />
Ïîñëå ýòîãî ïðîèñõîäèò îáðàáîòêà îøèáîê:<br />
if (!$resp) {<br />
echo 'Îøèáêà ñâÿçè:' . $cli->errstr;<br />
exit;<br />
}<br />
if (!$resp->faultCode()) { # Íå ñëó÷èëîñü îøèáîê<br />
$val = $resp->value();<br />
echo 'Çà '.$_GET[date_r].' çàðåãèñòðèðîâàíî<br />
'.$val->scalarval().' áîòîâ';<br />
} else {<br />
echo 'Êîä îøèáêè: ' . $resp->faultCode() .<br />
"\n";<br />
echo 'Ïðè÷èíà îøèáêè: ' . $resp->faultString() . "\n";<br />
}<br />
Âîò òàê âûãëÿäèò ñîçäàíèå ýëåìåíòàðíîãî ñåðâèñà<br />
è êëèåíòà ê íåìó.<br />
[ñòðóêòóðû ïîñëîæíåå] Òåïåðü ðàññêàæó î<br />
òîì, êàêèì îáðàçîì âîçìîæíî òðàíñïîðòèðîâàòü<br />
íåñêàëÿðíûå ïåðåìåííûå âðîäå ìàññèâîâ<br />
è ñòðóêòóð äàííûõ. Äåéñòâèòåëüíî, î÷åíü ÷àñòî<br />
â ýòîì åñòü îãðîìíàÿ íåîáõîäèìîñòü. Íó, ñêàæåì,<br />
â íàøåé âîîáðàæàåìîé ðàñïðåäåëåííîé<br />
ñèñòåìå óïðàâëåíèÿ áîòíåòîì ìîæåò ïîÿâèòüñÿ<br />
íåîáõîäèìîñòü ïîëó÷èòü âñþ èíôîðìàöèþ î áîòàõ,<br />
çàðåãèñòðèðîâàííûõ çà îïðåäåëåííóþ äàòó<br />
íà îïðåäåëåííîì ñåðâåðå, à íå ïðîñòî ïåðåñ÷èòàòü<br />
èõ, êàê ìû ýòî äåëàëè â ïðèìåðå âûøå.<br />
Ñåé÷àñ ÿ ïîêàæó òåáå, êàêèì îáðàçîì ñåðâåð<br />
ìîæåò îòâåòèòü êëèåíòó ìàññèâîì äàííûõ. Íîâàÿ<br />
ôóíêöèÿ, êîòîðàÿ áóäåò àññîöèèðîâàíà ñ<br />
ìåòîäîì ViewBotInfo, êîòîðûé ìû äîáàâèì ê íàøåìó<br />
ñåðâèñó, íàçûâàåòñÿ BotInfo:<br />
[ôóíêöèÿ, êîòîðàÿ âîçâðàùàåò ìàññèâ<br />
ñòðóêòóð ñ èíôîðìàöèåé î áîòàõ]<br />
function BotInfro($params) {<br />
$param = $params->getParam(0);<br />
$re=mysql_query("select * from bots where<br />
date_reg='$param->scalarval()'");<br />
$val=new XML_RPC_Value();<br />
$bots=array();<br />
$i=0;<br />
while($res=mysql_fetch_array($re)) {<br />
$bots[$i]=new XML_RPC_Value(array(<br />
"ip" => new XML_RPC_Value("$res[ip]"),<br />
"country" => new XML_RPC_Value("$res[country]"),<br />
"date_r" => new XML_RPC_Value("$res[date_r]")), "struct");<br />
$i++;<br />
}<br />
$val->addArray($bots);<br />
return new XML_RPC_Response($val);<br />
}<br />
Âèäíî, ÷òî â ïåðâûõ äâóõ ñòðî÷êàõ ôóíêöèè ÿ<br />
ïîëó÷àþ ïàðàìåòð — äàòó äëÿ âûáîðêè è ñîçäàþ<br />
SQL-çàïðîñ ê áàçå äàííûõ. Çàòåì ñîçäàåòñÿ<br />
ïåðåìåííàÿ $val êëàññà XML_RPC_Value,<br />
èíèöèàëèçèðóåòñÿ ìàññèâ $bots c áîòàìè. Ïîñëå<br />
ýòîãî â öèêëå ïî âñåì âîçâðàùåííûì çàïðîñîì<br />
çàïèñÿì òàáëèöû ýòîò ìàññèâ çàïîëíÿåòñÿ<br />
ñòðóêòóðàìè, íåñóùèìè èíôîðìàöèþ î áîòàõ.<br />
Ðàçóìååòñÿ, âñå ýòî óñëîâíî, ðåàëüíûå ñòðóêòóðû<br />
ìîãóò áûòü çíà÷èòåëüíî ñëîæíåå, íî îáùèé<br />
ïðèíöèï èìåííî òàêîé.<br />
Ïîñëå ýòîãî öèêëà, êîãäà ñîçäàí «ìàññèâ áîòîâ»,<br />
íåîáõîäèìî èç ýòîãî ìàññèâà èçãîòîâèòü<br />
ïåðåìåííóþ êëàññà XML_RPC_Value. Äëÿ ÷åãî<br />
ê óæå ñîçäàííîìó îáúåêòó, ïðè ïîìîùè ìåòîäà<br />
addArray(), äîáàâëÿåòñÿ íàø ìàññèâ.<br />
Êëèåíòñêàÿ ñòîðîíà, êîòîðóþ òàê æå íåîáõîäèìî<br />
ðåàëèçîâàòü, ðàáîòàåò àíàëîãè÷íî óæå ðàçîáðàííîìó<br />
ñëó÷àþ. Ñ òîé ëèøü ðàçíèöåé, ÷òî<br />
$val = $resp->value() — ýòî íå ìàññèâ â ïðèâû÷íîì<br />
ïîíèìàíèè ýòîãî ñëîâà. Ýòî ïåðåìåííàÿ<br />
XML_RPC_Value, à äîñòóï ê ýëåìåíòàì ìàññèâà<br />
äîëæåí îñóùåñòâëÿòüñÿ ïðè ïîìîùè ìåòîäà<br />
arraymem(). Íàïðèìåð, $val->arraymem(0) âåðíåò<br />
ïåðåìåííóþ XML_RPC_Value ýëåìåíòà ñ íóëåâûì<br />
èíäåêñîì.  íàøåì ñëó÷àå ýòî — ñòðóêòóðà<br />
ñ èíôîðìàöèåé î áîòàõ. Ïîëó÷èòü êîíêðåòíûå<br />
çíà÷åíèÿ ïîëåé ìîæíî ñëåäóþùèì îáðàçîì:<br />
$val->arraymem(0)->structmem("ip")->scalarval().<br />
[âûâîäû] Ìîæåò ïîêàçàòüñÿ, ÷òî èñïîëüçîâàíèå<br />
ýòîé ñèñòåìû ïîäðàçóìåâàåò íåäþæèííûé îáúåêòíûé<br />
ãåìîððîé. È õîòü ýòî ìîæåò ñíà÷àëà ïîêàçàòüñÿ<br />
ãðîìîçäêèì è íåóäîáíûì, íî ýòî íå òàê.<br />
Ñòîèò ïîðàáîòàòü ñ ñèñòåìîé õîòÿ áû 15 ìèíóò,<br />
êàê âñå ñòàíîâèòñÿ ïîíÿòíî, ïðèâû÷íî è óäîáíî.<br />
Åñëè æå òû íà äóõ íå ïåðåíîñèøü îáúåêòíûé<br />
ïîäõîä, ñîâåòóþ îáðàòèòüñÿ ê äðóãèì ðåàëèçàöèÿì<br />
XML_RPC. Èíôîðìàöèþ î íèõ òû íàéäåøü<br />
â ñîîòâåòñòâóþùåé âðåçêå. Âñå íàïå÷àòàííûå â<br />
ñòàòüå ñêðèïòû, äîïîëíåííûå è äîïèñàííûå,<br />
îôîðìëåííûå â âèäå ïîëíîöåííîãî òåñòîâîãî<br />
ïðèìåðà, òû îòûùåøü íà íàøåì äèñêå, òàì æå<br />
íàéäåòñÿ ìàññà íóæíîé äîêóìåíòàöèè