回答編集履歴

2 追加

A.Ichi

A.Ichi score 3919

2016/11/02 13:39  投稿

データベースでエラーが発生している様ですので、子プロセスには、データベースへのアクセスが行われた中で発生している様に見れます。
一般的にforkされる場合、自身のコピーを作成してサブミットし、同ステップより開始されるイメージです。
その際、親から切り離され際にメモリはコピーはされますが、共有はできない状態となります。
親プロセスでDB接続をオープンしたままの状態で子プロセスを生成してしまうと、子プロセスで接続ファイルIDが同じものを使ってしまい、1つの子プロセスが終了すると、他の子プロセスのDB接続がクローズされてしまいます。
ですのでフォークする場合、各子プロセスで新たにDB接続してアクセスを行います。
CakePHPフレームワークの知識が無いので、DBへの接続が個々に行えるのかが分かりません。(調べてみます)
CakePHPフレームワークの知識が無いので、DBへの接続が個々に行えるのかが分かりません。(調べてみます)
phpのつたない例ですが
```php
   for ($i = 1; $i <= 5; ++$i) {
       $pid = pcntl_fork();
       if (!$pid) {
           sleep(1);
           print "In child $i\n";
           try{
               $dbh = new PDO($dsn, $user, $password);
           }catch (PDOException $e){
               print('Connection failed:'.$e->getMessage());
               die();
           }
           $sql = 'select * from tableA';
           $stmt = $dbh->query($sql);
           while($result = $stmt->fetch()){
                   print($result['UserID']." ");
                   print($result['station_id1']."\n");
           }
           exit($i);
       }
   }
```
1 訂正

A.Ichi

A.Ichi score 3919

2016/11/02 09:57  投稿

データベースでエラーが発生している様ですので、子プロセスには、データベースへのアクセスが行われた中で発生している様に見れます。
一般的にforkされる場合、自身のコピーを作成してサブミットし、同ステップより開始されるイメージです。
その際、親から切り離されているメモリはコピーはされますが、共有していない状態となります。
その際、親から切り離され際にメモリはコピーはされますが、共有はできない状態となります。
親プロセスでDB接続をオープンしたままの状態で子プロセスを生成してしまうと、子プロセスで接続ファイルIDが同じものを使ってしまい、1つの子プロセスが終了すると、他の子プロセスのDB接続がクローズされてしまいます。
ですのでフォークする場合、各子プロセスで新たにDB接続してアクセスを行います。
CakePHPフレームワークの知識が無いので、DBへの接続が個々に行えるのかが分かりません。(調べてみます)

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る