Slide 1

Slide 1 text

͞Βʹ଎͘ͳΔPHP nunulk 
 PHPΧϯϑΝϨϯεԭೄ

Slide 2

Slide 2 text

ຊ೔͓࿩͢Δ͜ͱ • ࣗݾ঺հ • PHP 7.4 Ͱಋೖ͞ΕΔ Opcache Preloading ͱ FFI • ʢ͓·͚ʣNim ͷ঺հ

Slide 3

Slide 3 text

ࣗݾ঺հ • ໊લ: nunulkʢ͵͵Δ͘ʣ • ৬ۀ: ϑϦʔϥϯεͷ΢ΣϒΤϯδχΞ • ਆಸ઒ݝ͔Βདྷ·ͨ͠ • PHPͷ޷͖ͳͱ͜Ζ: Մมؔ਺ɺϚδοΫϝιου • Laravel Meetup Okinawa ࢀՃ཰: ໿ 45%

Slide 4

Slide 4 text

I work for

Slide 5

Slide 5 text

PHP 7.4 is coming
 on Nov. 28th, 2019 ! RC3 is now available.

Slide 6

Slide 6 text

New features • Typed Properties • Arrow Functions • Null coalescing assignment operator • Spread operator in arrays • Covariant Returns and Contravariant Parameters • Opcache Preloading • FFI

Slide 7

Slide 7 text

New features • Typed Properties • Arrow Functions • Null coalescing assignment operator • Spread operator in arrays • Covariant Returns and Contravariant Parameters • Opcache Preloading • FFI

Slide 8

Slide 8 text

Opcache Preloading • αʔόىಈ࣌ʹ Opcache ΛϝϞϦ্ʹϩʔυ͠ ͓ͯ͘࢓૊Έ • ॳճΞΫηε࣌ʹ΋Ωϟογϡ͕ޮ͘Α͏ʹͳΔ • ͨͩ͠ࢦఆͰ͖Δͷ͸1ϑΝΠϧͷΈ

Slide 9

Slide 9 text

Opcache Preloading // ϑϨʔϜϫʔΫͷ͢΂ͯͷϑΝΠϧΛΩϟογϡ͢Δ $frameworkDir = $baseDir . 'vendor/laravel/framework/ src/Illuminate'; $paths = load_all_files([$frameworkDir]); foreach ($paths as $path) { opcache_compile_file($path);
 }

Slide 10

Slide 10 text

Opcache Preloading ab -n 100 -c 10 http://localhost Opcache ͳ͠ Requests per second: 0.91 [#/sec] (mean) Time per request: 11010.544 [ms] (mean) Opcache ͋Γ Requests per second: 5.34 [#/sec] (mean) Time per request: 1872.084 [ms] (mean) Opcache ͋Γ w/ preload Requests per second: 6.32 [#/sec] (mean) Time per request: 1582.046 [ms] (mean)

Slide 11

Slide 11 text

Opcache Preloading ab -n 100 -c 10 http://localhost Opcache ͳ͠ Requests per second: 0.91 [#/sec] (mean) Time per request: 11010.544 [ms] (mean) Opcache ͋Γ Requests per second: 5.34 [#/sec] (mean) Time per request: 1872.084 [ms] (mean) Opcache ͋Γ w/ preload Requests per second: 6.32 [#/sec] (mean) Time per request: 1582.046 [ms] (mean)  

Slide 12

Slide 12 text

Opcache Preloading • Opcache.enable = 1 ͢Δ͚ͩͰे෼଎͘ͳΔ • αʔόΛ࠶ىಈ͠ͳ͍ͱΩϟογϡ͸ߋ৽͞Εͳ͍ͷͰɺ ӡ༻ͷࡍ͸஫ҙ͕ඞཁ • Composer Ͱ΋ಋೖ͕ݕ౼͞Ε͍ͯΔͷͰɺকདྷతʹ͸ preload͢Δର৅ͷબఆΛ composer ͔Βߦ͑ΔΑ͏ʹͳ Δ͔΋͠Εͳ͍

Slide 13

Slide 13 text

FFI - Foreign Function Interface • PHP ͔ΒωΠςΟϒϥΠϒϥϦ ʢ.so, .dylib, .dllʣΛݺͿ࢓૊Έ • Python, Ruby, Java ͳͲͰ͢Ͱʹ࠾༻͞Ε ͍ͯΔ

Slide 14

Slide 14 text

PHP ͔ΒωΠςΟϒϥΠϒϥ ϦΛݺͿ࢓૊Έ • PHP extension • Zend extension

Slide 15

Slide 15 text

FFI fib(40); var_dump($ret); // int(102334155)

Slide 16

Slide 16 text

