Masamang mensahe php. Ang mga daemon ay mga pila ng mensahe. Layunin ang maluwag na pagkabit at malakas na pagkabit

Ang PHP ay ang pinakasikat na wika para sa pagsulat ng server-side code. Ang parehong layunin ay maaaring makamit sa maraming paraan: maaari kang magdisenyo ng isang maganda at madaling mapapanatili na sistema, o maaari mong mabilis na pagsamahin ang mga piraso ng code mula sa Stack Overflow nang hindi masyadong nababahala tungkol sa mga bagay tulad ng mga panuntunan sa disenyo at pagiging madaling mabasa ng code.

Siyempre, kahit na hindi ka pa development guru, gugustuhin mo pa ring magsulat ng code na hindi magpapaiyak sa mga tao sa paligid mo. Tutulungan ka ng Tproger - ang artikulong ito ay naglalaman ng 20 mga tip, bawat isa ay makakatulong sa iyong mapabuti ang pagiging madaling mabasa ng iyong code at magpapasalamat sa iyo sa pagsunod sa mga ito. Sa katagalan, ang masigasig na pagsunod sa mga tip na ito ay makatutulong sa iyo na lumapit sa pagiging isang may karanasan, developer na nakatuon sa detalye.

Gamitin

Huwag gamitinat iba pang paraan ng paglalagay ng mga script ng PHP sa isang file. Oo, marahil lahat ay gumagana para sa iyo, ngunit sa ibang server - hindi isang katotohanan. Sa ilang mga server, ang mga maiikling tag ay ganap na hindi pinagana. Huwag makipagsapalaran, gamitin lamang

// Mali// Mali

Paghiwalayin ang mga file na may mga parameter

Walang isang sapat na nakakahimok na dahilan upang bigyang-katwiran ang pag-iimbak ng mga setting sa parehong file bilang script. Palaging lumikha ng isang hiwalay na file at isama ito sa pinakadulo simula ng script. Malalaman mo kung gaano ito kahalaga kapag kailangan mong mag-edit ng isang grupo ng mga file dahil binago mo ang isang setting. Ito ay hindi mahirap sa lahat:

kasama("config.php");

Ang mga komento ay iyong mga kaibigan

Siyempre, kung nagmamadali ka o nag-type ng code sa isang alon ng inspirasyon, kahit papaano ay walang oras para sa mga komento. Ngunit ang code na isinulat nang matagal na panahon ay mahirap maunawaan - kahit na isinulat mo ito. Mas mahusay na tulungan ang iyong sarili sa ilang mga komento sa mga pangunahing lugar, upang sa ibang pagkakataon ay mabawasan mo ang oras na kinakailangan upang maunawaan ang susunod na script.

// Single line comment /** Multiline comment **/

Talagang simple? Ito rin ay nagkakahalaga ng pagbibigay pansin sa PHPDoc.

I-format nang matalino ang iyong code

Wala nang mas masahol pa sa isang malaking pader ng code na malinaw na hindi alam ng may-akda na umiral ang Tab button. Kahit na ang mga komento ay hindi magliligtas sa iyo - ang mga indentasyon ay naimbento upang lohikal na paghiwalayin ang mga fragment ng code sa bawat isa. At ang paggamit o hindi paggamit ng indentation ay maraming sinasabi tungkol sa iyo bilang isang programmer. Ang code na ito ay na-format nang hindi tama:

Function dothisformula($a,$b) ($c = $b+$a; $e=3; habang ($c< 20) { $e = $e - 1; $c = $c + 1; } return $e; }

At narito ang parehong code, ngunit may tamang pag-format:

Function dothisformula($a, $b) ($c = $b + $a; $e = 3; habang ($c< 20) { $e = $e - 1; $c = $c + 1; } return $e; }

Kung gusto mong malaman nang eksakto kung aling paraan upang i-format ang code tama- magbasa ng mga PSR.

Magbigay ng mga variable na makabuluhang pangalan

Siyempre, imposibleng magkaroon ng isang pinagkasunduan sa isyung ito. camelCase o under_score? Kailangan ba ang notasyon ng Hungarian? Isang bagay ang mahalaga dito: magpasya minsan at para sa lahat kung ano ang mas malapit sa iyo. At kahit na gusto mong baguhin ang istilo, mangyaring huwag gawin ito sa gitna ng proyekto! Ang iba't ibang mga pagpipilian sa pagpapangalan ng variable sa parehong proyekto o, mas masahol pa, sa parehong file ay kakila-kilabot. At walang magic number! Huwag maging tamad na gumamit ng mga constants.

