Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Reactive PHP Events
Search
Christopher Pitt
April 20, 2015
Programming
1
350
Reactive PHP Events
Event loops in PHP.
Christopher Pitt
April 20, 2015
Tweet
Share
More Decks by Christopher Pitt
See All by Christopher Pitt
Making Robots (PHP Unicorn Conf)
chrispitt
1
160
Transforming Magento (NomadMage 2017)
chrispitt
2
88
Forget What You Know
chrispitt
1
130
Monads In PHP → php[tek]
chrispitt
3
480
Breaking The Enigma → php[tek]
chrispitt
0
170
Turn on the Generator!
chrispitt
0
150
Implementing Languages (FluentConf)
chrispitt
1
320
Async PHP (Sunshine)
chrispitt
0
430
Helpful Robot
chrispitt
0
100
Other Decks in Programming
See All in Programming
Learning Kotlin with detekt
inouehi
1
190
Datadog DBMでなにができる? JDDUG Meetup#7
nealle
0
160
sappoRo.R #12 初心者セッション
kosugitti
0
280
「個人開発マネタイズ大全」が教えてくれたこと
bani24884
1
290
読まないコードリーディング術
hisaju
0
110
Rubyと自由とAIと
yotii23
6
1.9k
Amazon Bedrockマルチエージェントコラボレーションを諦めてLangGraphに入門してみた
akihisaikeda
1
150
苦しいTiDBへの移行を乗り越えて快適な運用を目指す
leveragestech
0
1.2k
Rails 1.0 のコードで学ぶ find_by* と method_missing の仕組み / Learn how find_by_* and method_missing work in Rails 1.0 code
maimux2x
1
260
技術を改善し続ける
gumioji
0
180
Generating OpenAPI schema from serializers throughout the Rails stack - Kyobashi.rb #5
envek
1
420
CloudNativePGを布教したい
nnaka2992
0
120
Featured
See All Featured
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.2k
The Pragmatic Product Professional
lauravandoore
32
6.4k
Become a Pro
speakerdeck
PRO
26
5.2k
Building Adaptive Systems
keathley
40
2.4k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.3k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.2k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.2k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7.1k
Fireside Chat
paigeccino
35
3.2k
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Transcript
Reactive Events
You can do awesome things in PHP
$(".button").click(function() { $(".alert").show() .find(".label").html("You clicked a thing!"); });
var buttons = document.querySelectorAll(".button"); buttons.forEach(function(button) { button.addEventListener("click", function(event) { button.style.visibility
= "visible"; var label = document.querySelector(".button .label"); label.innerHTML = "You clicked a thing!"; }); });
Questions?
This works because of the... event loop
And now for something completely different
This works because... Apache
And then mod_php takes over...
So, NodeJS then?
var http = require("http"); http.createServer(function (request, response) { response.writeHead(200, {"Content-Type":
"text/plain"}); response.end("Hello World"); }) http.listen(1337, "127.0.0.1");
NodeJS takes on the roles of web server and request
processor!
var filesystem = require("fs"); filesystem.readFile("/etc/passwd", function (error, data) { if
(error) { throw err; } console.log(data); });
ReactPHP
Now we can do that NodeJS thing in PHP
PHP also has closures
Trouble is... NodeJS libraries are designed to be non-blocking
PHP is still mostly blocking
We can fix this in a few ways...
We can evolve PHP to have lots of non-blocking code
in core
We can develop patterns and libraries for parallel execution
Asynchronous vs. Parallel Fight!
None
None
None
NodeJS is asynchronous but not parallel
WAT then?!
Queues
Queues are one-way
Queues are weak
GIEF STREGNTH!
https://github.com/asyncphp/remit
Starts with events...
then adds queues...
Voilà!
$server = new AsyncPHP\Remit\Adapter\ZeroMQ\Server( // some boring guff ); $server->addListener("tick",
function ($event, $i) { print "TICK {$i}\n"; }); $server->addListener("done", function ($event) { print "DONE\n"; }); $loop->run();
$client = new AsyncPHP\Remit\Adapter\ZeroMQ\Client( // some more boring guff );
foreach (range(1, 5) as $i) { $loop->addTimer($i, function () use ($client, $i) { $client->emit("tick", $i); }); } $loop->addTimer(6, function () use ($client) { $client->emit("done"); }); $loop->run();
Distributed, non-blocking events for bi-directional communication with message queue workers
Reactive PHP events