31.12.2014 Views

Скачать - Xakep Online

Скачать - Xakep Online

Скачать - Xakep Online

SHOW MORE
SHOW LESS

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 />

íàéäåòñÿ ìàññà íóæíîé äîêóìåíòàöèè

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!