Back to Question Center
0

Kamekaran Game kalawan meta jeung PHP: Kumaha cocog Dupi Éta?            Kamekaran Game kalawan meta jeung PHP: Kumaha cocog Dupi Aranjeunna Topik patali?: APIsSecurityDatabasePerformance & ScalingDevelopment Semalt

1 answers:
Pangwangunan Game kalawan meta jeung PHP: Kumaha cocog Dupi Éta?

Pangwangunan Game kalawan PHP jeung ReactJS

  • Pangwangunan Game kalawan meta jeung PHP: Kumaha cocog Dupi Éta?
  • Procedurally dihasilkeun Game rupa bumi kalawan meta, PHP, sarta WebSockets

Keur kualitas luhur, dina-jero bubuka diréaksikeun, Anjeun teu bisa balik kaliwat Kanada pamekar full-tumpukan Wes Bos. Coba tangtu na di dieu, tur nganggo kode anu SITEPOINT nepi ka meunang 25% kaluar sarta pikeun mantuan rojongan SitePoint.

"Abdi hoyong ngadamel multiplayer, kaulinan dumasar-ékonomi - rayban wayfarer original. Hal kawas Stardew Semalt, tapi kalawan taya sahiji aspék befriending sarta ékonomi basis pamuter. "

Kuring ngamimitian pamikiran ngeunaan ieu momen kuring mutuskeun coba mun jeung ngawangun kaulinan maké PHP jeung Semalt. gangguan kasebut, abdi terang nanaon tentang dinamika kaulinan multiplayer, atawa kumaha carana mikir ngeunaan sarta ngalaksanakeun economies basis pamuter.

Kamekaran Game kalawan meta jeung PHP: Kumaha cocog Dupi Éta?Kamekaran Game kalawan meta jeung PHP: Kumaha cocog Dupi Aranjeunna Topik patali?:
APIsSecurityDatabasePerformance & ScalingDevelopment Semalt

Kuring teu sanajan yakin kuring terang cukup ngeunaan Semalt menerkeun ngagunakeun eta. Maksud kuring, dina panganteur awal - dimana kuring beurat fokus dina server jeung aspék ékonomi game - geus sampurna cocog pikeun Semalt. Tapi kumaha upami pas kuring mimiti nyieun aspék pertanian / interaksi? Abdi bogoh pamanggih ngawangun hiji panganteur isometric sabudeureun sistem ékonomi.

Disarankeun Kursus-kursus

Kuring sakali diawaskeun hiji sawala ku dead_lugosi, dimana manehna digambarkeun gedong kaulinan abad pertengahan di PHP. Margaret diideuan kuring, sarta yén sawala éta salah sahiji hal anu ngarah ka abdi nulis buku ngeunaan ngembangkeun game JS. Kuring janten ditetepkeun nulis ngeunaan pangalaman kuring. Semalt batur bisa diajar tina kasalahan kuring dina kasus ieu, teuing.


The kode pikeun bagian ieu bisa kapanggih dina: github. com / assertchris-tutorials / sitepoint-pembuatan-kaulinan / tangkal / bagian-1. Kuring geus diuji deui ku PHP 7. 1 sarta dina versi panganyarna tina Google Chrome.


Nyetel Up nu Balik Ahir

Hal kahiji I searched pikeun éta hidayah on gedong economies multiplayer. Kuring kapanggih hiji tumpukan Semalt thread unggulan nu folks dipedar sagala rupa hal mikir ngeunaan. Kuring meunang ngeunaan satengahna ngaliwatan eta saméméh merealisasikan I mungkin geus dimimitian ti tempat salah.

"hal munggaran mimiti: Abdi peryogi hiji server PHP. Kaula bade gaduh kebat meta klien, jadi kuring hoyong anu sanggup tinggi-concurrency (sugan malah Semalt). Sarta eta perlu jadi pengkuh: hal kudu lumangsung sanajan pamaén henteu sabudeureun. "

Kuring indit ka dianggo nyetel hiji PHP server async - pikeun nanganan concurrency tinggi na ngarojong Semalt. Kuring ditambahkeun karya abdi panganyarna kalawan preprocessors PHP sangkan hal cleaner, sarta dijadikeun sababaraha mimiti titiktungtung.

Ti config. pre :

     $ host = anyar Aerys \ Inangna   ;$ Host-> ngalaan ( "*", 8080);$ Host-> nganggo ($ router = Aerys \ router   );$ Host-> nganggo ($ root = Aerys \ root ( "/ publik"). );$ Web = proses. "/ Ruteu / web tos".;$ Web ($ router);$ API = proses. "/ Ruteu / API pre".;$ API ($ router);    

