fork文の子プロセスの中でデータベースに接続し、データをアップデートしたいのですが、可能でしょうか?
500 Internal Server Errorとエラーメッセージが出てしまいます。
SQLを使いデータベースに格納できないので
配列に格納後、データベースに格納できないかと試しましたが
親プロセス終了後、格納した数値がなくなってしまいます。
DBに値を更新に行く方法はないでしょうか?
OSはCentOS 6です。
MySQLを使用しています。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
いただいたソースをを書いてみます。
PHP
1<?php 2$pids = array(); 3for ($i=0; $i<$loop_number; $i++) { 4 $pid = pcntl_fork(); 5 if ($pid == -1) { 6 writeErrorLog('プロセスのフォークに失敗しました。'); 7 break; 8 } else if ($pid) { 9 // 親プロセスの場合 10 $pids[] = $pid; 11 } else { 12 //******挿入するSQL文******* 13 mysql_query('SET NAMES utf8', $sql ); 14 $link = mysql_connect('localhost', 'xxxxx', 'ps'); 15 16 if (!$link) { 17 die('no conetct'.mysql_error()); 18 } 19 20 $db_selected = mysql_select_db('DB', $link); 21 22 if (!$db_selected){ 23 die('err'.mysql_error()); 24 } 25 26 mysql_set_charset('utf8'); 27 28 echo $sql = sprintf(SQL文); 29 $result_flag = mysql_query($sql); 30 31 //******挿入するSQL文******* 32 if ($close_flag<>1){ 33 print('<p>NOT KILL</p>'); 34 } 35 } 36} 37 38foreach ($pids as $pid) { 39 pcntl_waitpid($pid, $status); 40}
子プロセス側にexitがなく、子プロセス側でもforループが継続してしまうように見えますが、exitしてますか?
あと、Mysql APIは5.5で非推奨になり、7で削除されているので、MysqliかPDOに乗り換えることをお勧めします。
http://php.net/manual/ja/intro.mysql.php
投稿2016/03/13 09:07
総合スコア4437
0
こちらのURLに解説があります。
http://lab.adn-mobasia.net/?p=106
プロセスをフォークする際、データベース接続には注意しなければなりません。親プロセスでDB接続をオープンしたままの状態で子プロセスを生成してしまうと、この参照がプロセス間で共有されてしまい、1つの子プロセスが終了した段階で他の全てのプロセスからはDB接続がクローズされてしまったように見えます。これを避けるためには、フォーク後に各子プロセスが自分専用のDB接続をオープンするとよいでしょう。
とありますが、どうでしょうか。そのようなことはしていないでしょうか?
出来ればソースを開示していただくと分かりやすいですね。
投稿2016/03/13 04:30
総合スコア4437
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/13 09:12
2016/03/13 09:13
2016/03/13 10:06
2016/03/13 10:07
2016/03/13 11:12