SlideShare a Scribd company logo
1 of 62
PHPとシグナル
その裏側
2017/10/08
PHPカンファレンス 2017
do_aki
@do_aki
@do_aki
http://do-aki.net/
突然ですが
<?php
// loop.php
while(true) {
sleep(1);
}
// CLIで実行するとどうなる?
答え:無限ループ
※終了するにはCtrl+C
※終了するにはCtrl+C
(大事なことなのでもう一度)
なぜ、無限ループが
終了できるのか?
=> シグナルを受信したから
PHPとシグナルその裏側 目次
第1章
OSとシグナルのカンケイ
第2章
PHPにおけるシグナルハンドリング
第3章
PHPのシグナルにまつわる四方山話
環境について
• この資料は php 7.1.10 のコードを元に書いて
います
• OS の処理については Linux Kernel 2.6.15
(Linuxカーネル2.6解読室)をもとに、4.12 の
コードを参照しています(UNIX 系OSであれば大き
く変わらないと思うけど、細部は異なるかも)
OSとシグナルのカンケイ
「シグナルを受信する」ということ
• php 等のプログラムが受信する仕組みを用意
しているわけではない
• OS による強制的な割り込みによって
受信させられるというほうが近い
プログラムの実行
シグナル受信 OS による
割込み処理
どうやって割り込むのか
• 1つの CPU は同時に1つのコードしか実行でき
ないが、OS は複数のプログラムを同時に動かし
ているように見せるために短い時間でプロセスを
切り替えている
• OSは本来実行されるコードの合間にシグナルを処
理するためのコードを挟み込むことができる
プログラムは細切れに実行されている
Process A
Process B
Process C
Kernel(OS)
時間
タイマー割込み システムコール
[プロセスに制御を戻す前に、シグナル処理を挟み込むことがある]
シグナルとは
• (ほかの)プログラムやハードウェア等で発生した「何か」
を通知するための仕組み
• 起こらないかもしれない「何か」に備えて対策しておくのは
大変
– 割り込みという実装が便利
• 「何か」を番号と名前で区別
– 一般的に使われるシグナル番号は1-32
– ただし、番号は環境によって異なる場合がある
シグナルの種類(一部)
• SIGHUP (端末から切り離されるときなど)
• SIGINT (キーボードによる割込み / Ctrl+C)
• SIGTERM (終了)
• SIGKILL (強制終了)
• SIGSTOP (一時停止)
• SIGCONT (再開)
• SIGPIPE (パイプ破壊/切断ソケットへの出力等)
• SIGUSR1/SIGUSR2 (ユーザ定義シグナル)
• SIGWINCH (端末サイズ変更)
• SIGALRM (タイマー)
• SIGCHILD (子プロセスの状態変化)
• SIGSEGV (セグメンテーションフォールト)
• SIGFPE (浮動小数点演算例外/ゼロ除算など)
シグナルの利用例
• デーモンや時間のかかるコマンドの制御
– Webサーバの安全な停止や再起動
• apache httpd や nginx に SIGWINCH を送ると、リクエスト
の終了を待ってプログラムを終了
• ただし、例えば同じ SIGUSR1 でも、 apache htttpd の場合
は graceful restart するのに対し、 nginx は log re-
open ということもあるので注意
– dd 実行中に SIGUSR1 を送ると進捗表示
• 子プロセスの管理
– 子プロセスの状態が変化すると親プロセスはSIGCHILDを
受信
kill コマンド
• プロセスにシグナルを送るコマンド
• デフォルトで SIGTERM を送信
• 利用可能なシグナルは `kill –l` で確認できる
• pid:1234にSIGUSR1を送信 => `kill –USR1 1234`
• pid に -1 を指定すると pid:1 以外のすべてのプロ
セスに送信 (危険!)
シグナル受信時の
デフォルトの動作(一部)
• SIGHUP -> プログラム終了
• SIGINT -> プログラム終了
• SIGTERM -> プログラム終了
• SIGKILL -> プログラム終了
• SIGPIPE -> プログラム終了
• SIGUSR1 -> プログラム終了
• SIGUSR2 -> プログラム終了
• SIGWINCH -> プログラム終了
• SIGALRM -> プログラム終了
• SIGCHILD -> 無視
• SIGSEGV -> コアダンプして終了
• SIGFPE -> コアダンプして終了
まぁ、だいたい終了するんだわ
適切に制御しないと、
簡単に死ぬ
シグナル受信時の動作を制御
• プログラムは、シグナル受信時の動作をあらかじめ選択する
ことができる
– デフォルト
– 無視
– シグナルハンドラの実行(プログラム側で用意した処理を実行)
• ただし、 SIGKILL, SIGSTOP については動きを変えること
はできない(真の無限ループは作れないのです)
第1章まとめ
• シグナルは、OSによって制御されたソフトウェア
割込み
• 適切にハンドリングしないと、ほとんどのシグナ
ルは、プログラムを終了させる
• SIGKILL,SIGSTOP を除き、シグナルを受け取っ
た際の動作を デフォルト、無視、ユーザ定義 い
ずれかからあらかじめ指定することができる
PHPにおける
シグナルハンドリング
pcntl 拡張
• PHP でシグナルハンドリングするためには
pcntl拡張 が必要
• Windows では使えない
• `--enable-pcntl` コンパイルオプション
を指定してコンパイルしてあること
– コンパイル済みのバイナリの場合、CLI/CGI 以
外は無効になっている
pcntl_signal 関数
• シグナル受信時の動作を設定する
• $signo に シグナル番号 (SIGINT 定数な
ど) を指定
bool pcntl_signal (
int $signo ,
callable|int $handler ,
[bool $restart_syscalls = true]
)
$handler
• SIG_DFL (デフォルトの動作)
• SIG_IGN (シグナルを無視する)
• callable型 (PHPシグナルハンドラ)
• PHPシグナルハンドラは以下の引数を受け取る関数
– 第1引数: シグナル番号(signo)
– 第2引数: シグナル種類ごとの追加情報(siginfo) 7.1~
$restart_syscalls
• あまり気にする必要はない
• 待機系のシステムコール実行中にシグナ
ルを受信した際、そのシステムコールが
自動的に再開されるかどうか。 (true なら
sigaction 構造体の sa_flags に SA_RESTART が設定される)
• 一部のシステムコールは常に失敗する
• 普段何のシステムコールが呼ばれている
かを気にしたことがなければ無用の長物
かなと
// SIGUSR1 を無視
pcntl_signal(SIGUSR1, SIG_IGN);
// SIGINT のシグナルハンドラを設定
$terminate = false;
pcntl_signal(
SIGINT,
function ($signo, $siginfo) use(&$terminate) {
$terminate = true;
}
);
while(true) {
// 何らかの処理
if ($terminate) {
exit(); // 安全なタイミングで終了
}
}
[ 注意 ]
これだけでは、
PHPのシグナルハンドラは
実行されない
pcntl_signal 関数の動作
• $handler として callable型を渡した際、
pcntl_signal は、OS に対してシグナル受信時に
$handler が呼ばれるように設定しているわけではな
い
• 実際に OS に登録されるシグナルハンドラは
pcntl_signal_handler というC関数
• $handler は別途 php 内部のシグナルテーブルに記
録される
pcntl_signal 呼び出し時
PHP_FUNCTION
(pcntl_signal)
SIGINT のシグナルハンドラと
して pcntl_signal_handler
(Cの関数) をOSに登録
pcntl_signal(SIGINT, $handler)
SIGHUP NULL
SIGINT $handler
SIGALRM NULL
……
php signal table
内部のテーブルに
$hander を登録
[PHP Script]
[PHP Internal]
シグナル受信時
pcntl_signal_handler
内部のキューにシグナル番号を追加するだけ
[PHP Script]
[PHP Internal]
signo
signal queue
(シグナル受信時 PHP Script 側への影響は一切ない)
OSのシグナルハンドラの制約
• 安全に利用可能なシステムコールが制限
されている
– 安全でないシステムコールを呼び出した場合の動作
は未定義
• デッドロックやレースコンディションを
起こすことがある
– php スクリプトの動きが意図しない挙動になる可能
性がある
シグナルディスパッチ
• pcntl拡張は、安全なタイミングで php のシグナルハンドラ
($handler)が実行されるように調整
• pcntl_signal_dispatch (C関数)で実装されている
• pcntl_signal_dispatch は、何もしなければ呼ばれない
=> 実行のタイミングを PHPスクリプト側であらかじめ設
定しておく必要がある
シグナルディスパッチ
pcntl_signal_dispatch
$handler(SIGINT, [$siginfo])
SIGHUP NULL
SIGINT $handler
SIGALRM NULL
……
php signal table
[PHP Script]
[PHP Internal]
signal queue
signo
取り出したシグナ
ル番号で参照、該
当する関数を実行
シグナルディスパッチのタイミング
• pcntl_signal_dispatch (php関数)を
呼び出したとき
• N回 tick する毎 (declare(tick=N))
• pcntl_async_signals(true) を呼び出
した後、ほぼ常に
手動
自動
pcntl_signal_dispatch()
• PHP スクリプトから呼び出せる同名の関数が、 内部の
pcntl_signal_dispatch を呼ぶラッパーとなっている
• シグナルを処理したいタイミングに都度記述する必要がある
• 5.3 以上で利用可能になった
• tick を利用せずにディスパッチするための仕組みとして導
入された
https://marc.info/?l=php-internals&m=121716684606195
https://github.com/php/php-src/commit/204fcbe5d3ffb4a9c1383e39f7549b8326801894
tick
• 1ステートメント実行する毎(※)に発生するイベント
(php の機能)
• `declare(ticks=N)`を宣言することで有効になり、
N回 tick するたびに、あらかじめ登録しておいた処
理が実行される
• php スクリプトからは register_tick_function
を使って実行される関数やメソッドを登録できる
※厳密には、tick されないステートメントもあるが、大体はセミコロン毎と考えてよい
tick を利用した
シグナルディスパッチ
• pcntl 拡張は初期化時、tickを利用するかどう
かに関わらず pcntl_signal_dispatch (C関数)
が実行されるよう登録している (4.3-)
• tick が有効な範囲において Nステートメントご
とにディスパッチされる
• 現存するシグナルディスパッチの仕組みで最古
declare(ticks=1)declare(ticks=1);
echo 1;
echo 2;
echo 3;
pcntl_signal_dispatch();
echo 1;
pcntl_signal_dispatch();
echo 2;
pcntl_signal_dispatch();
echo 3;
pcntl_signal_dispatch();大体同じ
tick の有効範囲
• declare は、ファイルの先頭に記述するか、あるい
はブロックで指定
• ファイルを越えて有効になる
ことはない (tick の有効性は
コンパイル時に確定するため)
• 関数を呼び出しても、呼び出し
た先が tick 有効範囲外なら
ば、ディスパッチされない
declare(ticks=1) {
// tick 有効
func();
}
function func() {
// tick 無効
}
シグナルがディスパッチされない
ことによる問題
• pcntl拡張 が保持できるシグナルは 32個だけ (signal
queue の数が固定)
• 長時間ディスパッチされないと、超過した分のシグナルは捨
てられる
• signal queue にシグナルがたまった状態で fork すると、
子プロセスで受け取っていないはずのシグナルを処理するこ
とも
pcntl_async_signals(true)
• これを実行しておくと、`pcntl_async_signals(false)`
しない限り、ほぼ常にディスパッチされるイメージ
• (実際には、シグナルを受信したら PHP VM の各命令実行毎
にディスパッチされる)
• 7.1 から利用可能
• tick よりも細かい粒度でディスパッチされるが、タイムア
ウトを実装するための仕組みを流用しているため、低負荷。
pcntl_async_signals(true)時の裏の動き
• シグナルを受信すると、EG(vm_interrupt) フラグ
を立てる
• PHP VM が1命令実行するたびに、
EG(vm_interrupt) フラグをチェックし、立ってい
れば、zend_interrupt_function を実行
• pcntl 拡張は、初期化時に
zend_interrupt_function をフックし、そこで
pcntl_signal_dispatch を呼んでいる
pcntl_async_signals(true)時の
シグナル受信
pcntl_signal_handler
内部のキューにシグナル番号を追加し、
vm_interrupt フラグを立てる
[PHP Script]
[PHP Internal]
signo
signal queue
(シグナル受信時 PHP Script 側への影響は一切ない)
vm_interrupt
このフラグを PHP VM
が都度確認している
ベンチマーク
php ソースコード付属の Zend/bench.php
1. そのまま実行 (normal)
2. `declare(ticks=1)` を先頭に付与して実行(tick)
3. `pcntl_async_signals(true)` を先頭に付与して実行 (async)
Total (合計秒) をスコアとし、10回計測した平均を比較した
(VPS 上での実行なのであくまで参考程度に)
結果
• normal と async の差は誤差範囲内(のはずだけどなぜか async のほうが
早くなることが多い。。。)
• tick が明らかに遅いことが明白
1.9944
(100%)
2.5078
(126%)
1.9558
(98%)
0
0.5
1
1.5
2
2.5
3
normal tick async
bench.php (Total)
第2章まとめ
• PHP では `pcntl_signal` でシグナルを制御できる
• PHPのシグナルハンドラは、実行タイミングを調整す
ることで安全に動作するように制御されている
• 歴史的な事情により、シグナルディスパッチのタイミ
ングを制御する方法は複数ある
• 7.1以降は `pcntl_async_signals(true)` のみで
OK
PHPのシグナルにまつわる
四方山話
php のタイムアウト
• max_execution_time や set_time_limit で設定できる
• php スクリプト自身が使った処理時間が指定時間を経過する
と `PHP Fatal error: Maximum execution time of X
second exceeded`
(Windows の場合は、処理時間ではなく経過した時間)
• 他のプログラミング言語ではあまりみない
php のタイムアウト2
• Linux 系ではインターバルタイマーのプロファイルという仕
組みを利用
• プログラムが一定時間CPUを使うと SIGPROF を受信
• `set_time_limit(0)` してても、SIGPROF を受け取ると
timeout
• SIGPROF を 無視したり、シグナルハンドラを設定すると
timeout しなくなる
php からシグナルを送る方法
• posix 拡張 (Windows環境を除く)
• 自分自身に送ることもできる
`posix_kill(getmypid(), SIGPROF)`
bool posix_kill (int $pid , int $sig)
pcntl_alarm
• 指定秒数後に SIGALRM が自身に送られてくるよ
うに設定する
• `pcntl_alarm(10)`
• 同期処理のタイムアウトに利用できて便利
• SIGALRM のデフォルトの動作はプログラム終了な
ので、 SIGALRM を適切にハンドリングしておか
ないとただの時限爆弾
SIGBABY
• pcntl拡張は OS (というか posix) に定義されてい
ないシグナルが存在する
• 番号としては SIGSYS と同じ
• コミットログとは直接関係ない修正なので、誤って混
入したか、あるいはDerick氏によるjokeではないか
とのこと
– https://github.com/php/php-
src/commit/ea83d64507b6470eb654fbd75e614319abb4
03ed#diff-7185d47849fdb94217f22977d69e85b1R158
– https://stackoverflow.com/a/18584728
シグナルのマスク
• 特定のシグナルを一時的に保留することができる
(シグナルをマスクする)
• `pcntl_sigprocmask` で設定
• pctrl 拡張ではなく OS がシグナルを保留する
• 保留を解除すると保留中に受け取っていたシグナ
ルが送信されてくる
ZEND_SIGNAL
• 7.1 以降は ZEND_SIGNAL がデフォルトで有効
• pcntl拡張 <-> ZEND_SIGNAL <-> OS
• OS に設定するシグナルハンドラをさらにフック
し、タイミングを制御
• php スクリプト側への影響はほとんどない
– SIGKILL, SIGSTOP に対して pcntl_signal
– 7.0まで:Warning、 7.1以降:Fatal Error
最後に
• php におけるシグナル制御を中心にシグ
ナルについて話しました
• php でシグナルを扱う必要が生まれた時
の一助になれば幸い
• もっと深い話は闇PHP勉強会等で……
(blank)
4.3以前のシグナルディスパッチ
• ZEND_EXT_STMT のタイミングでディスパッチ
• tick が tickを有効にしたときのみ
ZEND_TICKS を挟み込むのに対し、こちらは(コ
ンパイル時のオプションを設定することで、)
コード全体に作用
• pcntl拡張を組み込むだけでコード全体が速度低
下していた
$siginfo について
• PHPシグナルハンドラの第2引数として渡
される (7.1-)
• 環境によっては常に null
• シグナル種別ごとに異なる情報が array
となってやってくる
$siginfo について2
• 共通
– signo: int シグナル番号 (si_signo)
– errno: int エラー番号 (si_errno)
– code: int シグナルが送信された理由 (si_code)
• SI_USER(killコマンド等ユーザランドから送信)
• SI_KERNEL(カーネルから送信) など
• SIGCHLD の場合は、CLD_EXITED(子プロセスが通常終了),
CLD_KILLED(子プロセスがkill), CLD_STOPPED(プロセス
が停止)など
$siginfo について3
• SIGCHLD のみ
– status: int (si_status)
• 終了ステータス あるいは 状態が変化する原因となったシグ
ナル番号
– utime: float (si_utime)
– stime: float (si_stime)
– pid: int (si_pid) 子プロセスのpid
– uid: int (si_uid) 子プロセスの実ユーザID
$siginfo について4
• SIGUSR1/SIGUSR2 のみ
– pid: int (si_pid) 送信したプロセスのpid
– uid: int (si_uid) 送信したユーザID
• SIGILL/SIGFPE/SIGSEGV/SIGBUS のみ
– addr: float (si_addr) fault の発生したアドレス(なぜかzend_long でキャス
トしてから add_assoc_double_ex)
• SIGPOLL のみ
– band: int (si_band)
– fd: int (si_fd)

