рдИрдЬрд╝реАрд╡реЗрдм: рдирдП рд╕рд╛рд▓ рдХрд╛ рдЕрдкрдбреЗрдЯ

рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ , рдЬрд┐рд╕рдиреЗ рдЬрдирддрд╛ рдХреЗ рд▓рд┐рдП рдЗрдЬрд╝реАрд╡реЗрдм рд╡реЗрдм рдЗрдВрдЬрди рдХрд╛ рдкрд░рд┐рдЪрдп рджрд┐рдпрд╛, рдпрд╣ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛:
рдпрд╣ рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг, рдЬрд┐рд╕реЗ рд╕реНрдерд┐рд░ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд░реНрд╖ рдХреЗ рдЕрдВрдд рд╕реЗ рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

рдЪреВрдБрдХрд┐ рд╕рд╛рд▓ рдЦрддреНрдо рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рджрд┐рди рд╕реЗ рднреА рдХрдо рд╕рдордп рдмрдЪрд╛ рд╣реИ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдБ рдХрд┐ рдЗрд╕ рд╕рд╛рд▓ рд╣рдо рдФрд░ рдХреНрдпрд╛ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред


XML рд╕реБрд╡рд┐рдзрд╛рдПрдБ


Easyweb рдХреЛ рд╕реМрдВрдкреЗ рдЧрдП рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ PHP рдХреА рдУрд░ рд╕реЗ XML рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рд╛рдл, рд╕реБрдВрджрд░, рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХреЗред рдлрд┐рд▓рд╣рд╛рд▓, XML рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдЫреЛрдЯреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг:

рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, GitHub рдкрд░ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдорд╛рдирдХ PHP DOM API рдФрд░ Easyweb XML рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдкрд░ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред рдмрд╛рдд рдпрд╣ рд╣реИред рдЖрдкрдХреЛ рдкреБрд╕реНрддрдХреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреБрд╕реНрддрдХ рдХреЗ рд╕рд╛рде рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░реЗрдВ: рдХреАрдордд рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ, рдореБрджреНрд░рд╛ рдХреЛрдб рдХреЛ рдЙрд╕рдХреЗ рдирд┐рдЪрд▓реЗ рдорд╛рдорд▓реЗ рд╕реЗ рдмрджрд▓реЗрдВ, рдФрд░ рдкреБрд╕реНрддрдХ рдХреЗ рд▓реЗрдЦрдХ рдФрд░ рд╢реНрд░реЗрдгреА рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рднреА рд╕реЗрдЯ рдХрд░реЗрдВ (рддреНрд░реБрдЯрд┐ рдЬрд╛рдБрдЪ рд╕рд╣рд┐рдд)ред

рдпрд╣ рдерд╛:
<?php function replace($author_id, $category_id) { $xml = new DOMDocument(); if(!$xml->load('/var/www/html/mywebsite/xml/library.xml')) { throw new Exception('Error loading XML file'); } $xpath = new DOMXPath($xml); foreach($xpath->query('/books/book') as $book) { $price = $xpath->query('price', $book); if($price->length != 1) { throw new Exception('Node "price" should be unique for the book'); } $price->item[0]->nodeValue = 0; $currency = $price->getAttribute('currency'); if($currency) { $book->setAttribute('currency', strtolower($currency)); } else { throw new Exception('Attribute "currency" not found'); } $book->setAttribute('author_id', $author_id); $book->setAttribute('category_id', $category_id); } } ?> 

рдпрд╣ рдмрди рдЧрдпрд╛:
 <?php function replace($author_id, $category_id) { $xml = xml::load('/xml/library.xml'); foreach($xml->query('/books/book') as $book) { $book['price'] = 0; $book['price/@currency'] = strtolower($book['price/@currency']); $book['@author_id'] = $author_id; $book['@category_id'] = $category_id; } } ?> 

рдИрдЬрд╝реАрд╡реЗрдм рдПрдХреНрд╕рдПрдордПрд▓ рд╕реБрд╡рд┐рдзрд╛ рджреЗрд╢реА PHP рдбреЛрдо рд╕рдВрд╕рд╛рдзрди рд╣реИрдВрдбрд▓ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЭрд┐рд▓реНрд▓реА рдлрд╝рдВрдХреНрд╢рди ::get() рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдореВрд▓ PHP рдбреЛрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред


XPath рдПрдХреНрд╕рдЯреЗрдВрд╢рди www: рдкреЗрдЬреЗрдЯ


www:paginate($page, $count, $size)

рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╕реНрдерд┐рд░ рдкреЗрдЬрд┐рдиреЗрдЯрд░ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
$page рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рд╣реИред
$count рдкреГрд╖реНрдареЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рд╣реИред
$size - рдкреЗрдЬрд┐рдиреЗрдЯрд░ рдХрд╛ рдЖрдХрд╛рд░ред
рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рдХреЛ current рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╣рд▓реЗ рдкреГрд╖реНрда рдкрд░ рдХреЛрдИ <previous /> рдиреЛрдб рдирд╣реАрдВ рд╣реЛрдЧрд╛, <next /> рдкрд┐рдЫрд▓реЗ рдкреГрд╖реНрда рдкрд░ <next /> рдиреЛрдб рд╣реЛрдЧрд╛ред

www:paginate(15, 85, 10) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ XML рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛:
 <pages> <previous>14</previous> <page>10</page> <page>11</page> <page>12</page> <page>13</page> <page>14</page> <page current="current">15</page> <page>16</page> <page>17</page> <page>18</page> <page>19</page> <next>16</next> </pages> 

рд▓реЗрдЖрдЙрдЯ рдЙрджрд╛рд╣рд░рдг:
 <xsl:template match="/"> <xsl:apply-templates select="www:paginate(15, 85, 10)/pages/*" /> </xsl:template> <xsl:template match="previous"> <a href="/page/{.}/" class="page">тЖР Previous</a> </xsl:template> <xsl:template match="next"> <a href="/page/{.}/" class="page">Next тЖТ</a> </xsl:template> <xsl:template match="page[@current]"> <span class="page current"><xsl:value-of select="." /></span> </xsl:template> <xsl:template match="page"> <a href="/page/{.}/" class="page"><xsl:value-of select="." /></a> </xsl:template> 

рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рдгрд╛рдо:
рдЫрд╡рд┐


рдХреИрд╢рд┐рдВрдЧ рдмреНрд▓реЙрдХ рдХрд░реЗрдВ


рдЕрдм XSL рдПрдХреНрд╕рдЯреЗрдВрд╢рди www:xslt рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХреИрд╢реНрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖рддрд╛ cache="true" ред cache-args рдФрд░ cache-lifetime рджреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рднреА рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рдЖрдкрдХреЛ рдХреИрд╢реНрдб рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдФрд░ рджреВрд╕рд░рд╛ рдХреИрд╢реНрдб рдбреЗрдЯрд╛ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 <www:xslt xsl="/books.xsl" xml="book:list(author_id -> {$author_id})" args="page -> {$page}, count -> 10" cache="true" cache-args="domain -> '{$domain}'" cache-lifetime="600" /> 


XQuery


рдИрдЬрд╝реАрд╡реЗрдм рдореЗрдВ XQuery рд╕рдорд░реНрдерди рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдгред рдлрд┐рд▓рд╣рд╛рд▓, рдЗрд╕рдХреА рдХреНрд╖рдорддрд╛рдПрдВ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реИрдВ: рдЖрдк рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк XSL- рдФрд░ XPath- рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдИрдЬрд╝реАрд╡реЗрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ PHP рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ XQuery рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдмреБрджреНрдзрд┐рдорд╛рди рд╕рд▓рд╛рд╣ рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдпрд╣ рд╕реБрдирдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреА: habrahabr.ru/qa/31087