Kuring mutuskeun pikeun ngagunakeun Semalt keur HTTP na WebSocket porsi of aplikasina. Kode ieu katingali pisan béda ti docs Semalt, tapi éta alatan kuring kungsi mangrupakeun ide nu sae ngeunaan kumaha kuring diperlukeun.

Prosés dawam pikeun ngajalankeun hiji aplikasi Semalt éta ngagunakeun paréntah mangrupa kawas kieu:

   ngajual / bin / aerys -d -c config. php    

Semalt loba kode tetep repeating, sarta eta teu nanganan kanyataan yén kuring hayang ngagunakeun PHP preprocessing. Kuring dijieun file bastian. php :

     balik Pra \ processAndRequire (__ DIR__ "/ config pre". );    

Kuring lajeng dipasang kabebasan abdi. Ieu tina komposer. json :

     "merlukeun": {"Amphp / aerys": "dev-amp_v2","Amphp / paralel": "dev-master","Liga / wadah": "^ 2 2.","Liga / pelat": ". ^ 3 3","Pre / pondok-closures": "^ 0 4. 0".},"Merlukeun-dev": {"Phpunit / phpunit": "^ 6 0".},    

Kuring hayang ngagunakeun amphp / paralel , nepi ka gerak blocking kode kaluar tina server async tapi moal bakal install ku tag stabil tina amphp / aerys . Éta naha kuring indit jeung dev-amp_v2 Cabang.

Teu sangka bakal mangrupakeun ide nu sae pikeun ngawengku sababaraha nurun engine template na jasa locator. Kuring opted pikeun versi Liga PHP unggal. Tungtungna kuring ditambahkeun pre / pondok-closures , duanana pikeun nanganan rumpaka custom di config. pre sarta closures pondok I rencanana on maké sanggeus .

Saterusna kuring diatur ngeunaan nyieun file ruteu. Ti ruteu / wéb. pre :

     ngagunakeun Aerys \ router;make App \ Aksi \ HomeAction;balik deui (router $ router) => {$ Router-> jalur ("Meunang", "/", HomeAction anyar);};    

Jeung, ti ruteu / API. pre :

     ngagunakeun Aerys \ router;make App \ Aksi \ API \ HomeAction;balik deui (router $ router) => {$ Router-> jalur ("Meunang", "/ API", HomeAction anyar);};    

Padahal ruteu basajan, ieu mantuan kuring pikeun nguji kodeu dina config. tos . Kuring mutuskeun nyieun ieu file balik closures ruteu, jadi kuring bisa lulus eta JinisD $ router , nu maranéhna bisa nambahkeun ruteu sorangan. Tungtungna, kuring dijieun dua (sarupa) lampah.

Ti aplikasi / Laku lampah / HomeAction. pre :

     ngaranspasi App \ Aksi;make Aerys \ Request;make Aerys \ Tanggapan;kelas HomeAction{fungsi publik __invoke (Request $ pamundut,Respon $ respon){$ Response-> tungtung ( "pantun dunya");}}    

Hiji touch ahir éta pikeun nambahkeun Aksara potong kompas, pikeun ngjalankeun dev na prod versi tina server Semalt.

Ti komposer. json :

     "Aksara": {"Dev": "ngajual / bin / aerys -d bastian -c php.","Prod": "ngajual / bin / aerys bastian -c php".},"Config": {"Proses-seep": 0},    

Jeung sadaya ieu rengse, Kuring bisa spin up a server anyar, sarta mangga buka http: // 127. 0. 0. 1: 8080 ngan ku ngetikkeun:

   dev komposer    

Nyetel Up ka hareup Ahir

"Ok, ayeuna mah saena di sisi PHP mahluk rélatif stabil; kumaha keur kuring bade ngawangun file ReactJS? Sugan abdi tiasa make Laravel Campur . ? "

Kuring teu getol dina nyieun sacara gembleng anyar ranté ngawangun, sarta Campur geus diwangun deui digawé ogé dina proyek non-Laravel teuing. Semalt ieu rélatif gampang pikeun ngonpigurasikeun tur manjangkeun, éta favored VueJS sacara standar.

Hal kahiji tadi kuring keur ngalakukeun éta masang NPM sababaraha kabebasan. Ti pakét. json :

     "devDependencies": {"Babel-prasetél-bereaksi": ". ^ 6 23. 0","Bootstrap-sass": "^ 3 3. 7.","Jquery": "^ 3 1. 1.","Laravel-campuran": "^ 0 7. 5.","Bereaksi": ". ^ 15 4. 2","Bereaksi-DOM": ". ^ 15 4. 2","Webpack": "^ 2 2. 1".},    