More Related Content

What's hot

Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
サーバーサイド Kotlin のテストフレームワーク事情
サーバーサイド Kotlin のテストフレームワーク事情サーバーサイド Kotlin のテストフレームワーク事情
サーバーサイド Kotlin のテストフレームワーク事情Shinya Mochida
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれKumazaki Hiroki
 
Gitの便利ワザ
Gitの便利ワザGitの便利ワザ
Gitの便利ワザktateish
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
ELFの動的リンク
ELFの動的リンクELFの動的リンク
ELFの動的リンク7shi
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)NTT DATA Technology & Innovation
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~NTT DATA OSS Professional Services
 
本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown本当にわかる Spectre と Meltdown
本当にわかる Spectre と MeltdownHirotaka Kawata
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話Yoshinori Matsunobu
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話y-uti
 
Spring CloudとZipkinを利用した分散トレーシング
Spring CloudとZipkinを利用した分散トレーシングSpring CloudとZipkinを利用した分散トレーシング
Spring CloudとZipkinを利用した分散トレーシングRakuten Group, Inc.
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersSeiya Mizuno
 
Linuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違いLinuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違いRetrieva inc.
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 

What's hot (20)

Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
サーバーサイド Kotlin のテストフレームワーク事情
サーバーサイド Kotlin のテストフレームワーク事情サーバーサイド Kotlin のテストフレームワーク事情
サーバーサイド Kotlin のテストフレームワーク事情
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
Gitの便利ワザ
Gitの便利ワザGitの便利ワザ
Gitの便利ワザ
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
ELFの動的リンク
ELFの動的リンクELFの動的リンク
ELFの動的リンク
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
 
