質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

2454閲覧

PHP fork MySQLを使いデータベースの更新

WADA1234

総合スコア25

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/03/13 01:20

fork文の子プロセスの中でデータベースに接続し、データをアップデートしたいのですが、可能でしょうか?

500 Internal Server Errorとエラーメッセージが出てしまいます。

SQLを使いデータベースに格納できないので
配列に格納後、データベースに格納できないかと試しましたが
親プロセス終了後、格納した数値がなくなってしまいます。

DBに値を更新に行く方法はないでしょうか?

OSはCentOS 6です。
MySQLを使用しています。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

shi_ue

総合スコア4437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WADA1234

2016/03/13 09:12

すいません^^; exitはしておりました。書き漏れです。 PDOでも一度試してみます。 ありがとうございますm(_ _)m
shi_ue

2016/03/13 09:13

mysqlでエラーになっているわけではないと思います。 500エラーということなのですが、apacheのエラーログは見ましたか?
WADA1234

2016/03/13 10:06

PDOでやってみました。成功しました! すんなり行きました!検索してDPOというやり方も書いてあったのですが試していませんでした。行ってもらわなかったら試しませんでした。 apacheでエラーログを吐くんですね。知りませんでした! ちょっとそこも調べてみます!
shi_ue

2016/03/13 10:07

よかったです!引き続き頑張ってください!
WADA1234

2016/03/13 11:12

ありがとうございます!助かりました^^
guest

0

こちらのURLに解説があります。
http://lab.adn-mobasia.net/?p=106

プロセスをフォークする際、データベース接続には注意しなければなりません。親プロセスでDB接続をオープンしたままの状態で子プロセスを生成してしまうと、この参照がプロセス間で共有されてしまい、1つの子プロセスが終了した段階で他の全てのプロセスからはDB接続がクローズされてしまったように見えます。これを避けるためには、フォーク後に各子プロセスが自分専用のDB接続をオープンするとよいでしょう。

とありますが、どうでしょうか。そのようなことはしていないでしょうか?
出来ればソースを開示していただくと分かりやすいですね。

投稿2016/03/13 04:30

shi_ue

総合スコア4437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WADA1234

2016/03/13 08:45

コメントありがとうございます。 このページも参考にしてプログラムを作っておりました。 親プロセスにはSQL処理をさせていません。 子プレセスの中にSQL文を入れたいと考えております。 下記のような構成となっています。 子プロセスがloop_number個並行処理される状態になると思います。 子プロセスでDBが開いている間に他の子プロセスが動いてしまい、エラーになっているのかと思うのですが、いかがでしょうか? よろしくお願いします。 $pids = array(); for ($i=0; $i<$loop_number; $i++) { $pid = pcntl_fork(); if ($pid == -1) { writeErrorLog('プロセスのフォークに失敗しました。'); break; } else if ($pid) { // 親プロセスの場合 $pids[] = $pid; } else {   ******挿入するSQL文******* mysql_query('SET NAMES utf8', $sql ); $link = mysql_connect('localhost', 'xxxxx', 'ps'); if (!$link) { die('no conetct'.mysql_error()); } $db_selected = mysql_select_db('DB', $link); if (!$db_selected){ die('err'.mysql_error()); } mysql_set_charset('utf8'); echo $sql = sprintf(SQL文); $result_flag = mysql_query($sql); ******挿入するSQL文******* if ($close_flag<>1){ print('<p>NOT KILL</p>'); } } } foreach ($pids as $pid) { pcntl_waitpid($pid, $status);
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問