SlideShare a Scribd company logo
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

More Related Content

What's hot

Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
Shohei Okada
 
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみた
Kohei Nakamura
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までDocker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Masahito Zembutsu
 
SQLアンチパターン~ファントムファイル
SQLアンチパターン~ファントムファイルSQLアンチパターン~ファントムファイル
SQLアンチパターン~ファントムファイル
Itabashi Masayuki
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
Jun-ichi Sakamoto
 
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニックPHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニック
Yoshio Hanawa
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
shinjiigarashi
 
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)
Kazuya Sugimoto
 
技術ブログを書こう
技術ブログを書こう技術ブログを書こう
技術ブログを書こう
akira6592
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
日本マイクロソフト株式会社
 
Riverpodでテストを書こう
Riverpodでテストを書こうRiverpodでテストを書こう
Riverpodでテストを書こう
Shinnosuke Tokuda
 
「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう
増田 亨
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
Takuto Wada
 
PEGで構文解析をする
PEGで構文解析をするPEGで構文解析をする
PEGで構文解析をする
jiro4989
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
 
Spectacular Future with clojure.spec
Spectacular Future with clojure.specSpectacular Future with clojure.spec
Spectacular Future with clojure.spec
Kent Ohashi
 

What's hot (20)

Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
 
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみた
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応までDocker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
 
SQLアンチパターン~ファントムファイル
SQLアンチパターン~ファントムファイルSQLアンチパターン~ファントムファイル
SQLアンチパターン~ファントムファイル
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニックPHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニック
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
 
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)
Java クライント実装におけるAPIスタイル頂上決戦! 野良REST vs GraphQL vs OData vs OpenAPI (Swagger)
 
技術ブログを書こう
技術ブログを書こう技術ブログを書こう
技術ブログを書こう
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
 
Riverpodでテストを書こう
Riverpodでテストを書こうRiverpodでテストを書こう
Riverpodでテストを書こう
 
「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
PEGで構文解析をする
PEGで構文解析をするPEGで構文解析をする
PEGで構文解析をする
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
Spectacular Future with clojure.spec
Spectacular Future with clojure.specSpectacular Future with clojure.spec
Spectacular Future with clojure.spec
 

Similar to 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
 
PHPCON_TOKYO_2022_Bigginer.pptx
PHPCON_TOKYO_2022_Bigginer.pptxPHPCON_TOKYO_2022_Bigginer.pptx
PHPCON_TOKYO_2022_Bigginer.pptx
Hideo 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.1
Fumito Mizuno
 
PHPの今とこれから2022
PHPの今とこれから2022PHPの今とこれから2022
PHPの今とこれから2022
Rui Hirokawa
 
PHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見るPHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見る
shinjiigarashi
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
kenjis
 
FukuokaPHP 3
FukuokaPHP 3FukuokaPHP 3
FukuokaPHP 3
ichikaway
 
第21回Creators MeetUp
第21回Creators MeetUp第21回Creators MeetUp
第21回Creators MeetUp
Kenichi 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 lighttpd
Taisuke 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_bigginer
Hideo 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の今とこれから2015
Rui Hirokawa
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
kenjis
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
龍一 田中
 

Similar to 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
 
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
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
 

PHPでマルチスレッド