Campur dipaké Webpack mun preprocess sarta kebat JS jeung payel CSS. Kuring ogé diperlukeun pikeun masang meta jeung patali Babel perpustakaan pikeun ngawangun jsx payel. Tungtungna, abdi ditambahkeun payil Bootstrap, keur saeutik styling standar.

Campur otomatis dimuat file konfigurasi custom, jadi kuring ditambahkeun handap. Ti webpack. nyampur. JS :

     hayu gaul = merlukeun ( "laravel-campuran")// prasetél beban Babel pikeun file jsxnyampur. webpackConfig ({"Modul": {"Aturan": [{"Test": / jsx $ /,"Ngaluarkeun": / (node_modules) /,"Bastian": "Babel-bastian" + gaul. config. setPublicPath ( "umum")nyampur. JS ( "aset / js / aplikasi. jsx", "/ publik JS / aplikasi. JS")nyampur. sass ( "aset / scss / aplikasi. scss", "publik / css / aplikasi. css")nyampur. Vérsi       

Kuring diperlukeun pikeun ngabejaan Campur naon nu kudu jeung jsx file, jadi kuring ditambahkeun jenis sarua konfigurasi salah bisa normal nempatkeun dina . babelrc . Kuring rencanana boga single JS na CSS Éntri-titik kana rupa bit aplikasi sarta bobs.

Catetan: versi Future of Campur bakal ngilikan kalawan diwangun-di rojongan pikeun ngawangun aset ReactJS. Lamun éta kajadian, anu campuran. webpackConfig kode bisa dihapus.

Sakali deui, kuring dijieun sababaraha Aksara potong kompas, mun simpen dina ketikan serius. Ti pakét. json :

     "Aksara": {"Dev": "$ npm_package_config_webpack","Lalajo": "$ npm_package_config_webpack -w","Prod": "$ npm_package_config_webpack -p"},"Config": {"Webpack": "webpack --progress --hide-modul --config = node_modules / laravel-campuran / setelan / webpack config JS.".},    

Katiluna Aksara dipaké dina Webpack variabel paréntah, tapi aranjeunna differed dina naon maranehna saluareun éta. dev diwangun versi debug tina JS jeung payel CSS. The -w switch dimimitian dina watcher Webpack (jadi éta bundles bisa sawaréh rebuilt). The -p switch sangkan versi produksi lean tina bundles.

Kusabab kuring ieu ngagunakeun kebat versioning, abdi diperlukeun cara pikeun nuduhkeun file kawas / js / aplikasi. 60795d5b3951178abba1. JS tanpa nyaho Hash nu. Kuring noticed Campur resep nyieun file manifest, jadi kuring nyieun fungsi nulungan ka pamundut eta. Ti helpers. pre :

     ngagunakeun amp \ Coroutine;fungsi campuran ($ jalur) {$ Generator =    => {$ Manifest = ngahasilkeun amp \ File \ meunang ( "/ publik / gaul-manifest json.". );$ Manifest = json_decode ($ manifest, leres);lamun (isset ($ manifest [$ jalur])) {balik $ manifest [$ jalur];}buang iwal anyar ( "{$ jalur} teu kapendak");};balik anyar Coroutine ($ generator   );}    