Magsimula ng mga Variable

Siyempre, awtomatikong gumagawa ang PHP ng mga variable kapag sinubukan mong i-access ang mga ito. Ngunit hindi mo ba iniisip na ang paggamit ng tampok na ito ay medyo mapanganib? Magandang kasanayan na palaging simulan ang mga variable bago ang unang paggamit. Gagawin nitong mas malinaw ang iyong code at makakatulong na matiyak na hindi mo sinasadyang ma-access ang isang hindi nasimulang variable.

$foo = array(); $bar = 0; $baz = false;

Ang Boolean variable ay false, kung hindi, ito ay totoo

Kung sumusubok ka ng ilang kundisyon at pagkatapos ay iimbak ang resulta ng paghahambing sa isang boolean na halaga, kapag sinisimulan ang isang variable para sa resulta (palagi kaming nagpapasimula ng isang variable nang maaga, tandaan?), italaga muna ito false . Ibig sabihin, hindi mo kailangang gawin ito:

Function getStatus() ($result = true; if ($i != 2) $result = false; return $result; )

Mas mainam na ganito:

Function getStatus() ($result = false; if ($i == 2) $result = true; ibalik $result; )

Bakit ganito? Isipin na sinusuri mo ang data bago i-query ang database. Kung sa ilang kadahilanan ang if block ay biglang nabigo na maisagawa, ang halaga ng variable ay mananatiling mali - sa ganitong paraan mapoprotektahan mo ang iyong sarili mula sa pagpasok sa database na may maling data. Minsan kailangan mong harapin ang sensitibong data sa iyong code, kaya pinakamahusay na ipagpalagay na ang lahat ng data ay mali hanggang sa mapatunayang hindi. Ang panuntunang ito ay halos nakasulat sa dugo.

Sa pamamagitan ng paraan, mas mahusay na suriin kung ang data ang kailangan namin kaysa kung ito ang hindi namin kailangan.

Gumamit ng mga panipi kapag tumutukoy sa mga elemento ng array

Sa code ng iba't ibang developer, makakakita ka ng dalawang opsyon para sa pag-access sa mga elemento ng isang associative array:

$pangalan = $pangalan["marc"]; $pangalan = $pangalan;

Kapag pinapatakbo ang pangalawang opsyon, susubukan muna ng PHP na maghanap ng pare-parehong pinangalanang marc. At kung hindi mahanap ang isa, mako-convert si marc sa isang string at ipapasa sa form na ito. Mas mabuting huwag mo nang isipin kung ano ang maaaring mangyari kung ang ganoong pare-pareho ay biglang umiral... Laging maglagay ng mga quotes para maiwasang mangyari ito.

Gumamit ng mga kuwit upang sumangguni sa maraming linya sa isang tawag

Kung kailangan mo, halimbawa, upang ma-access ang halaga ng isang variable at isang string sa parehong function na tawag, mas mahusay na gumamit ng mga kuwit kaysa sa mga tuldok. Bakit? Ang tuldok ay isang string concatenation operator, ang operasyong ito ay magiging mas mabagal. Patunay .

muli. Ganito dapat:

echo "Hello, my name is ", $name;

Ngunit hindi ito kinakailangan:

echo "Hello, ang pangalan ko ay " . $pangalan;

Gumamit ng mga operator ng ternary

Kung mayroon kang ilang napakasimpleng paghahambing sa iyong code, ipinapayong gamitin ang ternary operator upang hindi mahatak ang simpleng code sa ilang linya. Ito ang hitsura ng iyong simple kung:

Kung ($a == 1) $b = 2; iba pa $b = 3;

Ngunit maaari mong isulat ito tulad nito:

$b = ($a == 1) ? 2:3;

Sa pangkalahatan, gumagana ang ternary operator tulad ng sumusunod:

$variable = ($kondisyon) ? totoo: mali;

Gumamit ng mahigpit na paghahambing upang ihambing sa mga halaga ng boolean

Kung sinusubukan mo ang isang variable para sa true o false, gamitin ang === sa halip na ==, na ginagamit sa iba pang mga paghahambing. Ang isang mahigpit na paghahambing ng tatlong pantay na mga palatandaan ay ihahambing din ang mga uri ng mga variable.

If ($isMember == true) ( ​​​​... ) // Mali kung ($isMember === true) ( ​​​​... ) // Tama

Gumamit ng increment at decrement

Kung kailangan mo lang dagdagan o bawasan ang halaga ng isang variable ng 1, hindi na kailangang isulat ang masalimuot na konstruksiyon na ito:

$number = $number + 1; $number2 = $number2 - 1;

Ang pagpipiliang ito ay mas maikli:

$number++; // Pagdagdag $number2--; // Pagbawas

At ang pangunahing kagandahan ng mga operasyong ito ay na sa parehong oras maaari kang magsagawa ng ilang iba pang aksyon (halimbawa, kung o habang). Depende sa kung -- o ++ ay isinulat bago o pagkatapos ng variable na pangalan mismo, nagbabago ang pagkakasunud-sunod ng mga pagpapatakbo.

// Ang pagtaas ay magaganap pagkatapos ng paghahambing: $number = 10; habang ($number++ == 10) ( ... ) // At dito magaganap ang pagbabawas bago ang paghahambing: $number = 10; kung (--$number == 10) ( ... ) $number = 10; $kabuuan = $number++; // $kabuuan ay magiging katumbas ng 10. $number = 10; $kabuuan = --$numero; // Ang $total ay magiging katumbas ng 9.

Gumamit ng mga operator ng shorthand assignment

Kung ang isang variable ay kailangang dagdagan o bawasan ng isang numero na hindi katumbas ng 1, kung gayon sa kasong ito ang code ay maaaring paikliin. Halimbawa, maaaring ganito ang hitsura ng iyong code:

$a = $a + $b; $a = $a * 5; $a = $a - $d; $a = $a / 3;

At gamit ang mga shorthand operator, ang parehong code ay maaaring isulat tulad nito:

$a += $b; $a *= 5; $a -= $d; $a /= 3;

Sa pamamagitan ng paraan, ito rin ay gumagana sa mga string. Kung kailangan mong magdagdag ng ilang bahagi sa isang umiiral nang linya, gawin itong ganito:

$string = $string . "hello"; $string .= "hello";

Lumikha ng isang hiwalay na function para sa var_dump

Minsan, sa panahon ng aktibong pag-debug, madalas mong kailangang ipakita ang halaga ng isang variable nang direkta sa pahina. Siyempre, mas mahusay na huwag gawin ito muli, ngunit kung kailangan mo pa rin ito, pagkatapos ay makatuwiran na tulungan ang iyong sarili. Maaaring ganito ang hitsura ng function:

