teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追加

2016/11/02 04:39

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -6,4 +6,31 @@
6
6
  親プロセスでDB接続をオープンしたままの状態で子プロセスを生成してしまうと、子プロセスで接続ファイルIDが同じものを使ってしまい、1つの子プロセスが終了すると、他の子プロセスのDB接続がクローズされてしまいます。
7
7
  ですのでフォークする場合、各子プロセスで新たにDB接続してアクセスを行います。
8
8
 
9
- CakePHPフレームワークの知識が無いので、DBへの接続が個々に行えるのかが分かりません。(調べてみます)
9
+ CakePHPフレームワークの知識が無いので、DBへの接続が個々に行えるのかが分かりません。(調べてみます)
10
+
11
+ phpのつたない例ですが
12
+ ```php
13
+ for ($i = 1; $i <= 5; ++$i) {
14
+ $pid = pcntl_fork();
15
+ if (!$pid) {
16
+ sleep(1);
17
+ print "In child $i\n";
18
+
19
+ try{
20
+ $dbh = new PDO($dsn, $user, $password);
21
+ }catch (PDOException $e){
22
+ print('Connection failed:'.$e->getMessage());
23
+ die();
24
+ }
25
+ $sql = 'select * from tableA';
26
+ $stmt = $dbh->query($sql);
27
+
28
+ while($result = $stmt->fetch()){
29
+ print($result['UserID']." ");
30
+ print($result['station_id1']."\n");
31
+ }
32
+
33
+ exit($i);
34
+ }
35
+ }
36
+ ```

1

訂正

2016/11/02 04:39

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  データベースでエラーが発生している様ですので、子プロセスには、データベースへのアクセスが行われた中で発生している様に見れます。
2
2
 
3
3
  一般的にforkされる場合、自身のコピーを作成してサブミットし、同ステップより開始されるイメージです。
4
- その際、親から切り離されているメモリはコピーはされますが、共有していない状態となります。
4
+ その際、親から切り離され際にメモリはコピーはされますが、共有はできない状態となります。
5
5
 
6
6
  親プロセスでDB接続をオープンしたままの状態で子プロセスを生成してしまうと、子プロセスで接続ファイルIDが同じものを使ってしまい、1つの子プロセスが終了すると、他の子プロセスのDB接続がクローズされてしまいます。
7
7
  ですのでフォークする場合、各子プロセスで新たにDB接続してアクセスを行います。