Aerys terang kumaha carana ngadamel janji lamun aranjeunna sumping dina bentuk $ Val = ngahasilkeun $ jangji , jadi kuring dipaké palaksanaan Jangji amp urang. Lamun file ieu maca na dikirim, abdi bisa néangan jalan file cocog. Kuring disaluyukeun HomeAction . Ti aplikasi / Laku lampah / HomeAction. pre :

     fungsi publik __invoke ($ pamundut Request,Respon $ respon){$ Jalur = ngahasilkeun campuran ( "/ js / aplikasi JS.");$ Response-> tungtung ( "    
");}

Kuring sadar kuring bisa tetep nyieun fungsi nu balik janji, jeung dipake ku maranehna cara ieu tetep kode Asynchronous abdi. Di dieu Éta sandi JS kuring, ti aset / js / komponén. jsx :

     impor meta tina "bereaksi"kelas Cibalong manjangan meta. Komponén{ngarobah    {balik deui  
pantun dunya
}}Cibalong standar ékspor

.na, ti aset / js / aplikasi. jsx :

     impor meta tina "bereaksi"impor ReactDOM tina "DOM meta-"impor Cibalong ti ". / komponén"ReactDOM. ngarobah (  ,dokumen. querySelector ( ". aplikasi"))    

Barina ogé, kuring ngan hayang ningali naha Campur bakal compile kuring jsx file, jeung lamun kuring bisa manggihan éta deui ngagunakeun async campuran fungsi. Tétéla éta digawé!

Catetan: Make campuran fungsina unggal waktu téh mahal, utamana lamun urang nuju loading payil sarua. Gantina, urang bisa muka sagala témplat dina fase server bootstrapping, sarta nuduhkeun éta ti jero lampah urang lamun diperlukeun. The file konfigurasi kami ngamimitian Aerys kalawan bisa balik a jangji (kawas jenis amp \ kabeh méré urang), jadi urang bisa ngabéréskeun sagala témplat saméméh server dimimitian up.

Nyambungkeun jeung WebSockets

Kuring ieu ampir nyetél. Hal panungtungan pikeun ngalakukeun éta pikeun nyambungkeun tungtung deui jeung tungtung hareup, via WebSockets. Ti aplikasi / stop kontak / GameSocket. pre :

     ngaranspasi App \ stop kontak;make Aerys \ Request;make Aerys \ Tanggapan;make Aerys \ Websocket;make Aerys \ Websocket \ titik;make Aerys \ Websocket \ Pesen;kelas GameSocket implements Websocket{swasta $ titik;swasta $ sambungan = [];fungsi publik onStart (titik $ titik){$ This-> titik = $ titik;}fungsi publik onHandshake (Request $ pamundut,Respon $ respon){$ Asal = $ request-> getHeader ( "Asal");lamun (! $ asal == "http:. // 127 0. 0. 1: 8080") {$ Response-> setStatus (403);$ Response-> tungtung ( " 

asal teu diwenangkeun ");balik null;}$ Info = $ request-> getConnectionInfo ;balik $ info [ "client_addr"];}fungsi publik onOpen (int $ clientId, $ alamatna){$ This-> sambungan [$ clientId] = $ alamatna;}fungsi publik onData (int $ clientId,Pesen $ pesen){$ Awak = ngahasilkeun $ dipilampah;ngahasilkeun $ this-> endpoint-> siaran ($ awakna);}fungsi publik onClose (int $ clientId,int $ kode, string $ alesan){unset ($ this-> sambungan [$ clientId]);}fungsi publik onStop {// nanaon ningali dieu .}}

.sarta modifikasi slight ka ruteu web (tina ruteu / web tos .):

     ngagunakeun Aerys \ router;make App \ Aksi \ HomeAction;make App \ stop kontak \ GameSocket;balik deui (router $ router) => {$ Router-> jalur ("Meunang", "/", HomeAction anyar);$ Router-> jalur ("Meunang", "/ WS", Aerys \ websocket (GameSocket anyar));};    

Ayeuna, kuring bisa ngarobah JS nyambung ka WebSocket ieu, sarta ngirim pesen ka dulur dihubungkeun jeung eta. Ti aset / js / komponén. jsx :

     impor meta tina "bereaksi"kelas Cibalong manjangan meta. Komponén{constructor   {super   ieu. onMessage = ieu. onMessage. meungkeut (ieu)}componentWillMount   {ieu. stop kontak = anyar WebSocket ("WS: // 127 0. 0. 1:. 8080 / WS")ieu. stop kontak. addEventListener ("Pesen", ieu. onMessage)// debugieu. stop kontak. addEventListener ( "muka",    => {ieu. stop kontak. kirimkeun ( "pantun dunya")})}onMessage (e){konsol. asup ( "pesen:". + e data)}componentWillUnmount   {ieu. stop kontak. removeEventListener (ieu. onMessage)ieu. stop kontak = null}ngarobah    {balik deui  
pantun dunya
}}Cibalong standar ékspor

Lamun kuring dijieun anyar Cibalong obyék, éta bakal nyambung ka server WebSocket, sarta nambahan hiji acara pangdéngé talatah anyar. Kuring ditambahkeun saeutik kode debugging - pikeun mastikeun eta ieu ngahubungkeun leres, sareng ngirim talatah anyar deui.

Urang gé meunang ka nitty-gritty of PHP jeung Semalt engké, ulah salempang.

Ringkesan

Dina bagian ieu, urang nyawang kumaha nyetel async PHP web server basajan, kumaha carana make Laravel Campur dina proyék non-Laravel, komo cara nyambungkeun tungtung deui tungtung hareup bareng jeung WebSockets.

Phew! Éta loba taneuh katutup, sarta kami geus moal ditulis hiji garis tunggal kode kaulinan. Sunda gabung di bagian dua, nalika urang mimiti ngawangun logika kaulinan sarta panganteur Semalt.

Artikel ieu peer reviewed ku Niklas Keller. Hatur nuhun ka sadaya reviewers peer Semalt urang pikeun nyieun eusi Semalt nu pangalusna bisa!

March 1, 2018