рдлрд┐рд▓рд╣рд╛рд▓, XQuery рдХреЛ XQuery рд▓рд╛рдЗрдЯ ( http://phpxmlclasses.sourceforge.net/xquery_lite.html ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ 2002 рдореЗрдВ рдЗрд╕рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рд╡рд╛рдкрд╕ рдмрдирд╛рдпрд╛ рдФрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдерд╛ред XQuery рд▓рд╛рдЗрдЯ рдХреЛ Easyweb рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЗрд╕реЗ PHP5 рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ред

XQuery рд╕рдорд░реНрдерди рдЕрдм XSL рдПрдХреНрд╕рдЯреЗрдВрд╢рди www:xquery рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ:
 <div> <h1>External Resources</h1> <www:xquery src="/tpl/links.xq" /> </div> 


рдХрд╕реНрдЯрдо XSL рдПрдХреНрд╕рдЯреЗрдВрд╢рди


рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЬрди рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ XSL рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдирд╛рдорд╕реНрдерд╛рди рдФрд░ рд╕рд╛рде рд╣реА рдЗрд╕рдХреЗ рдпреВрдЖрд░рдЖрдИ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред XSL рдкреЗрдЬ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рднреА рдпрд╣реА рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдПрдХ XSL рдПрдХреНрд╕рдЯреЗрдВрд╢рди рджрд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдХреБрдЫ рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рд░реНрдХрдЕрдк) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
 $www = www::create('en', 'us'); $www->register_xsl('http://supermarkup.com/about', 'sm', 'block', function($node) { $xml = new xml(); foreach($node->children() as $child) { $xml->append($xml->import($child)); } foreach($xml->query('//text()') as $text) { $parent = $text->parent(); $parent->append(supermarkup($text->value())); $parent->remove($text); } return $xml; }); 

рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ:
 <?xml version="1.0" encoding="utf-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" xmlns:www="https://github.com/nyan-cat/easyweb" xmlns:sm="http://supermarkup.com/about" exclude-result-prefixes="php www sm"> <xsl:template match="/"> <sm:block> <xsl:copy-of select="message" /> </sm:block> </xsl:template> </xsl:stylesheet> 

рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдИрдЬрд╝реАрд╡реЗрдм рдПрдХреНрд╕рдПрдордПрд▓ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХреНрд╕рдПрдордПрд▓ рдиреЛрдб рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИ, рдФрд░ рдПрдХреНрд╕рдПрдордПрд▓ рдиреЛрдб рдпрд╛ рдПрдХреНрд╕рдПрдордПрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬ рдпрд╛ рддреЛ рд░рд┐рдЯрд░реНрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдиреЛрдб рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ред

рдЗрдВрдЬрди рдХреЛрдб рдореЗрдВ рд╕реАрдзреЗ рдЯрд┐рдВрдХрд░рд┐рдВрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╕реНрдЯрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд┐рдЦрдирд╛ рдмреЗрд╣рддрд░ рдХреНрдпреЛрдВ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдИрдЬрд╝реАрд╡реЗрдм рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ (рдпрд╛ рд▓рдЧрднрдЧ рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ) рдХрд┐ рдкрдВрдЬреАрдХрд░рдг рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдВрдбрд▓рд░ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЗрдВрдЯрд░реНрди рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


GeoIP


рдЗрдВрдЬрди рдореЗрдВ рдЬрд┐рдпреЛрдЖрдИрдкреА рд╕рдкреЛрд░реНрдЯ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ PHP PECL GeoIP рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬрд┐рдпреЛрдЖрдИрдкреА рд╕рдкреЛрд░реНрдЯ рдИрдЬрд╝реАрд╡реЗрдм рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯ рдкреНрд░реЛрд╕реЗрд╕ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рдЗрдЯ рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдЬрд┐рдпреЛрдЖрдИрдкреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╡рд┐рд╡рд░рдг рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 <procedure name="geoip:record" datasource="geoip" method="record" root="record"> <param name="host" type="string" /> </procedure> 

рдЕрдм рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣реАрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдИрдЬрд╝реАрд╡реЗрдм рдЕрдореВрд░реНрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдПрдХ рдкреГрд╖реНрда рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╕рдордп, рдмреНрд▓реЙрдХ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╕рдордп, рдПрдХреНрд╕реЗрд╕ рд╕рд┐рд╕реНрдЯрдо рд╕рдореВрд╣реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп, рдПрдХреНрд╕рдкреАрде рдПрдХреНрд╕рдЯреЗрдВрд╢рди www:query , рдпрд╛ рдкреАрдПрдЪрдкреА рд╕реЗ рдИрдЬрд╝реАрд╡реЗрдм рдХреНрд▓рд╛рд╕ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордпред рдХреЙрд▓ рдЙрджрд╛рд╣рд░рдг:
 $record = $www->query('geoip:record', array ( 'host' => $www->variable('user:ip') )); 

рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рдгрд╛рдо:
 <?xml version="1.0"?> <record> <country> <alpha2>US</alpha2> <alpha3>USA</alpha3> <name>United States</name> </country> <region>NC</region> <city>Charlotte</city> <latitude>35.206001281738</latitude> <longitude>-80.829002380371</longitude> </record> 

рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдЖрдкрдХреЛ рдЬрд┐рдпреЛрдЖрдИрдкреА рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


рдкреВрд░реНрдг рдкрд╛рда рдФрд░ рдкрд╣рд▓реВ рдЦреЛрдЬ


рдкреВрд░реНрдг-рдкрд╛рда рдФрд░ рдкрд╣рд▓реВ рдЦреЛрдЬ рдХрд╛ рдкрд╣рд▓рд╛ рдкрд░реАрдХреНрд╖рдг рд╕рдВрд╕реНрдХрд░рдг рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реИред рдЦреЛрдЬ Apache Solr ( http://lucene.apache.org/solr/ ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛, рд╕рд░реНрд╡рд▓реЗрдЯ рдХрдВрдЯреЗрдирд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреЙрдордХреИрдЯ рдпрд╛ рдЬреЗрдЯреНрдЯреА), рд╕реЛрд▓рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдкреАрдПрдЪрдкреАрдИрд╕реАрдПрд▓ рд╕реЛрд▓рд░рдХреНрд▓рд╛рдЗрдВрдЯ рднреАред CentOS рдкрд░ рд╕реЛрд▓рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдкрд░ рдПрдХ рд╕рд░рд▓ рдФрд░ рд╕реБрд▓рдн рд▓реЗрдЦ: http://blog.nexcess.net/2011/12/30/installing-apache-solr-on-centos/ ред

рдЬреИрд╕рд╛ рдХрд┐ рдЬрд┐рдпреЛрдЖрдИрдкреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реЛрд▓рд░-рд╕рд░реНрдЪ рдЕрдореВрд░реНрдд рдИрдЬрд╝реАрд╡реЗрдм рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рдЗрдВрдЬрди рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рдиреНрдпрд╛рд╕ рдЙрджрд╛рд╣рд░рдг:
 <datasource name="metadata" type="solr" server="localhost" port="8080" url="/solr/" username="admin" password="samplepassword" /> <!-- ... --> <procedure name="guestbook:add" datasource="guestbook" core="guestbook" method="add"> <param name="author_id" type="natural" /> <param name="message" type="author" /> <param name="host" type="ipv4" /> </procedure> <!-- ... --> <procedure name="guestbook:list" datasource="guestbook" core="guestbook" method="query" root="messages" item="message"> *:* </procedure> 

рдЕрдм рддрдХ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕реЛрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдпрд╣ рдордХреНрдЦреА рдкрд░ рдПрдХ рд╕реЛрд▓рд░ рд╕рд░реНрдХрд┐рдЯ рдЬрдирд░реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред


рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕рд▓рд┐рдП, рдЗрдВрдЬрди рдЙрди рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рдХреЛрд░-рд╕реНрддрд░реАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рдирд┐рдпреЛрдЬрд┐рдд рдереЗред рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдореЗрдВ, рдПрд▓рдПрд▓ (1) рдкрд╛рд░реНрд╕рд░реНрд╕, рдПрдХ рдУрдЖрд░рдПрдо рдкреНрд░рдгрд╛рд▓реА рдФрд░ рдкреВрд░реНрдг-рджреНрд╡реИрдз рдЧреНрд░рд╛рд╣рдХ рдФрд░ рд╕рд░реНрд╡рд░ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рд╣реИред

рдЕрдЧрд▓реЗ рд╡рд░реНрд╖ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдЗрдВрдЬрди рдХреЗ рдПрдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рднреА рдИрдЬрд╝реАрд╡реЗрдм рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдмрд┐рдЧ┬о рдХрдорд░реНрд╢рд┐рдпрд▓ ┬й рд╕рд╛рдЗрдЯ тДв рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рдЖрдкрдХреЗ рдлрд╝реАрдЪрд░ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ, рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ, рдФрд░ рдИрдЬрд╝реАрд╡реЗрдм рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╡рд╛рд▓ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреАред

рдирдпрд╛ рд╕рд╛рд▓ рдореБрдмрд╛рд░рдХ рд╣реЛ!

Source: https://habr.com/ru/post/In164397/


All Articles