SlideShare une entreprise Scribd logo
1  sur  49
Télécharger pour lire hors ligne
PHPでマルチスレッドPHPでマルチスレッド
Shizuoka.php #2
@karky7
2020/02/08
1
自己紹介 其ノ一自己紹介 其ノ一
twitter: @karky7
2
自己紹介 其ノ二自己紹介 其ノ二
contribute
gentoo-haskellコミッタ
日本OpenSolarisユーザーグループ会
キリン一番搾り売上貢献
取得免許
無免許運転免許
第2種アル中ハイマー
●●3級
3
PHPのThreadPHPのThread
4
PECL pthreadsPECL pthreads
なんと、PHP 7.4以降で非推奨になったらしい
5
PECL ParallelPECL Parallel
これからは、これ使えと…
6
ということで簡単に調べてみました
7
平行性と並列性平行性と並列性
平行(Concurrent)
マルチコアを利用した方法
並列(Parallel)
スレッドを利用した方法
※ Haskellによる並列・平行プログラミングから
8
PHPの内部についておさらいPHPの内部についておさらい
9
大きく3つのコンポーネント大きく3つのコンポーネント
SAPI - Server API
フロントの違いを吸収するインターフェース層
Zend Core
PHPのほとんど
extension
PECLモジュールなどsoで外部からロードされるモジュール
10
PHPPHP
11
ZTS - Zend Thread SafeZTS - Zend Thread Safe
PHPをThread Safeで実行できるようにすることPHPをThread Safeで実行できるようにすること
12
ZTS - Zend Thread SafeZTS - Zend Thread Safe
configureで指定する必要がある
--enable-maintainer-zts
13
ZTS - Zend Thread SafeZTS - Zend Thread Safe
Thread Safe版
ZTSの表記が出力される
~ $ php --version
PHP 7.3.14 (cli) (built: Jan 26 2020 22:28:54) ( ZTS DEBUG )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.14, Copyright (c) 1998-2018 Zend Technologies
14
NTS - Zend Non Thread SafeNTS - Zend Non Thread Safe
Non Thread Safe版
NTSの表記が出力される
~ $ php --version
PHP 7.3.14 (cli) (built: Jan 26 2020 07:47:07) ( NTS DEBUG )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.14, Copyright (c) 1998-2018 Zend Technologies
15
PECL ParallelのインストールPECL Parallelのインストール
ビルドと設定
/etc/php/cli-php7.3/php.ini
$ cd parallel-1.1.3/
~/parallel-1.1.3 $ phpize
~/parallel-1.1.3 $ ./configure
~/parallel-1.1.3 $ make
~/parallel-1.1.3 # make install
extension=parallel
16
Thread SafeとはThread Safeとは
マルチスレッドでも壊れず動くことを保証すること
17
Thread unsafe functionsThread unsafe functions
余談ではありますが、Cの標準ライブラリにある
getenv
gethostbyname
gettime
localtime
などの関数はスレッドに対して安全ではないとされています
18
Thread functionsThread functions
マルチスレッドで利用する場合
スレッドアンセーフ版
rand
スレッドセーフ版
rand_r
使い分けが必要になる場合があります、manコマンドで確認してみる
のが良いでしょう
19
本題に戻って、Parallelのスレッド処理をちょっと覗いてみる
20
PHPコードPHPコード
子スレッドが実行する、クロージャ関数の定義
続く
<?php
use parallelRuntime;
$thread_function = function($args) {
echo "Child thread start.n";
sleep(2);
echo "thread 2sec sleep.n";
};
...
21
続コード続コード
親スレッドが子スレッドを生成するmainコード
// ...
try {
$r1 = new Runtime();
$args = array();
$args[0] = "Zero";
$args[1] = "One";
$r1->run($thread_function, $args);
echo "nEnd of main.n";
} catch (Error $err) {
echo "nError:", $err->getMessage();
} catch (Exception $e) {
echo "nException:", $e->getMessage();
}
22
実行してみる実行してみる
~/Code/lwl/php/parallel $ php parallel.php
End of main
Child thread start.
thread 2sec sleep
~/Code/lwl/php/parallel $
23
pthread - POSIX Threadpthread - POSIX Thread
Parallelが内部的に利用している、マルチスレッドライブラリ
PHPのコードに合わせて追っかけてみる
24
スレッドの生成 – 親スレッドスレッドの生成 – 親スレッド
Runtimeオブジェクトのインスタンス化と同時に子スレッドが生成さ
れ、そのときruntime変数を親スレッドと子スレッドで共有します
子スレッドはphp_parallel_threadから処理を開始
$r1 = new Runtime();
PHP_METHOD(Runtime, __construct)
...
if (pthread_create(&runtime->thread, NULL, php_parallel_thread, runtime)
!= SUCCESS) {
25
pthread_createpthread_create
子スレッドを作成し、スレッドハンドルを返す、子スレッドには引数を1
つ渡す
26
php_parallel_runtime_t構造体php_parallel_runtime_t構造体
typedef struct _php_parallel_runtime_t {
pthread_t thread; // 子スレッドID
php_parallel_monitor_t *monitor; // 同期プリミティブ
zend_string *bootstrap;
struct {
zend_bool *interrupt;
} child;
struct {
void *server;
} parent;
zend_llist schedule; // タスクリスト
zend_object std;
} php_parallel_runtime_t;
27
php_parallel_monitor_t構造体php_parallel_monitor_t構造体
排他オブジェクト(mutex)、状態変数(condition)を利用して、runtime
に対するアクセスをスレッドセーフにしている
stateは現在このオブジェクトがどの状態かを保存する
typedef struct _php_parallel_monitor_t {
pthread_mutex_t mutex; // 排他制御
pthread_cond_t condition; // 状態変数
volatile int32_t state;
} php_parallel_monitor_t;
28
php_parallel_monitor_wait関数 – 親スレッドphp_parallel_monitor_wait関数 – 親スレッド
runtimeオブジェクトに格納されているstatusをチェックするため
mutexロックを取得
if (pthread_mutex_lock(&monitor->mutex) != SUCCESS) { // mutex取得
return FAILURE;
}
while (!(changed = (monitor->state & state))) {
// PHP_PARALLEL_READY|PHP_PARALLEL_FAILURE 以外の場合(子スレッド初期化中)
if ((rc = pthread_cond_wait(
&monitor->condition, &monitor->mutex)) != SUCCESS) {
pthread_mutex_unlock(&monitor->mutex);
return FAILURE;
}
} // 正常に子スレッドが生成されたら、stateを初期化クリア状態セットし
// mutexのロック解除しPHPの内部へ戻る
29
pthread_mutex_lockpthread_mutex_lock
ロックされていないmutexをロックする、既に他のスレッドによってロッ
クされている場合、呼出側のスレッドをブロックする
30
pthread_cond_waitpthread_cond_wait
指定されたmutexをロック解除し、呼出側スレッドを待ち状態にする、
指定された状態変数に他のスレッドからシグナルが送られるか、ブロ
ードキャストが行われたとき、mutexを再取得し、呼び出したスレッド
を再開させる
31
php_parallel_thread – 子スレッドphp_parallel_thread – 子スレッド
statusをPHP_PARALLEL_READY|PHP_PARALLEL_RUNNINGへアトミッ
クに変更
親が初期化待ちでwaitしている場合、pthread_cond_signalで親スレ
ッドを起こします
void php_parallel_monitor_set(php_parallel_monitor_t *monitor, int32_t state)
{
// state = PHP_PARALLEL_READY|PHP_PARALLEL_RUNNING
pthread_mutex_lock(&monitor->mutex);
monitor->state |= state;
pthread_cond_signal(
&monitor->condition);
pthread_mutex_unlock(&monitor->mutex);
}
32
pthread_cond_signalpthread_cond_signal
状態変数に関して待ち状態にあるスレッドを、少なくとも1つブロック
を解除する、どのスレッドが起こされるかはスケジュールの優先度に
よって決まる
33
php_parallel_thread – 子スレッドphp_parallel_thread – 子スレッド
処理すべきタスクをruntime->scheduleのzend_llistというリンクリスト
から取得します
タスクはel構造体に詰められ、取得できた場合、リンクリストから除去
されます
php_parallel_schedule_el_t el;
while (!php_parallel_scheduler_pop(runtime, &el)) {
34
php_parallel_schedule_el_t構造体php_parallel_schedule_el_t構造体
PHPのネイティブなzend_execute_data構造体をラップしているもの
typedef struct _php_parallel_schedule_el_t {
zend_execute_data *frame;
} php_parallel_schedule_el_t;
35
php_parallel_thread – 子スレッドphp_parallel_thread – 子スレッド
タスクがない場合、statusからPHP_PARALLEL_RUNNINGを外した後
PHP_PARALLEL_EXEC | PHP_PARALLEL_CLOSE |
PHP_PARALLEL_KILLED以外の場合、スレッドは停止
while (!(changed = (monitor->state & state))) {
if ((rc = pthread_cond_wait(
&monitor->condition, &monitor->mutex)) != SUCCESS) {
return FAILURE;
}
}
36
php_parallel_thread – 子スレッドphp_parallel_thread – 子スレッド
タスクがとれた場合、statusをPHP_PARALLEL_RUNNINGに更新し、タ
スクを実行します
frameに格納されている、PHPで設定されたthread関数(Closure)を実
行します
php_parallel_scheduler_run(runtime, el.frame);
static void php_parallel_scheduler_run(php_parallel_runtime_t *runtime,
zend_execute_data *frame) {
...
zend_execute_ex(frame);
37
タスクの追加 – 親スレッドタスクの追加 – 親スレッド
子スレッドが処理すべきタスクの追加をrun関数でおこないます
$args = array();
$args[0] = "Zero";
$args[1] = "One";
$r1->run($thread_function, $args);
38
タスクの追加 – 親スレッドタスクの追加 – 親スレッド
closureオブジェクト、thread関数の引数、戻り値を引数にタスクの追
加を実行します
PHP_METHOD(Runtime, run)
{
...
php_parallel_scheduler_push(runtime, closure, argv, return_value);
...
39
php_parallel_scheduler_add – 親スレッドphp_parallel_scheduler_add – 親スレッド
引数や関数のチェックを行った後に、zend_llistへタスクを追加します
static zend_always_inline void php_parallel_scheduler_add(
php_parallel_runtime_t *runtime,
const zend_function *function,
zval *argv,
php_parallel_future_t *future) {
php_parallel_schedule_el_t el;
...
zend_llist_add_element(&runtime->schedule, &el);
...
40
php_parallel_scheduler_add – 親スレッドphp_parallel_scheduler_add – 親スレッド
タスク追加後に、statusにPHP_PARALLEL_EXECを立てます
子スレッドがタスクを確認した直後に親がタスクを追加した場合に、
php_parallel_monitor_wait_lockedでwaitせず処理を続行できるよ
うになります
php_parallel_monitor_set(runtime->monitor, PHP_PARALLEL_EXEC);
41
php_parallel_monitor_set – 親スレッドphp_parallel_monitor_set – 親スレッド
逆に子スレッドが寝ている場合、conditon変数に対してsignalを送り
寝ている子スレッドを起こします
正常にタスクを追加完了した場合、親スレッドはPHPの内部へ戻りま
す
void php_parallel_monitor_set(php_parallel_monitor_t *monitor, int32_t state)
{
pthread_mutex_lock(&monitor->mutex);
monitor->state |= state;
pthread_cond_signal(
&monitor->condition);
pthread_mutex_unlock(&monitor->mutex);
}
42
終了処理終了処理
親スレッドは生成した子スレッドの終了ステータスを回収します
意図的にclose()を呼び出した場合、pthread_joinで回収します
(close()しない場合は調べてないので不明です)
void php_parallel_scheduler_join(php_parallel_runtime_t *runtime, zend_bool
kill) {
...
php_parallel_monitor_set(runtime->monitor, PHP_PARALLEL_CLOSED);
pthread_join(runtime->thread, NULL);
}
43
まとめまとめ
44
PHP7からははPECL Parallelを使おう
PECL Parallelはpthread実装になってる
CLIだったらPHPでもマルチスレッドが普通につかえる
apacheでつかうならMPM preforkしかダメよ
どうしてもthread使いたいなら、fpm-cgiにしろ
PHPのソースコード中のオブジェクトと実際のスレッドが対応して動
いているわけではない
45
参考資料1 - Pthreadsプログラミング参考資料1 - Pthreadsプログラミング
46
参考資料2 - Haskellによる並列・平行プログラミング参考資料2 - Haskellによる並列・平行プログラミング
47
Shizuoka.hsShizuoka.hs
純粋関数型言語 Haskell に関する勉強会も開催しています
興味があれば参加してみて下さい
48
ご清聴ありがとうございました
49

Contenu connexe

Tendances

エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得Reimi Kuramochi Chiba
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門増田 亨
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!デベロッパーネットワーク
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方増田 亨
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング道化師 堂華
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方Shigenori Sagawa
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメYoji Kanno
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説増田 亨
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意Yoshitaka Kawashima
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 

Tendances (20)

エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
PHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyieldPHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyield
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 

Similaire à PHPでマルチスレッド

Php in ruby
Php in rubyPhp in ruby
Php in rubydo_aki
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarSotaro Karasawa
 
PHP & Queue
PHP & QueuePHP & Queue
PHP & Queuesasezaki
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とdo_aki
 
PHPCON_TOKYO_2022_Bigginer.pptx
PHPCON_TOKYO_2022_Bigginer.pptxPHPCON_TOKYO_2022_Bigginer.pptx
PHPCON_TOKYO_2022_Bigginer.pptxHideo Kashioka
 
なぜ、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
 
FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1Fumito Mizuno
 
PHPの今とこれから2022
PHPの今とこれから2022PHPの今とこれから2022
PHPの今とこれから2022Rui Hirokawa
 
PHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見るPHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見るshinjiigarashi
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12kenjis
 
FukuokaPHP 3
FukuokaPHP 3FukuokaPHP 3
FukuokaPHP 3ichikaway
 
第21回Creators MeetUp
第21回Creators MeetUp第21回Creators MeetUp
第21回Creators MeetUpKenichi Mukai
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみたy-uti
 
mod_auth_ticket - Bringing Single-Sign-On to lighttpd
mod_auth_ticket - Bringing Single-Sign-On to lighttpdmod_auth_ticket - Bringing Single-Sign-On to lighttpd
mod_auth_ticket - Bringing Single-Sign-On to lighttpdTaisuke Yamada
 
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)Rui Hirokawa
 
Phpcon tokyo 20120_bigginer
Phpcon tokyo 20120_bigginerPhpcon tokyo 20120_bigginer
Phpcon tokyo 20120_bigginerHideo Kashioka
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1kenjis
 
PHPの今とこれから2015
PHPの今とこれから2015PHPの今とこれから2015
PHPの今とこれから2015Rui Hirokawa
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoyakenjis
 

Similaire à PHPでマルチスレッド (20)

Php in ruby
Php in rubyPhp in ruby
Php in ruby
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
 
PHP & Queue
PHP & QueuePHP & Queue
PHP & Queue
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
PHPCON_TOKYO_2022_Bigginer.pptx
PHPCON_TOKYO_2022_Bigginer.pptxPHPCON_TOKYO_2022_Bigginer.pptx
PHPCON_TOKYO_2022_Bigginer.pptx
 
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
 
FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1
 
PHPの今とこれから2022
PHPの今とこれから2022PHPの今とこれから2022
PHPの今とこれから2022
 
Php5.4
Php5.4Php5.4
Php5.4
 
PHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見るPHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見る
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
 
FukuokaPHP 3
FukuokaPHP 3FukuokaPHP 3
FukuokaPHP 3
 
第21回Creators MeetUp
第21回Creators MeetUp第21回Creators MeetUp
第21回Creators MeetUp
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
 
mod_auth_ticket - Bringing Single-Sign-On to lighttpd
mod_auth_ticket - Bringing Single-Sign-On to lighttpdmod_auth_ticket - Bringing Single-Sign-On to lighttpd
mod_auth_ticket - Bringing Single-Sign-On to lighttpd
 
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
 
Phpcon tokyo 20120_bigginer
Phpcon tokyo 20120_bigginerPhpcon tokyo 20120_bigginer
Phpcon tokyo 20120_bigginer
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 
PHPの今とこれから2015
PHPの今とこれから2015PHPの今とこれから2015
PHPの今とこれから2015
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 

PHPでマルチスレッド