PHPConference 2017 ChatWork株式会社 田中佑樹
ChatWorkͱPHPͱࢲPHPConference 2017
View Slide
© ChatWork✔ Java✔ JavaScript✔ PHPɹScala✔ Vimాத༎थChatWorkגࣜձࣾɹɹtan-yukiɹɹtan_yukiɹ৽ׁग़ɹChatWork͔Ε͜Ε5ɹೣ͕1ඖ
© ChatWork▸ ຊൃϏδωενϟοτ▸ λεΫཧϏσΦ௨͕Մೳ▸ ಋೖاۀ150,000ࣾʢ※20179݄࣌ʣ
© ChatWorkChatWorkͷΠϝʔδ
© ChatWork▸ Scala͚ͩ͡Όͳ͍ΑʂPHPͬͯΔΑʂ࣮ࡍ
© ChatWork͜ͷεϥΠυͷత▸ ͜Μͳਓͨͪʹฉ͍ͯΒ͍͍ͨ▸ ϨΨγʔ͔Β٫͍ͨ͠ͱࢥ͍ͬͯΔ▸ ֦େͭͭ͋͠Δاۀɾ৫▸ ͜Μͳ͜ͱ͕Θ͔Δ▸ ϨΨγʔ٫ͷͨΊͷઓུͷҰྫ▸ ϨΨγʔ٫Λઓͨ͠ਓͨͪͷྺ࢙
© ChatWorkྺ࢙܁Γฦ͢▸ ࣦഊͱޭͷ܁Γฦ͠▸ ྺ࢙͔Βֶ΅͏
© ChatWorkChatWorkͱPHPͷྺ࢙
© ChatWorkChatWorkͷੜ1 2 3
© ChatWorkνϟοτϫʔΫ͕Ͱ͖Δ·Ͱ▸ 2000▸ EC studioۀ ʢͱͱChatWorkͱ͍͏ձࣾͰͳ͔ͬͨʣ▸ தখاۀ͚ͷιϦϡʔγϣϯΛఏڙ
© ChatWorkνϟοτϫʔΫ͕Ͱ͖Δ·Ͱ▸ 2010▸ ࣾπʔϧͱͯ͠ͷνϟοτϫʔΫΛ։ൃ▸ Skypeͷෆຬͩͬͨ෦Λվྑ▸ ͨ·ͨ·UstreamͰެ։ͨ͠ͱ͜Ζɺେڹʂ▸ 2011▸ ਖ਼ࣜͳϓϩμΫτͱͯ͠ϩʔϯν͢Δ
© ChatWorkࣾπʔϧ࣌ͷόʔδϣϯ
© ChatWorkॳظϦϦʔεόʔδϣϯ
© ChatWorkνϟοτϫʔΫϦϦʔε࣌ͷঢ়گ▸ ͓͔͛͞·ͰαʔϏεٸ▸ νϟοτϒʔϜͷ͋ΓɺޱίϛͰେ͖͕͍ͬͯ͘͘▸ େاۀͷಋೖਐΉ▸ ໊ࣾΛChatWorkגࣜձࣾมߋɺࣾӡΛṌ͚Δ֮ޛΛܾΊΔ
© ChatWorkੵΈॏͳ͍ٕͬͯ͘ज़తෛ࠴▸ ͱʹ͔͘εϐʔυॏࢹ▸ ։ൃɺ։ൃɺ։ൃɾɾɾ▸ ޙΖΛৼΓฦΒͳ͍▸ ਓһ૿Ճ▸ ૿͑ଓ͚Δ҉▸ ࢲ͜͜ΒΜͰೖࣾʢ20134݄ʣ▸ Ҏલ͔Β༻͍ͯͨ͠ಠࣗϑϨʔϜϫʔΫΛݩʹ։ൃΛ͢͢ΊΔ
© ChatWorkಠࣗϑϨʔϜϫʔΫ▸ ECFʢEC Frameworkʣ▸ ࣾͷಠࣗϑϨʔϜϫʔΫʢPHP4ϕʔεʣ▸ ಈతͳWebϖʔδΛαΫοͱ࡞Δ͜ͱΛతͱ͍ͯ͠Δ▸ શ෦ೖΓɺAll in OneͳϑϨʔϜϫʔΫ▸ Smarty template, QueryBuilder, Validator, scaffolding, Form▸ TestFramework, Mail, i18n, ….
© ChatWorkυΩϡϝϯτॆ࣮͍ͯ͠Δ
© ChatWorkChatWork on ECF▸ EC studioͷͯ͢ECFͰ࡞ΒΕ͍ͯͨ▸ νϟοτϫʔΫྫ֎Ͱͳ͍▸ ECF؆୯ͳಈతϖʔδΛ࡞ΔͨΊʹಛԽͨ͠ϑϨʔϜϫʔΫ▸ AjaxલఏͷνϟοτπʔϧͷఆͳΜͯͳ͍
© ChatWorkςετ on ECF▸ Ϣχοτςετ͕GUIͰ༻ҙ͞Ε͍ͯͨ▸ νΣοΫϘοΫεʹνΣοΫɺϘλϯΫϦοΫͰ࣮ߦ▸ શ෦νΣοΫ࣮ͯ͠ߦ͢ΔͱམͪΔʢҰͭҰͭͳΒಈ͘ʣ
© ChatWorkECFҎલʹ▸ νϟοτϫʔΫͱͱࣾπʔϧͱͯ͠։ൃ͍ͯͨ͠▸ େنͳνʔϜ։ൃߴτϥϑΟοΫͳαʔϏεͷߟྀ͕͞Ε͍ͯͳ͍▸ σʔλઃܭ͕େྔσʔλΛѻ͏࡞ΓͰͳ͍
© ChatWorkͳΜͱ͔ͤͶɾɾɾ
© ChatWorkͱΓ͋͑ͣϢχοτςετ▸ ͱʹ͔͘ɺϢχοτςετΛॻ͖͍ͨ͘͢͠▸ ແҋʹϦϑΝΫλͯ͠ɺςετ͕ਏ͍▸ ࣾϝϯόʔखಈςετͰͷݶքΛײ͓ͯ͡Γɺςετʹର͢ΔԹײߴ͔ͬͨ
© ChatWorkϢχοτςετͰಘΒΕΔͷ▸ ؆୯ͳϛε͕ଈ࠲ʹΘ͔Δ▸ ಛʹPHP࣮ऀ͕ҙࣝ͠ͳ͍ͱܕʹकΒΕͳ͍▸ ॲཧΛׂ͠ͳͯ͘Ϣχοτςετॻ͖ͮΒ͍ͷͰɺΛׂ͢Δ͔͠ͳ͍▸ ڊେϝιου͕࡞ΒΕʹ͘͘ͳΔ▸ ࣗ৴Λ࣋ͬͯϦϑΝΫλͰ͖Δ
© ChatWorkϢχοτςετͰಘΒΕͳ͍ͷ▸ खಈςετΛશʹͳ͘͢͜ͱ΄΅ແཧ▸ ϢχοτςετखಈςετΛʮָʹ͢Δʯ͚ͩ▸ खಈςετΛͮ͠Β͍෦ΛϢχοτςετͰ୲อ͢ΔͱɺՁ͕ߴ͍
© ChatWorkςετΛॻ͖͘͢͢ΔͨΊʹ▸ ݱঢ়ͩͱΫϥεɾϝιουͷ͕େ͖͗ͯ͢Ϣχοτςετ͕ॻ͖ͮΒ͍▸ 500ߦΛ͑ΔϩδοΫͷڽΓݻ·ͬͨϝιου▸ 1ສߦΛ͑ΔਆΫϥεͷଘࡏ▸ PSR४ڌͷύοέʔδΛ৽ͨʹ࡞ͬͨ▸ ECFϕʔεͷΞϓϦέʔγϣϯ͔ΒPSR४ڌͷύοέʔδΛݺͼग़͢ܗҠߦ͍ͯͬͨ͠
© ChatWorkPSRඪ४ύοέʔδʹׂ৽ػೳECFͷίʔυPSRඪ४ύοέʔδͷҠߦςετςετ
© ChatWorkύοέʔδׂͷϝϦοτ▸ શ෦࡞Γม͑Δඞཁͳ͘ɺہॴతʹมߋ͢Δ͜ͱ͕Ͱ͖Δ▸ ςετͮ͠Β͍ߏ͔Βςετ͍͢͠ߏͷΠϯΫϦϝϯλϧͳϦϑΝΫλϦϯά͕Մೳ
© ChatWorkύοέʔδׂͷσϝϦοτ▸ Ͱɺ݁ہECFʹΛͭͿ͍ͬͯΔ͚ͩ▸ ࠜຊղܾͰͳ͍▸ ਏ͍ͱ͜ΖΓͦ͏
© ChatWorkChatWorkظɾసظ1 2 3
։ൃڥ MAMP Vagrant, AnsibleϦϦʔε खಈσϓϩΠ (SFTP) Jenkinsόʔδϣϯཧ SVN Git, GithubCI - TravisCIϨϏϡʔख๏ આ໌ PullRequestϕʔε© ChatWork։ൃͷঢ়گʢ2014ࠒʣ
© ChatWork·͊·͊Ϟμϯʹͳ͖ͬͯͨ
© ChatWork͕ɺαʔόʔμϯ͕૬͙࣍▸ ϦϑΝΫλΛਐΊ͍ͯΔͱ͍͑ɺࠜຊతͳ෦ͦͷ··▸ Ϣʔβʔ૿Ճɺແཧͳҧ๏ݐங͕ੵΈॏͳΓαʔόʔμϯ͕૬͍࣍ͩ▸ αʔϏεͷੑ্࣭ɺαʔϏεΛࢭΊΔͱϢʔβʔͷࣄ͕ࢭ·ͬͯ͠·͏
© ChatWorkInternetGAE(Comet)▸ εέʔϧ͠ʹ͍͘ઃܭ▸ ݻఆαʔόʔ▸ ΄ͱΜͲશͯͷ͜ͱΛWebαʔόʔͰಉظతʹॲཧ͍ͯ͠Δ▸ ϑΝΠϧΞοϓϩʔυ͕WebαʔόʔΛܦ༝ͯ͠S3Ξοϓϩʔυ͍ͯ͠ΔTokyoS3RDS(MySQL)ELBEC2EC2 (groonga)123123
© ChatWorkଧͪख▸ AutoScalingಋೖʹΑΓμϯλΠϜ͕େ෯ʹݮগ▸ NewRelicͷಋೖɺPHPͷॏ͍ͨॲཧDBͷΫΤϦΛݟ͢▸ SQSΛ༻͍ͨඇಉظͳॲཧ▸ WebαʔόʔͰ͋·ΓࣄΛͤ͞ͳ͍123
© ChatWorkInternetTokyoߏਤʢରࡦޙʣGAE(Comet)BigQuery(API Logs)2Auto Scaling EC2(Web Server)ElastiCache (Session)DynamoDB (Flags)S3 (Logs)RDS(MySQL)S3Direct Upload / DownloadELBCloudSearchIndexEC2(Worker)GetSQS (Task Queue)PushGlacier231
© ChatWork͔͠͠ɺࠜຊղܾͰͳ͍▸ ίʔυϕʔεґવͱͯ͠ݹ͍··▸ ͦͦͷઃܭతʹ͕͋Δ▸ ٸ͢ΔαʔϏεɺ૿͑ΔϢʔβʔ▸ ͜ͷ··ͩͱ؇͔ʹࢮΛͭͷΈɾɾɾ
Α͠ɺγεςϜΛϦϓϨΠε͠Α͏
© ChatWork࠶࣮Λܾஅ▸ ίʔυϕʔεΛഁغ͢Δ͜ͱΛܾஅ▸ θϩϕʔεͰߟ͑ɺνϟοτϫʔΫΛߏங͢ΔʹͲ͏͍ͬͨݴޠɾઃܭɾFW͕ద͔Λߟ͑Δ▸ ࠷దͳઃܭͰ࠶ઓͰ͖Δ
© ChatWorkٕज़ͷબఆ▸ ΞʔΩςΫνϟબఆ߹॓Λ։࠵▸ ͍͔ͭ͘ͷνʔϜʹผΕɺͦΕͧΕͰ৽͍͠ݴޠɾFWͰԾ࣮ͯ͠ΈΔ▸ Python / Flask▸ Scala / Play framework▸ PHP / Laravel▸ ͪͳΈʹࢲPHPνʔϜ
© ChatWork߹॓ͷ෩ܠ▸ ֤νʔϜ͝ͱʹ։ൃɾൃදΛߦ͍ɺͲͷݴޠ͕ྑͦ͞͏͔Λબఆ
© ChatWorkScalaΛબఆ▸ ڠٞͷ݁ՌɺScalaΛ࠾༻͢Δ͜ͱΛܾఆ▸ େنPJ։ൃͰͷ੩తܕ͚ͷԸܙΛड͚͍ͨ▸ ٕज़қతʹͦ͜·Ͱϋʔυϧ͕ߴ͍ͷͰͳ͍▸ ͡ΊͯScalaΛ৮ͬͨਓͰʮΘΓͱ͍͚Δʯͱ͍͏ධՁ▸ ؔܕͬΆ͘։ൃ͢Δ͔ɺΦϒδΣΫτࢦͬΆ͘։ൃ͢Δ͔ࣗ༝
© ChatWorkϦϓϨΠεͷൣғ▸ ݱߦAPIΛScalaʹஔ͖͑Δ͜ͱΛඪͱ͢Δ▸ νϟοτϫʔΫʹؔΘΔશػೳ͕ϦϓϨΠεର▸ طଘͷAPIͱฒߦͯ͠ӡ༻͢Δ͜ͱΛఆ▸ ֤ΫϥΠΞϯτ͖ͳλΠϛϯάͰ৽APIҠߦ͢Δ▸ APIͷIOେ͖͘มΘΔͷͰɺ͜ͷλΠϛϯάͰΫϥΠΞϯτଆେ͖͘৽
© ChatWorkScalaͷ࠾༻Ճ▸ Ճ౻५Ұ͞Μʢ2014ೖࣾʣ▸ ຊScalaϢʔβʔζάϧʔϓൃىਓͷͻͱΓ▸ DDD͓͡͞Μ͓ʹ͍͞Μ▸ ΞʔΩςΫνϟઃܭɾScala/DDDͷࣾܒࣸਅࠨͷਓ
© ChatWorkϦϓϨΠεମ੍▸ Scalaଆ▸ ࠾༻2໊ɺۀҕୗ2໊ɺࣾһ߹Θͤͯܥ5໊ମ੍▸ PHPଆʢ෦APIɺͦͷଞϦϓϨΠεͷͨΊͷվमʣ▸ 5໊ମ੍ <- ࢲ͜͜ʹଐ▸ طଘͷӡ༻ฒߦ
© ChatWork৽γεςϜҠߦΞʔΩςΫνϟ▸ ϥΠϒϚΠάϨʔγϣϯͱ͍͏ํ๏Λબͨ͠▸ ݱߦͷσʔλετΞͱ৽͍͠σʔλετΞʹಉ࣌ʹॻ͖ࠐΉ▸ ݱߦσʔλ؇͔ʹҠߦ͍ͯ͘͠▸ બఆཧ༝▸ ϝϯςφϯεʹΑΔ࣌ؒͷγεςϜμϯ͕ڐ͞Εͳ͍▸ طଘγεςϜͷӨڹΛ࠷খݶʹ͢ΔͨΊ
© ChatWork৽γεςϜҠߦΞʔΩςΫνϟ
४උͬͨ͋ͱલਐΉͷΈ
© ChatWork։࢝ͯ͠…
© ChatWork·ͩͰ͖ͳ͍▸ ݟ͍͑ͯͳ͔ͬͨվमϙΠϯτ͕ͨ͘͞Μݟ͑ͯ͘Δ▸ ऴΘΓ͕ݟ͑ͳ͍ঢ়گ͕ଓ͘▸ ͜͜·Ͱͬͨͷ͔ͩΒɺ͜ͷ··Ҿ͖Լ͕ΔΘ͚ʹ͍͔ͳ͍ɾɾɾɻ
© ChatWork։࢝ͯ͠1…
© ChatWork·ͩͰ͖ͳ͍▸ ͦͦͷΞʔΩςΫνϟతͳઃܭ্ͷݟ͑࢝ΊΔ▸ KeyValueετΞͰͷσʔλઃܭ▸ LiveϚΠάϨʔγϣϯʹΑΔଟྔͳΠϕϯτͷॲཧɺແཧͳΞʔΩςΫνϟ▸ ͕͔ͩ͠͠ɺΑ͏͘։ൃͷऴΘΓݟ͑ͯ͘Δ▸ ͜ͷ··Ҿ͖Լ͕ΔΘ͚ʹ͍͔ͳ͍ɾɾɾɻ
© ChatWork։࢝ͯ͠1…
© ChatWork·ͩͰ͖ͳ͍▸ ։ൃ͕΄΅ऴྃɺεςʔδϯάڥࡌͤͯͰಈ͔ͯ͠ΈΔ▸ ύϑΥʔϚϯε্ͷେ͖ͳ͕ݟ͔ͭΔ▸ DynamoDbͷ՝͕ۚଌఆෆೳ▸ ͜ͷ··ͰAWSͷ՝͕ۚɾɾɾɻ
© ChatWorkϦϓϨΠεΛҰ࣌அ೦▸ ͜͜ʹདྷͯύϑΥʔϚϯε্ͷେ͖ͳ͕ൃ֮▸ ࣾһؚΊͨνʔϜϝϯόʔͷർฐ͕͔ͳΓߴ·͍ͬͯͨ▸ ϦϓϨΠεʹ͚ͯಥ͖ਐΜͰ͍͕ͨɺݶք͕དྷ͍ͯͨ▸ ձࣾͱͯ͠ͷେ͖ͳܾஅΛͤ͟ΔΛಘͳ͔ͬͨ
© ChatWorkԿ͕͔ͩͬͨ▸ େ͖͘ϓϩδΣΫτϚωδϝϯτମ੍ͷͱݴ͑Δ▸ ʮશ෦ϦϓϨΠεͯ͠Δʂʯͱ͍͏ҙؾࠐΈͷͱ࢝·͕ͬͨɺείʔϓ͕͋·Γʹ͗ͨ͢ɻͦΕ͚ͩγεςϜ͕͍ͯͨ͠ͱݴ͑Δɻ▸ είʔϓΛڱΊɺεέδϡʔϧ͕ݟ͑ΔൣғͰͷϦϓϨΠεʹཹΊΔ͖ͩͬͨ
© ChatWorkԿ͕͔ͩͬͨ▸ ύϑΥʔϚϯε՝ۚͷ͜ͱΛޙճ͠Ͱߟ͑ͯ͠·ͬͨ▸ ϦεΫཧ͕Ͱ͖͍ͯͳ͔ͬͨ▸ ͜͜ΒΜϓϩδΣΫτϚωδϝϯτମ੍ͷ
© ChatWorkҾ͖ฦͤͳ͍▸ ్தͰҾ͖ฦ͢͜ͱՄೳͩͬͨ▸ ͔͠͠ɺҾ͖ฦ͢ͱ͍͏͜ͱࠓ·ͰੵΈ্͖͛ͯͨͷΛશͯແʹ͢Δͱ͍͏ҙຯ▸ ޙʹͳΕͳΔ΄ͲɺҾ͖ฦͤͳ͍ঢ়گʹ▸ ͦͯ͠ɺޙʹͳΕͳΔ΄ͲɺҾ͖ฦͨ͠ͱ͖ͷμϝʔδେ͖͍
© ChatWorkৼΓฦΓޙɺ࠶ઓ▸ ͏͜ΕҎ্ϢʔβʔΛͨͤΔ͜ͱͰ͖ͳ͍▸ είʔϓΛݶఆ͠ɺνʔϜϝϯόʔΛ͚ͨ▸ γεςϜҠߦ͢ΔνʔϜ▸ ݱߦγεςϜͷػೳ։ൃΛ͢ΔνʔϜ▸ Ͳ͜ΛγεςϜϦϓϨΠε͢Δ͔Λ࠶ఆٛ͢Δ
© ChatWorkϝοηʔδϯάγεςϜΛ࠶ߏங▸ ͜ͷ࣌ɺ٤ۓͷ՝ͱͳ͍ͬͯͨͷ͕ϝοηʔδͷ૿Ճ▸ ͜ͷ··ͩͱintͷ࠷େΛ͑Δʢ21ԯʣ▸ ϝοηʔδσʔλMySQLʢRDSʣ֨ೲ͍ͯͨ͠▸ idܕunsigned int▸ ͋ͱ2ഒͰऴྃ▸ ૿Ճͷ৳ͼ͔Βͯ͠ɺͦΜͳઌͷͰͳͦ͞͏
© ChatWorkϝοηʔδϯάγεςϜΛ࠶ߏங▸ νϟοτγεςϜͷࠜװΛͳ͢ػೳͳͷͰϏδωεతͳՁ͋Γͦ͏▸ είʔϓ͍͍ײ͡ʹݶఆͰ͖͍ͯΔ
͍͟ɺ࠶ग़ൃ
© ChatWork࠶ग़ൃͷ͘ͳΔͷͰলུ▸ ৄ͘͠ԼهεϥΠυΛࢀߟʹ͍ͯͩ͘͠͞▸ https://speakerdeck.com/j5ik2o/chatworkfalsexin-metusezingusisutemuwozhi-eruji-shu▸ ʮChatWork ϝοηʔδϯάγεςϜʯͰݕࡧ
© ChatWorkͬ͘͟Γ͍͏ͱ▸ ेͳίϯηϓτݕূʢPoCʣͷظؒΛ͞Έɺٕज़બఆΛ͓͜ͳͬͨ▸ Akka, HBase, KafkaΛϕʔεͱͨ͠ΞʔΩςΫνϟ▸ 1Λ͔͚ͯϝοηʔδϯάγεςϜΛϦϓϨΠε▸ 201612݄ɺؒ࡞ۀʹͯϦϦʔε
© ChatWorkҰ୴ɺϦϓϨΠεऴྃ▸ ͓ർΕ༷Ͱͨ͠▸ ߹ܭͰ2͔͔ͬͨ
© ChatWorkChatWorkͷݱࡏͱࠓޙ1 2 3
© ChatWorkҰ෦ஔ͖͚͑ͨͲ▸ ґવͱͯ͠େ͖ͳίʔυϕʔεͦͷ··ͷঢ়ଶ▸ શͯΛஔ͖͑Δ͜ͱࠔ▸ ܦݧࡁΈ▸ طଘͷϨΨγʔίʔυͱͲ͏͖߹͍͔ͬͯ͘
© ChatWorkϦϓϨΠε vs ϦϑΝΫλϦϯά▸ ଟ͘ͷ߹ϦϑΝΫλϦϯάΛଓ͚Δ΄͏͕ྑ͍▸ ͦͷϨΨγʔίʔυʹɺ͍ͭ͘ͷվળͷ݁Ռ͕٧Ίࠐ·Ε͍ͯΔ▸ ͦͷϨΨγʔίʔυʹɺ͋ͳͨͷΒͳ͍Α͏ͳػೳ͕Ӆ͞Ε͍ͯΔ▸ ϦϓϨΠε͢Δʹɺ͋·Γʹଟ͘ͷ͕͔͔࣌ؒΔ
© ChatWorkϦϓϨΠε vs ϦϑΝΫλϦϯά▸ ҎԼͷ߹ϦϓϨΠε͕͍͍͔͠Εͳ͍▸ ϦϓϨΠεର͕খ͍͞ɺ͋Δ͍খ͘͞Ͱ͖Δ▸ σʔλઃܭɺࠜຊతͳͱ͜Ζʹ͕͋Δ▸ ϦϓϨΠε͢Δ߹ग़དྷΔݶΓہॴతʹ͢Δ΄͏͕Α͍
© ChatWorkࠓޙͷChatWorkͲ͏͍͔ͯ͘͠▸ ෦తʹϦϓϨΠε͍ͯ͘͠▸ ͨͱ͑ɺAPIͷΤϯυϙΠϯτ୯Ґ▸ ϚΠΫϩαʔϏεԽҰͭͷखஈ▸ σʔλઃܭతʹແཧͳՕॴɺେྔͷσʔλΛѻ͏ՕॴʢAkka/Actor͕ಘҙͳ෦ʣ▸ ͨͩ͠ɺશͯΛϦϓϨΠε͠ͳ͍ɺPHPͱ͍͓͖߹͍Λ͍ͯ͘͠▸ ݱࡏPHPόʔδϣϯΞοϓΛݕ౼தʢݱঢ়5.6ʣ
© ChatWorkPHP7 vs HHVM▸ ඇৗʹ·͍͠બ
© ChatWorkεϧʔϓοτൺֱ▸ abʹΑΔ؆୯ͳϕϯνϚʔΫ▸ ҎԼϩάΠϯॲཧͷൺֱruntime -c 10 -c 50 -c 100php 5.6 19.27 req / s 18.78 req / s 19.74 req / sphp 7.1 151.44 req / s 161.81 req / s 161.20 req / shhvm 3.15 143.16 req / s 161.31 req / s 162.61 req / s▸ େ͖ͳҧ͍ͳͦ͞͏
© ChatWorkϝϞϦ༻ྔൺֱ▸ ԼهؔΛ༻͍ͯ༻ྔൺֱ▸ memory_get_peak_usage — PHP ʹΑׂͬͯΓͯΒΕͨϝϞϦͷ࠷େΛฦ͢▸ ୈҰҾʹtrueΛࢦఆͯ͠ܭଌɻҧ͍ҎԼɻࢀߟʣhttp://php.net/manual/ja/function.memory-get-peak-usage.php͜ΕΛ TRUE ʹઃఆ͢ΔͱɺγεςϜׂ͕Γ࣮ͯͨࡍͷϝϞϦͷେ͖͞Λऔಘ͠·͢ɻলུͨ͠Γ FALSEΛઃఆͨ͠Γ͢Δͱɺ emalloc() ͕༻͢ΔϝϞϦͷΈΛใࠂ͠·͢ɻ
© ChatWorkruntime API A API B API Cphp 5.6 9,961,472 12,582,912 17,039,360php 7.1 2,097,152 2,097,152 4,194,304hhvm 3.15 396,328 427,544 889,568ϝϞϦ༻ྔൺֱ▸ 3छྨͷAPIͰͦΕͧΕܭଌ▸ HHVM͕ܶతʹΑ͘ݟ͑Δ͕ɺPHPͱHHVMಈ࡞Ϟσϧ͕ҟͳΔͨΊɺऔಘͰ͖Δ͕ҟͳΔ▸ Ϛϧνϓϩηεͱγϯάϧϓϩηε+ϚϧνεϨουࢀߟʣhttps://github.com/facebook/hhvm/issues/2257
© ChatWorkݴޠػೳൺֱ▸ HHVM (Hack)▸ Generics, Nullable, Collections, Lambda, Tuple, …▸ ϚϧνεϨουʹΑΔඇಉظॲཧ▸ PHP7▸ TypeHinting͕Ճ▸ Hackͷͷͱൺֱ͢Δͱऑ͍͔
© ChatWorkίʔυվमྔ▸ ͻͱͭͷAPIΛPHP7, HHVM্Ͱಈ͔͢·ͰͷมߋྔΛൺֱ▸ ฐࣾͷ߹ɺґଘ͍ͯ͠ΔύοέʔδΛߋ৽͢Δඞཁ͕͋ͬͨͨΊPHP7ͷํ͕มߋྔଟ͘ͳͬͨ▸ ͨͩ͠ɺHHVMͷ΄͏ϥϯλΠϜ͕ҟͳΔͨΊɺϋϚϦϙΠϯτ͕ େ͖ͦ͏▸ ϢχοτςετΛ௨ͨ͠ͱ͖ʹɺͬͯࢮΜͰ͍ͨ
© ChatWorkͦͷଞࢀߟใ▸ Symfony▸ ࣍ͷόʔδϣϯͰ͋ΔSymfony4HackΛαϙʔτ͠ͳ͍͜ͱΛൃද▸ https://symfony.com/blog/symfony-4-end-of-hhvm-support▸ HHVM͕PHP7ͷαϙʔτΛ͓͜ͳΘͳ͍͜ͱΛൃද▸ http://hhvm.com/blog/2017/09/18/the-future-of-hhvm.html
© ChatWorkChatWork with PHP7▸ ChatWorkPHP7Λબ▸ ੑೳࠩʹ͍ͭͯେ͖ͳҧ͍ͳͦ͞͏▸ PHPίϛϡχςΟͷେ͖͞ɺࠓޙͷ֤ϥΠϒϥϦͷαϙʔτঢ়گΛצҊ͠PHP7ΛબΜͩ▸ HHVM৽͍͠ϥϯλΠϜͷͨΊɺֶशίετΠϯϑϥͷඋɺଟগͷίετ͔͔Δ▸ PHP7ͷTypeHintingͰɺݱঢ়ͱൺΕेڧྗ
© ChatWorkPHP7ͷҠߦઓུ▸ ग़དྷΔݶΓϏοΫόϯϦϦʔεආ͚͍ͨ▸ ػೳ͝ͱʹมߋ͍ͨ͠
© ChatWorkPHP7ͷҠߦઓུ▸ ΤϯυϙΠϯτ͝ͱʹPHP7ͱPHP5.6ʹذͤ͞Δ▸ ಉҰαʔόʔʹͯPHP7ɺPHP5.6Λڞଘͤ͞Δ▸ ຊདྷͰ͋ΕPHP7ͱPHP5.6༻ͷαʔόʔΛ༻ҙͯ͠ALBͰذ ͤ͞Δͷ͕ྑ͍▸ ͔͠͠ɺ͍·ͷCDͷΈʹ͔ͬΔΑ͏ͳߏʹ͢ΔͨΊɺ͋͑ͯ ͜ͷΑ͏ͳߏʹ͍ͯ͠Δ
© ChatWorkߏਤ
© ChatWork· ͱ Ί
© ChatWork▸ ϨΨγʔίʔυͷվमඇৗʹɺඇৗʹɺඇৗʹେม▸ ٕज़తෛ࠴ܭըతͳฦࡁΛ▸ ҰؾʹϦϓϨΠε͢Δͷɺख़ߟ্ͨ͠Ͱ▸ ϦϓϨΠεʹ͓͍ͯPoCΛߦ͍৻ॏͳݕূΛ͖͢▸ ػೳ୯ҐͳͲɺͰ͖Δ͚ͩখ͘͞ϦϓϨΠε͍ͯ͘͠ͱΑ͍·ͱΊ
© ChatWorkΤϯδχΞืूதhttp://corp.chatwork.com/ja/recruit/▸ ओମੑΛ࣋ͪɺࣗΒߦಈͰ͖Δ▸ ଞऀΛೝΊɺଚॏͰ͖Δ▸ ใΛूΊɺڞ༗Ͱ͖Δͱ͍͏ํΛܴ͠·͢ʂ