本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話
 
Spring CloudとZipkinを利用した分散トレーシング
Spring CloudとZipkinを利用した分散トレーシングSpring CloudとZipkinを利用した分散トレーシング
Spring CloudとZipkinを利用した分散トレーシング
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
 
いつやるの?Git入門
いつやるの?Git入門いつやるの?Git入門
いつやるの?Git入門
 
Linuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違いLinuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違い
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 

Viewers also liked

OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今y-uti
 
LancersのCakePHPバージョンアップ施策について
LancersのCakePHPバージョンアップ施策についてLancersのCakePHPバージョンアップ施策について
LancersのCakePHPバージョンアップ施策についてShigemasa Akiyama
 
PHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったことPHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったことYoshio Hanawa
 
PHP Version Up と AWS への移行
PHP Version Up と AWS への移行PHP Version Up と AWS への移行
PHP Version Up と AWS への移行gree_tech
 
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則Hiroshi Tokumaru
 
片手間MySQLチューニング戦略
片手間MySQLチューニング戦略片手間MySQLチューニング戦略
片手間MySQLチューニング戦略yoku0825
 
PHPアプリの品質を(ある程度)保つために出来る事 〜組織編〜
PHPアプリの品質を(ある程度)保つために出来る事 〜組織編〜PHPアプリの品質を(ある程度)保つために出来る事 〜組織編〜
PHPアプリの品質を(ある程度)保つために出来る事 〜組織編〜Katsuhiro Miura
 