Function d($var) ( echo "

"; var_dump($var); echo "
"; }

Ang pre tag ay ginagamit upang gawing mas nababasa ang halaga. Sa pamamagitan ng paraan, tulad ng isang kakaibang pangalan ng function ay hindi ibinigay sa pamamagitan ng pagkakataon - ito ay maikli, bagaman hindi halata. Ang pag-type ng pangalan nito ay magiging mabilis. Tandaan lamang na tanggalin ang function na ito kapag nilinis mo ang code sa pagtatapos ng development.

Ngunit ang pinakamagandang gawin ay kalimutan ang payo na ito at matutunan kung paano gamitin ang XDebug.

Gumamit ng mga constants

Kung mayroon kang isang variable na ang halaga ay hindi dapat baguhin, makatuwiran na gumamit ng isang pare-pareho sa halip. Maaaring gamitin ang mga constant upang mag-imbak ng mga landas, mga mensahe ng error, at iba pa. Ang mga Constant ay dapat na pinangalanan sa mga takip - sa paraang ito ay madaling makilala ang mga ito, at masisiguro mong tinatawagan mo ang kailangan mo.

Define("DIRECTORY", "/path/to/site/"); echo DIRECTORY;

Gamitin ang $_GET at $_POST

Mas mabuting huwag gumamit ng $_REQUEST. Malinaw na paghiwalayin ang data: $_GET ay mga parameter na ipinasa mula sa address bar, $_POST ay, halimbawa, data na natanggap mula sa isang form. At huwag isipin ang tungkol sa pagpasa ng mga password, lalo na ang mga hindi naka-encrypt, sa script gamit ang isang kahilingan sa GET!

$action = $_GET["actions"]; $pangalan = $_POST["pangalan"];

Maaaring manu-manong palitan ng mga gumagamit ang mga halaga sa address bar ng anumang mga di-makatwirang at magdulot sa iyo ng maraming problema.

Gumamit ng mga bagay, hindi mga function

Ang PHP ay, pagkatapos ng lahat, isang object-oriented na wika. Kung nagtatrabaho ka sa isang malaking proyekto, ang daan-daang linya ng functional code ay tiyak na mabilis na magsasawa. At kung kailangan mong mag-imbak ng maraming mga parameter ng parehong uri, pagkatapos ay mas isipin ang tungkol sa paggamit ng naaangkop na klase.

Mga paraan ng tawag sa mga kadena

Kung tatawag ka ng ilang pamamaraan ng isang bagay sa isang hilera, makatuwirang paikliin ang code nang hindi isinusulat ang pangalan ng bagay na ito sa bawat oras. Kung may klase na ganito:

Class User ( function setThis($var) ( .... return $this; ) function setThis2($var2) ( .... return $this; ) )

... pagkatapos ay maaari mong ma-access ang mga pamamaraan nito tulad nito:

$user = bagong User(); $user->setThis(...) ->setThis2(...);

Upang mas maunawaan kung paano ito gumagana at sa ilalim ng anong mga pangyayari maaari mo itong gamitin, basahin.

Huwag mong ulitin

Palaging balutin ang code na ginagamit mo nang higit sa isang beses o dalawang beses sa isang function. Kung hindi mo ito gagawin, ang proyekto ay bumubukol at binubuo ng isang grupo ng mga linya ng parehong uri.

Layunin ang maluwag na pagkabit at malakas na pagkabit

Ang pagsasama ay isang paraan ng pagdidisenyo ng isang proyekto kung saan ang pagpapalit ng isang bahagi ay nangangailangan ng pagbabago ng isa pa. Sa madaling salita, kung babaguhin mo ang isang feature, kailangan mo bang baguhin ang isa pa? Kung mas maluwag ang koneksyon, mas madali itong baguhin ang mga bahagi nang hindi kinakailangang gawing muli ang kalahati ng code.

Ang pagkakaisa ay kapag ang mga indibidwal na bahagi ay magkasamang bumubuo ng isang makabuluhang yunit. Mayroon ka bang isang function o pamamaraan para sa buong proyekto na ginagawa ang lahat ng posible at imposible, o mayroon ka bang maraming mga function o pamamaraan, na ang bawat isa ay gumagawa ng sarili nitong bahagi ng trabaho? Ito ay totoo lalo na para sa OOP. Hatiin ang iyong mga pamamaraan sa sampu at daan-daang linya ay hindi katanggap-tanggap.

Bilang isang bihasang programmer, dapat mong sikaping tiyakin na ang mga bahagi ay may kaunting dependency sa isa't isa at hindi nagsasagawa ng masyadong maraming trabaho. Ang ganitong code ay magiging mas madaling palawakin at mapanatili. Kapag gumagawa ng isang function, isipin kung gaano ito kaginhawa para magamit sa mga proyekto sa hinaharap.

Ang payo na ito ay maaaring ilarawan nang ganito. Kunin natin ang code na ito:

/* Nais naming magdagdag ng dalawang numero lamang kung ang unang numero ay mas mababa sa 5 */ function add($var, $var2) ( if ($var< 5) return false; else $result = $var + $var2; echo "The Result is ", $result; } $var = 3; $var2 = 2; add($var, $var2);

Ang pangunahing kawalan ng function na ito ay sinusuri nito ang data mismo at pagkatapos ay ipinapakita ang halaga sa screen. At ang pag-uugali na ito ay hindi lubos na halata - sasang-ayon ka na malamang na hindi mo kailangan ang gayong pumipili na karagdagan kahit saan pa. Paano kung gusto mo ring baguhin ang output message? Mas mainam na isulat muli ang code na ito tulad nito:

Function add($var, $var2) ( return $var + $var2; ) function result($message) ( return "Ang Resulta ay " . $message; ) $var = 3; $var2 = 2; kung ($var< 5) { echo result(add($var, $var2)); }

Ngayon ang bawat function ay gumagawa lamang ng sarili nitong trabaho: magdagdag ng mga numero, ang resulta ay nagpapakita ng resulta.

Hi sa lahat!

Sa mga nakaraang isyu, natutunan na namin kung paano iproseso nang tama ang parehong mga natanggap na signal. Ngayon ay malapit na tayo sa sandaling ang ating demonyo ay dapat matutong makipag-usap sa ibang mga programa, o sa sarili nito, ngunit sa iba't ibang mga kopya.

Sa unix world, mayroong isang hindi kapani-paniwalang iba't ibang mga paraan upang maipasa ang isang command o mensahe mula sa isang daemon patungo sa isang web script at vice versa. Ngunit ngayon gusto kong pag-usapan lamang ang tungkol sa mga pila ng mensahe - "System V IPC Messages Queues".

Bilang isang bata, dapat ay sinabi na sa iyo ng iyong ina na ang mga pila ay matatagpuan sa parehong pagpapatupad ng System V IPC at sa pagpapatupad ng Posix. Gusto kong hawakan ang paksa lamang ng System V, dahil ito ay malapit sa akin nang personal. At susubukan kong iwasan ang posix na paksa kung maaari.

Kaya simulan na natin. Ang mga pila ay gumagana sa antas ng isang "normal" na operating system, ay naka-imbak sa memorya at kumakatawan sa isang istraktura ng data na naa-access sa lahat ng mga programa ng system. Sa mga pila, tulad ng sa file system, posibleng i-configure ang mga karapatan sa pag-access at laki ng mensahe. Karaniwan ang mensahe sa queue ay nakatakda sa isang maliit na sukat, hindi hihigit sa 8 kilobytes.

Ito ay nagtatapos sa panimulang bahagi, magpatuloy tayo sa pagsasanay.

Nagpapadala ng mga mensahe

queue-send.php

Tumatanggap kami ng mga mensahe

queue-receive.php

Patakbuhin muna natin ang file queue-send.php at pagkatapos queue-receive.php.

U% php queue-send.php magpadala ng 4 na mensahe u% php queue-receive.php type: 1 type: 1, msgtype: 1, message: s:15:"message, type 1"; uri: 1, msgtype: 1, mensahe: s:15: "mensahe, uri 1"; uri: 2 uri: 2, msgtype: 2, mensahe: s:15: "mensahe, uri 2"; uri: 3 uri: 3, msgtype: 3, mensahe: s:15: "mensahe, uri 3";

Makikita mo na ang mga mensahe ay pinagsama-sama, at 2 mensahe ng unang uri ang unang ipinakita, at pagkatapos ay ang lahat ng iba pa.
Kung tinukoy namin na makatanggap ng mga mensahe ng uri 0, matatanggap sana namin ang lahat ng mensahe anuman ang uri.

Habang (msg_receive($queue, $i, $msgtype, 4096, $message, false, MSG_IPC_NOWAIT)) ( // ...

Gayundin, narito ito ay nagkakahalaga ng pagpuna ng isa pang tampok ng pila: kung aalisin namin ang palaging MSG_IPC_NOWAIT, aalisin namin ang mga hindi kinakailangang bagay mula sa script, at patakbuhin ang file sa isang terminal queue-receive.php, at sa isa pa ay pana-panahon naming tatakbo ang file queue-send.php, pagkatapos ay makikita natin kung paano epektibong magagamit ng daemon ang pila sa pamamagitan ng paghihintay ng isang gawain mula dito.

queue-receive-wait.php

Sa totoo lang, nasabi ko na sa iyo ang lahat ng pinakakawili-wiling bagay tungkol sa mga pila. Mayroon ding mga pag-andar para sa pagkuha ng mga istatistika ng pila, pagtanggal at pagsuri para sa pagkakaroon ng isang pila.

Subukan natin ngayon na magsulat ng isang daemon na nakikinig sa isang pila:
queue-daemon.php

    Upang maging makasarili, upang maging makasarili, upang maging makasarili, upang maging walang kakayahan. (kolokyal). Upang kumilos nang di-makatwiran, upang kumilos nang arbitraryo. Ang paliwanag na diksyunaryo ni Ushakov. D.N. Ushakov. 1935 1940 ... Ushakov's Explanatory Dictionary

    MAGING MAKASARILI, oh, oh; hindi perpekto (kolokyal). Kumilos nang arbitraryo. Ang paliwanag na diksyunaryo ni Ozhegov. S.I. Ozhegov, N.Yu. Shvedova. 1949 1992 … Ozhegov's Explanatory Dictionary

    Nesov. nepereh. pagkabulok Gawin ang gusto mo, ayon sa iyong kapritso. Ephraim's explanatory dictionary. T. F. Efremova. 2000... Modernong paliwanag na diksyunaryo ng wikang Ruso ni Efremova

    Kusang loob, kusang loob, kusang loob, kusang loob, kusang loob, kusang loob, kusang loob, kusang loob, kusa sa sarili, kusang loob, kusa sa sarili, kusa sa sarili. kusa, kusang loob, kusang loob, ... ... Mga anyo ng salita

    kumilos nang walang pahintulot- upang maging mapanlinlang, ay, ay... Diksyonaryo ng spelling ng Ruso

    kumilos nang walang pahintulot- (Ako), tinatamad ako, umiinom ako ng tsaa, umiinom ako ng tsaa... Diksyunaryo ng pagbabaybay ng wikang Ruso

    Ayu, ay; nsv. Razg. Upang kumilos ayon sa gusto mo, sa iyong sariling kapritso, nang hindi humihingi ng pahintulot mula sa sinuman. S. pagbisita. S. sa trabaho. Gawin ang iyong sariling bagay sa bahay. ◁ Kusang-loob, I; Wed Walang self-will, please, kung hindi ay tatanggalin kita! ... Encyclopedic Dictionary

    kumilos nang walang pahintulot- ay, ay; nsv.; pagkabulok tingnan din sariling kalooban Upang kumilos ayon sa sariling kagustuhan, sa sariling kapritso, nang hindi humihingi ng pahintulot sa sinuman. Samovo / katamaran sa isang party. Samovo/tamad sa trabaho. Gawin mo ang sarili mong bagay sa bahay... Diksyunaryo ng maraming expression

Matagal ko nang gustong sumubok ng bago, at kaya, nang sa trabaho ako ay inalok na magsulat ng mga halimbawa ng paggamit ng Yandex.Money API sa iba't ibang wika, malugod kong tinanggap ang alok na ito ng hamon. Dahil ang ganitong functionality ay kadalasang ginagamit sa mga application sa iba't ibang hosting site, isang malakas na desisyon ang ginawa upang subukan munang isulat ito sa PHP. Bukod dito, hindi ko pa nakita ang API dati; Bukod dito, wala akong anumang karanasan sa pagtatrabaho sa PHP, maliban sa gawaing laboratoryo sa isang unibersidad. Nangako ang kaso na magiging kawili-wili.

Pagpili ng kapaligiran

Ang unang bagay na nakatagpo ko ay ang pagbuo at pag-deploy kaagad sa pagho-host ay hindi masyadong maginhawa. At nagpasya akong mag-download ng ilang gentleman's kit para sa isang web developer. Mula sa aking mga araw ng pag-aaral, ang pangalang Denwer ay bumabalot sa aking alaala. Sinubukan ko ito, ngunit mabilis itong iniwan. Nabubuhay ito ng sarili nitong buhay, at nang sinubukan kong i-configure ito sa pamamagitan ng muling pagsusulat ng isang bagay sa Apache conf file, na-overwrote nito o hindi ito na-overwrite sa sarili nitong paghuhusga, na hindi pinapayagan akong i-configure nang manu-mano ang lahat. Ibig sabihin, hindi pala ako ang nagtakda nito, kundi siya ang nagtakda nito para sa akin. Pinaalalahanan ako ng "kung mayroon akong kabayo, ito ang magiging numero...". Sa huli, siyempre, natalo ko siya, ngunit sa parehong oras ay nagpasya akong maghanap ng isang mas simpleng WAMP-server. Gusto kong tandaan na ang Denwer ay isang magandang produkto at wala akong laban dito, ngunit hindi ko nais na basahin ang mga katotohanan at mga manwal tungkol dito.

Nakakita ako ng isang pahina na may listahan ng mga WAMP sa wiki at nagsimulang ayusin ang mga ito Ang pangunahing pamantayan para sa pagpili ay suporta sa proyekto, na ang bersyon ng build ay mas napapanahon, at kadalian ng pag-install/pagtakbo bilang isang resulta, maaari kong kumpiyansa na inirerekumenda ang The Uniform Server Hindi ito nangangailangan ng pag-install (i-unpack lang ang archive), sa pagsisimula ay nakabitin ito sa tray at nagsisimula sa isang light click =).

OAuth Authentication

Binasa ko ang mga tagubilin, na-download ang dokumentasyon, hinugot ang aking espada at sumugod sa labanan. Ngunit sa labanan ay mabilis akong natalo sa pamamagitan ng pagpapatunay ng OAuth. Ang OAuth ay isang paraan upang makakuha ng access sa anumang service/user account nang hindi inilalagay at iniimbak ang kanyang login at password sa iyong application. Dumating ito sa amin mula sa lumikha ng Twitter at ganito ang hitsura: humihiling kami sa serbisyo (sa aming kaso, sa Yandex.Money), ipinasok ng user ang kanyang username/password sa server ng Yandex.Money at ibibigay ang aming pahintulot ng aplikasyon na gamitin ang kanyang account. Pagkatapos nito, nagre-redirect ang server ng Yandex.Money sa aming aplikasyon, at nakatanggap kami ng pansamantalang code, na ang buhay ay napakaikli. Pagkatapos, sa pamamagitan ng isa pang kahilingan sa Yandex.Money, binago namin ang pansamantalang code na ito sa isang permanenteng token ng user at pagkatapos ay para sa amin, tulad ng para sa demobilization, ang lahat ng mga kalsada ay bukas.

Gayunpaman, habang dumadaan ako sa pagpapatotoo ng OAuth, may nakita akong problema sa seguridad. Sinubukan kong makipag-ugnayan sa server ng Yandex.Money, ngunit nagsimulang magmura ang PHP at may sinasabi tungkol sa mga sertipiko. Nagsaliksik ako ng kaunti sa Internet at napagtanto na kailangan namin ang aming aplikasyon upang suriin ang SSL certificate ng server. Gusto kong gumawa ng magandang trabaho para magarantiya ang kaligtasan ng user, kaya ipinagpatuloy ko ang aking paghahanap. Ngunit halos walang matino na mga halimbawa ng pagpapatupad ng pag-verify ng sertipiko ng server sa RuNet. Sasabihin ko sa iyo sa pagkakasunud-sunod.

Una, kailangan naming suriin ang mga sertipiko sa code kapag nagpapadala ng mga kahilingan. Paano ko makukuha ang cURL na ginagamit ko para magpadala ng mga kahilingan na may pag-verify ng certificate? Nagsimula akong maghanap at namangha na ang pinakasikat na payo para sa mga error sa certificate ay: I-disable ang pag-verify. At ito ay inaalok sa isang grupo ng mga site at forum (halimbawa,). Kakila-kilabot, sa pangkalahatan. Narito ang code na kadalasang iminumungkahi:

Curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

Tandaan ito, mga anak, at huwag na huwag itong isulat. "Ngayon, anak, ulitin natin ang lahat ng masasamang salita na dapat mong kalimutan." Salamat sa Diyos na hindi lahat ay napakasama sa English-language na Internet at nakakita ako ng link na nagpapaliwanag ng lahat. Ginawa ko ang nakasulat doon, at lahat ay gumana.

Pagkatapos ay kailangan mong i-save ang Yandex.Money public certificate sa iyong sarili upang mayroon kang maihahambing kapag nagpapadala ng mga kahilingan. Hindi ako mukhang ganap na may kapansanan, ngunit gayunpaman ay tila mahirap para sa akin. Marahil ay makakatulong ito sa iyo sa hinaharap kapag nagtatrabaho sa SSL. Pumunta kami sa nais na site sa pamamagitan ng https, mag-click sa mga sertipiko at i-export. Ngunit mayroong 3 sa kanila, alin ang kailangan? “Kumuha ng pie mula sa istante; Dalawa sila, dun sa gitna." Lumalabas na kailangan mong i-export ang sertipiko ng awtoridad ng sertipikasyon (root) at intermediate (Yandex). Ang pangwakas na sertipiko ay nagbabago isang beses sa isang taon, at kung ipasok natin ito sa kadena at kalimutang baguhin ito kapag ito ay naging masama, kung gayon ang lahat sa ating aplikasyon ay masisira. Samakatuwid, ine-export lang namin ang tinukoy na 2 certificate at i-save lang ang mga ito sa isang text file (screenshot). Sa library ko siya lumalabas bilang ym.crt.

Pagkatapos nito, nagsimulang gumana ang mga kahilingan para sa akin. Hooray! Ang sumunod na nangyari ay isang bagay sa pamamaraan. Ang lahat ay malinaw sa dokumentasyon; sa katunayan, kaya ko talaga itong kinopya sa dokumentasyon ng code. Magpapareserba din ako na isinulat ko ito bilang isang bagay; sa aking opinyon, ang pagtatrabaho sa mga bagay ay mabuti at maginhawa.

Pag-encrypt

Nagkaroon din ng ilang maliliit na problema sa pag-encrypt. Una, ang pag-save/pag-restore ng mga token ng user ay ipinatupad gamit ang karaniwang PHP library na Mcrypt. Ngunit, tulad ng nangyari, may mga problema dito. Halimbawa, mula sa mga halimbawang kinuha sa manual, isang hindi na ginagamit na function lang ang agad na gumana. Ang natitirang mga pag-andar ay walang pakialam sa aking pagnanais na gawin ang mga ito, at may sinabi lamang tungkol sa hindi matagumpay na pagsisimula ng module. Kinailangan naming malaman ito. Pagkatapos ay lumabas na ang mga hoster ay hindi masyadong mahilig sa library na ito. Tinanong ko ang suporta ng aking hoster kung bakit walang Mcrypt module kapag gumagawa ng site sa PHP 5.3. Sinagot nila ako (sa literal): "Ito ay may buggy sa 5.2 sa loob ng maraming taon - hindi nila ito awtomatikong idinagdag sa 5.3 bilang isang module na naaalala minsan bawat limang taon, ngunit may mga problema dito." Wala akong nakitang iba pang maginhawang karaniwang mga aklatan na nagpapatupad ng simetriko na pag-encrypt sa PHP (mayroong OpenSSL library, ngunit hindi talaga para dito). Pagkatapos nito, nagpasya akong baguhin ang encryption library sa , na bukas at sumusuporta sa sikat na AES algorithm. Ito ay gumana kaagad at walang mga problema.

Pag-andar at mga halimbawa ng paggamit

Gayundin, para sa "pagsasanay sa mga pusa", o sa halip na pagsubok at pag-debug, ang mga tawag sa mga function ng library ay isinulat, na pagkatapos ay pinino ko ng isang layout na nakalulugod sa mata, na puno ng mga komento at tinawag na mga halimbawa ng paggamit ng library.

Bilang resulta, ipinatupad ang mga tawag sa mga sumusunod na function ng Yandex.Money API: impormasyon ng account, kasaysayan ng transaksyon, detalyadong impormasyon sa mga transaksyon, paglilipat ng pera sa ibang mga user. Mga kalamangan at kakayahan:

  • OAuth user authorization;
  • seguridad sa pagpapatakbo (sinusuportahan ang pag-verify ng chain ng sertipiko);
  • kadalian ng paggamit (ang mga tugon ng server ay ipinakita sa anyo ng mga bagay) at mabilis na pagsisimula;
  • isang medyo secure at simpleng solusyon para sa pag-iimbak ng mga token ng user gamit ang encryption at nang hindi gumagamit ng database. Madali mong maisusulat muli ang pagpapatupad ng solusyon na ito para sa iyong mga imbakan.
Ang library mismo ay isang certificate chain file ym.crt at file ym.php na naglalaman ng:
  • Interface ng software ng IYandexMoney;
  • pangunahing klase YandexMoney (pagpapatupad ng interface);
  • klase ng enumeration na may mga karapatan sa pag-access (saklaw);
  • mga auxiliary class (mga bagay na tumutugon para sa pag-output ng mga resulta ng mga kahilingan sa API).
Kasama sa library kit ang 2 file na nagpapatupad ng encryption: Rijndael.php at AES.php. Ang mga file na ito ay kinuha mula sa library. Kailangan ang mga ito kung sakaling gumamit ka ng token saving at recovery method.
Pansin: gumagamit ng PHP bersyon 5, pati na rin ang karaniwang cUrl library para sa mga kahilingan sa http.

Para sa mga hindi mag-i-install at manood ng mga detalyadong halimbawa, magpapakita kami ng ilang mga tawag.
Upang maisagawa ang mga pagpapatakbo ng account sa pamamagitan ng API, dapat kang kumuha ng pahintulot ng user, iyon ay, isang token. Maaari itong makuha sa pamamagitan ng mga sumusunod na tawag (halimbawa, na may access upang tingnan ang impormasyon tungkol sa account at kasaysayan ng transaksyon):

YandexMoney::authorize(Consts::CLIENT_ID, "account-info operation-history", Consts::REDIRECT_URL); // pagkatapos, sa pahina ng pag-redirect, simulan ang paglikha ng isang bagay at pagtanggap ng isang token $ym = bagong YandexMoney(Consts::CLIENT_ID, Consts::CERTIFICATE_CHAIN_PATH); $token = $ym->receiveOAuthToken($_GET["code"], Consts::REDIRECT_URL);
Kapag nalikha ang bagay na $ym, ipinapasa nito ang application ID at ang absolute path sa server patungo sa chain ng certificate (ang ym.crt file). Parehong karaniwang nakasulat sa mga constant sa ilang module (consts.php sa aming mga halimbawa).
Well, ipapakita namin sa iyo kung paano makakuha ng impormasyon tungkol sa account ng isang user. Sa parehong paraan, lumikha kami ng isang bagay at pagkatapos ay tinawag ang pamamaraan, na ipinapasa ito sa token ng gumagamit:

$ym = bagong YandexMoney(Consts::CLIENT_ID, Consts::CERTIFICATE_CHAIN_PATH); $accountInfoResponse = $ym->accountInfo($token); echo "Numero ng account: " . $accountInfoResponse->getAccount() . "\n"; echo "Balanse: " . $accountInfoResponse->getBalance() . "\n"; echo "Code ng pera: " . $accountInfoResponse->getCurrency() . "\n";
Natanggap ang impormasyon ng account.

Ang sitwasyon ay halos pareho sa iba pang mga hamon.

Bilang resulta, nagpasya silang tawagan ang library ng malaking pangalan na SDK at ilagay ito