FFI // for/if Λ࢖ͬͯ N ·Ͱͷۮ਺ͷ࿨Λܭࢉ͢Δ
 # php index.php loop --php 1000000 0.056366920471191 
 # php index.php loop --ffi 1000000 0.037209987640381 
 // N ൪໨ͷϑΟϘφον਺Λ࠶ؼͰܭࢉ͢Δ # php index.php fib --php 40 4.6368939876556 # php index.php fib --ffi 40 0.28206396102905 // MySQL ʹ N ݅σʔλΛૠೖ͢Δ # php index.php mysql --php 1000 0.47904992103577 # php index.php mysql --ffi 1000 0.57981204986572

Slide 17

Slide 17 text

FFI // for/if Λ࢖ͬͯ N ·Ͱͷۮ਺ͷ࿨Λܭࢉ͢Δ
 # php index.php loop --php 1000000 0.056366920471191 
 # php index.php loop --ffi 1000000 0.037209987640381 
 // N ൪໨ͷϑΟϘφον਺Λ࠶ؼͰܭࢉ͢Δ # php index.php fib --php 40 4.6368939876556 # php index.php fib --ffi 40 0.28206396102905 // MySQL ʹ N ݅σʔλΛૠೖ͢Δ # php index.php mysql --php 1000 0.47904992103577 # php index.php mysql --ffi 1000 0.57981204986572 

Slide 18

Slide 18 text

FFI // for/if Λ࢖ͬͯ N ·Ͱͷۮ਺ͷ࿨Λܭࢉ͢Δ
 # php index.php loop --php 1000000 0.056366920471191 
 # php index.php loop --ffi 1000000 0.037209987640381 
 // N ൪໨ͷϑΟϘφον਺Λ࠶ؼͰܭࢉ͢Δ # php index.php fib --php 40 4.6368939876556 # php index.php fib --ffi 40 0.28206396102905 // MySQL ʹ N ݅σʔλΛૠೖ͢Δ # php index.php mysql --php 1000 0.47904992103577 # php index.php mysql --ffi 1000 0.57981204986572 

Slide 19

Slide 19 text

FFI // for/if Λ࢖ͬͯ N ·Ͱͷۮ਺ͷ࿨Λܭࢉ͢Δ
 # php index.php loop --php 1000000 0.056366920471191 
 # php index.php loop --ffi 1000000 0.037209987640381 
 // N ൪໨ͷϑΟϘφον਺Λ࠶ؼͰܭࢉ͢Δ # php index.php fib --php 40 4.6368939876556 # php index.php fib --ffi 40 0.28206396102905 // MySQL ʹ N ݅σʔλΛૠೖ͢Δ # php index.php mysql --php 1000 0.47904992103577 # php index.php mysql --ffi 1000 0.57981204986572 

Slide 20

Slide 20 text

FFI - Foreign Function Interface • ࢖͍ॴΛݟۃΊΔͷ͕೉͍͕͠ɺہॴతʹ εϐʔυΞοϓͤ͞Δબ୒ࢶͷͻͱͭ • େྔͷܭࢉΛͤ͞Δͷʹ޲͍͍ͯΔ • ͢ͰʹΤΫεςϯγϣϯ͕͋ΔͷͰ͋Ε͹ ͦͪΒΛ࢖͏΄͏͕଎͍

Slide 21

Slide 21 text

ʢ͓·͚ʣNim ͷ঺հ

Slide 22

Slide 22 text

Nim • γεςϜϓϩάϥϛϯά޲͚੩తܕ෇͚ݴޠ • ϚϧνύϥμΠϜ • Python ʹࣅͨߏจΛ࣋ͭ • C/C++/JavaScript ʹτϥϯεύΠϧ͢Δ͜ͱ͕Ͱ͖Δ • 2019೥9݄ʹ 1.0 ͕ϦϦʔε͞Εͨ͹͔Γ

Slide 23

Slide 23 text

Nim proc fib(a: cint): cint {.exportc, cdecl, dynlib.} = if a <= 2: result = 1 else: result = fib(a - 1) + fib(a - 2)

Slide 24

Slide 24 text

Nim $ nim c -d:release --noMain --header --app:lib fib.nim 
 $ ls libfib.so libfib.so 


Slide 25

Slide 25 text

Nim fib(40); var_dump($ret);

Slide 26

Slide 26 text

ڵຯͷ͋Δํ͸ Nim + FFI Ͱ
 ॏ͍ॲཧͷߴ଎Խʹ
 νϟϨϯδͯ͠Έ͍ͯͩ͘͞

Slide 27

Slide 27 text

JIT in PHP 8.0 is coming on Sep. 23, 2021 !

Slide 28

Slide 28 text

͞Βʹ଎͘ͳΔ PHP
 ࠓޙͱ΋ΑΖ͓͘͠ئ͍͠·͢