営業・運用を支える "気付ける" 管理画面
営業・運用を支える "気付ける" 管理画面営業・運用を支える "気付ける" 管理画面
営業・運用を支える "気付ける" 管理画面Masao Maeda
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数Wataru Terada
 
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
『例えば、PHPを避ける』以降PHPはどれだけ安全になったかHiroshi Tokumaru
 
みんなそろそろ707やめようぜ (;´Д`)
みんなそろそろ707やめようぜ (;´Д`)みんなそろそろ707やめようぜ (;´Д`)
みんなそろそろ707やめようぜ (;´Д`)Yasutaka Hamada
 
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い sasezaki
 
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。sasezaki
 
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015ichikaway
 
いまどきのPHP開発現場 -2015年秋-
いまどきのPHP開発現場 -2015年秋-いまどきのPHP開発現場 -2015年秋-
いまどきのPHP開発現場 -2015年秋-Masashi Shinbara
 
PHPの今とこれから2015
PHPの今とこれから2015PHPの今とこれから2015
PHPの今とこれから2015Rui Hirokawa
 

Viewers also liked (17)

OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今
 
phpcon2017 LT01 MDD
phpcon2017 LT01 MDDphpcon2017 LT01 MDD
phpcon2017 LT01 MDD
 
LancersのCakePHPバージョンアップ施策について
LancersのCakePHPバージョンアップ施策についてLancersのCakePHPバージョンアップ施策について
LancersのCakePHPバージョンアップ施策について
 
PHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったことPHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったこと
 
PHP Version Up と AWS への移行
PHP Version Up と AWS への移行PHP Version Up と AWS への移行
PHP Version Up と AWS への移行
 
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
 
片手間MySQLチューニング戦略
片手間MySQLチューニング戦略片手間MySQLチューニング戦略
片手間MySQLチューニング戦略
 
PHPアプリの品質を(ある程度)保つために出来る事 〜組織編〜
PHPアプリの品質を(ある程度)保つために出来る事 〜組織編〜PHPアプリの品質を(ある程度)保つために出来る事 〜組織編〜
PHPアプリの品質を(ある程度)保つために出来る事 〜組織編〜
 
営業・運用を支える "気付ける" 管理画面
営業・運用を支える "気付ける" 管理画面営業・運用を支える "気付ける" 管理画面
営業・運用を支える "気付ける" 管理画面
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
 
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
 
みんなそろそろ707やめようぜ (;´Д`)
みんなそろそろ707やめようぜ (;´Д`)みんなそろそろ707やめようぜ (;´Д`)
みんなそろそろ707やめようぜ (;´Д`)
 
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
 
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
 
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015脆弱性もバグ、だからテストしよう PHPカンファンレス2015
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
 
いまどきのPHP開発現場 -2015年秋-
いまどきのPHP開発現場 -2015年秋-いまどきのPHP開発現場 -2015年秋-
いまどきのPHP開発現場 -2015年秋-
 
