Slide 1

Slide 1 text

So that the daemon won’t die Long running processes and PHP Leszek Krupiński 4developers 2017

Slide 2

Slide 2 text

LEAFNODE

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

.pl /PHPersPL +grupy

Slide 5

Slide 5 text

Why What How

Slide 6

Slide 6 text

Why What How

Slide 7

Slide 7 text

Processing

Slide 8

Slide 8 text

• long running • queue workers • event-driven jobs • repeated tasks • services

Slide 9

Slide 9 text

Long-running processes in PHP?

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

MEMLEAKS SLOW NESS EASE PHP

Slide 12

Slide 12 text

Time change PHP change

Slide 13

Slide 13 text

Common codebase Common skills

Slide 14

Slide 14 text

Profiling

Slide 15

Slide 15 text

What

Slide 16

Slide 16 text

Controlled state Is it runinng Status Event log Restart

Slide 17

Slide 17 text

Low-entry solutions

Slide 18

Slide 18 text

Cron

Slide 19

Slide 19 text

Well…

Slide 20

Slide 20 text

Everything's on you

Slide 21

Slide 21 text

Is it starting? Does it do anything?

Slide 22

Slide 22 text

Logging Monitoring Locking

Slide 23

Slide 23 text

1 minute resolution

Slide 24

Slide 24 text

On the other hand - PHP is meant to die

Slide 25

Slide 25 text

Queue

Slide 26

Slide 26 text

Can act as cron too!

Slide 27

Slide 27 text

Real daemons

Slide 28

Slide 28 text

1. Keep working 2. Exit nicely 3. Restart if needed

Slide 29

Slide 29 text

"the loop"

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

Respond to signals

Slide 36

Slide 36 text

pcntl_signal() declare() / pcntl_signal_dispatch()

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

Running daemons

Slide 40

Slide 40 text

Fork

Slide 41

Slide 41 text

• redirect streams / close descriptors • fork • detach from console • respond to signals • close nicely

Slide 42

Slide 42 text

1. Call umask(0) to prevent permission issues. 2. fork() and have the parent exit. 3. Call setsid(). 4. Setup signal processing of SIGHUP and SIGTERM. 5. fork() again and have the parent exit. 6. Change the current working dir with chdir(). 7. fclose() stdin, stdout and stderr and don't write to them. 8. Process!

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

nohup

Slide 45

Slide 45 text

No content

Slide 46

Slide 46 text

init.d

Slide 47

Slide 47 text

1.starts the process 2.drops into background 3.logs output

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

Upstart

Slide 50

Slide 50 text

/etc/init/foo.conf

Slide 51

Slide 51 text

/etc/init/foo.conf

Slide 52

Slide 52 text

systemd

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

supervisord

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

supervisorctl

Slide 57

Slide 57 text

web interface

Slide 58

Slide 58 text

Monitoring

Slide 59

Slide 59 text

No content

Slide 60

Slide 60 text

memory_get_usage()

Slide 61

Slide 61 text

Log performance

Slide 62

Slide 62 text

statsd, influxdb, grafana

Slide 63

Slide 63 text

No content

Slide 64

Slide 64 text

No content

Slide 65

Slide 65 text

https://github.com/ samuelebistoletti/docker- statsd-influxdb-grafana

Slide 66

Slide 66 text

Data from OS: collectd

Slide 67

Slide 67 text

Log Events

Slide 68

Slide 68 text

Monolog ! syslog ! logstash ! graylog2 / kibana

Slide 69

Slide 69 text

No content

Slide 70

Slide 70 text

Questions?

Slide 71

Slide 71 text

Thanks! @leafnode http://speakerdeck.com/leafnode/