PHPの今とこれから2015
PHPの今とこれから2015PHPの今とこれから2015
PHPの今とこれから2015
 

Similar to PHPとシグナル、その裏側

signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かdo_aki
 
オペレーティングシステム 第1回-公開用
オペレーティングシステム 第1回-公開用オペレーティングシステム 第1回-公開用
オペレーティングシステム 第1回-公開用Ruo Ando
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門Yosuke Onoue
 
【学習メモ#9th】12ステップで作る組込みOS自作入門
【学習メモ#9th】12ステップで作る組込みOS自作入門 【学習メモ#9th】12ステップで作る組込みOS自作入門
【学習メモ#9th】12ステップで作る組込みOS自作入門 sandai
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23Masashi Shibata
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLakirahiguchi
 
【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門 【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門 sandai
 
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
NGS解析を始めた時にぶつかりがちな小さい壁あれこれNGS解析を始めた時にぶつかりがちな小さい壁あれこれ
NGS解析を始めた時にぶつかりがちな小さい壁あれこれDNA Data Bank of Japan center
 
リアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズリアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズKazuhiro Takahashi
 
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 sandai
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめMakiko Konoshima
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Hiraku Toyooka
 
MINCS – containers in the shell script
MINCS – containers in the shell scriptMINCS – containers in the shell script
MINCS – containers in the shell scriptMasami Hiramatsu
 
Stellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイドStellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイドryos36
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するshigeki_ohtsu
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件yaegashi
 
C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml ssuser3a4b8c
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1信之 岩永
 
PG-REXで学ぶPacemaker運用の実例
PG-REXで学ぶPacemaker運用の実例PG-REXで学ぶPacemaker運用の実例
PG-REXで学ぶPacemaker運用の実例kazuhcurry
 

Similar to PHPとシグナル、その裏側 (20)

signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
 
オペレーティングシステム 第1回-公開用
オペレーティングシステム 第1回-公開用オペレーティングシステム 第1回-公開用
オペレーティングシステム 第1回-公開用
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
 
【学習メモ#9th】12ステップで作る組込みOS自作入門
【学習メモ#9th】12ステップで作る組込みOS自作入門 【学習メモ#9th】12ステップで作る組込みOS自作入門
【学習メモ#9th】12ステップで作る組込みOS自作入門
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
 
【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門 【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門
 
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
NGS解析を始めた時にぶつかりがちな小さい壁あれこれNGS解析を始めた時にぶつかりがちな小さい壁あれこれ
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
 
リアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズリアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズ
 
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門
 
Mt basic as-os_on_danbot
Mt basic as-os_on_danbotMt basic as-os_on_danbot
Mt basic as-os_on_danbot
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
 
MINCS – containers in the shell script
MINCS – containers in the shell scriptMINCS – containers in the shell script
MINCS – containers in the shell script
 
Stellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイドStellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイド
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件
 
C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
 
PG-REXで学ぶPacemaker運用の実例
PG-REXで学ぶPacemaker運用の実例PG-REXで学ぶPacemaker運用の実例
PG-REXで学ぶPacemaker運用の実例
 

More from do_aki

Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話do_aki
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方do_aki
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とdo_aki
 
再考:列挙型
再考:列挙型再考:列挙型
再考:列挙型do_aki
 
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)do_aki
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説do_aki
 
Writing php extensions in golang
Writing php extensions in golangWriting php extensions in golang
Writing php extensions in golangdo_aki
 
php7's ast
php7's astphp7's ast
php7's astdo_aki
 
N対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer HintN対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer Hintdo_aki
 
20150212 プレゼンテーションzen
20150212 プレゼンテーションzen20150212 プレゼンテーションzen
20150212 プレゼンテーションzendo_aki
 
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」do_aki
 
20141017 introduce razor
20141017 introduce razor20141017 introduce razor
20141017 introduce razordo_aki
 
20141011 mastering mysqlnd
20141011 mastering mysqlnd20141011 mastering mysqlnd
20141011 mastering mysqlnddo_aki
 
php in ruby
php in rubyphp in ruby
php in rubydo_aki
 
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!do_aki
 
N:1 Replication meets MHA
N:1 Replication meets MHAN:1 Replication meets MHA
N:1 Replication meets MHAdo_aki
 
Php radomize
Php radomizePhp radomize
Php radomizedo_aki
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...do_aki
 
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editorセキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editordo_aki
 
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~do_aki
 

More from do_aki (20)

Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話Tritonn から Elasticsearch への移行話
Tritonn から Elasticsearch への移行話
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
再考:列挙型
再考:列挙型再考:列挙型
再考:列挙型
 
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
Writing php extensions in golang
Writing php extensions in golangWriting php extensions in golang
Writing php extensions in golang
 
php7's ast
php7's astphp7's ast
php7's ast
 
N対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer HintN対1 レプリケーション + Optimizer Hint
N対1 レプリケーション + Optimizer Hint
 
20150212 プレゼンテーションzen
20150212 プレゼンテーションzen20150212 プレゼンテーションzen
20150212 プレゼンテーションzen
 
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
 
20141017 introduce razor
20141017 introduce razor20141017 introduce razor
20141017 introduce razor
 
20141011 mastering mysqlnd
20141011 mastering mysqlnd20141011 mastering mysqlnd
20141011 mastering mysqlnd
 
php in ruby
php in rubyphp in ruby
php in ruby
 
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!
 
N:1 Replication meets MHA
N:1 Replication meets MHAN:1 Replication meets MHA
N:1 Replication meets MHA
 
Php radomize
Php radomizePhp radomize
Php radomize
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
 
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editorセキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
 
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~マスタN対スレーブ1レプリケーションの作り方 ~あれから~
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
 

PHPとシグナル、その裏側

Editor's Notes

  1. いろんなマイクロベンチスクリプトを集めたもの。