子プロセス終了で閉じてしまうmysqlコネクション

このQ&Aのポイント
  • pcntl_fork()を利用して、子プロセスでファイル収集を行い、親プロセスがそのファイルを解析してDBへ登録するといった単純な2並列のプログラムを書いています。
  • 子プロセスが終了した時点でどうもmysqlのコネクションが切れてしまうようなのです。
  • 解決策はあるでしょうか。
回答を見る
  • ベストアンサー

子プロセス終了で閉じてしまうmysqlコネクション

pcntl_fork()を利用して、子プロセスでファイル収集を行い、親プロセスがそのファイルを解析してDBへ登録するといった単純な2並列のプログラムを書いています。 ところが子プロセスが終了した時点でどうもmysqlのコネクションが切れてしまうようなのです。 以下は上記内容を再現した簡易コードです。 $connect = mysql_pconnect("localhost", "user", "password"); //parent if ($pid = pcntl_fork()) { // 本当はここで収集されたファイルを順次解析してDBに登録を行う。 sleep(5); // 子が先に終了するように時間差を。 mysql_query($query="use testdb",$session) || die(sprintf("%s : %s\n", $query, mysql_error())); pcntl_wait($status); //child } else { // 本当はここでファイルを収集する sleep(1); exit(0); } 上記コードは以下のエラーを吐いて終了します。 use testdb : MySQL server has gone away mysql_pconnectの代わりにmysql_connectを使ったり、mysql_queryの第二引数に$connectを与えても結果は変わりません。 子プロセスが終了してもmysqlとのコネクションを維持しておきたいのですが解決策はあるでしょうか。 ちなみにPHP CLIで実行しています。 OS: Linux PHP 5.2.4

  • PHP
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • little-m
  • ベストアンサー率44% (45/102)
回答No.1

 親プロセスと子プロセスで同一のコネクションを使用している所に問題があると思います。 $connect = mysql_pconnect("localhost", "user", "password"); //parent if ($pid = pcntl_fork()) { : : //child } else { $connect = mysql_pconnect("localhost", "user", "password"); : : exit(0); }  と、子プロセスは子プロセス側で別途コネクトして使用するか、  親、子、それぞれでDBにコネクトする必要があるかと思います。

__LINE__
質問者

お礼

子プロセスで使いまわすことはできないのですね。 ありがとうございました。

関連するQ&A

  • 子プロセスの管理

    forkした後の子プロセス管理で、終了をsignalで管理しようと思ってるんですが、forkを2回行なえばゾンビ化を防げると書いてありました。この二つの方法に違いはあるんですか?メリット・デメリットがよくわかりません。ちなみに子プロセスからの結果や終了を待つ様なプログラムではなく、ただexec関数での別処理を行なうために子プロセスを作成するだけです。 宜しくお願いします。

  • forkで子が親を終了させるか?

    fork() によって作られた子プロセスが、親プロセスを終了させる場合があるでしょうか? 形としては良く見かけるもので次のようになっています。 pid_t pid = fork(); if (pid < 0) {  エラー処理  return; } else if (pid == 0) {  子の処理 ... (1)  _exit(0); } /* ここが実行されない場合がある */ return; (1)の箇所に sleep() を幾らか入れると再現しなくなります。 親子の関係で子が親へ影響を与えることがあるでしょうか?

  • Unixの親プロセスと子プロセスの関係について

    はじめまして。 親プロセスが終了するとそのプロセスから呼ばれた 子プロセスも停止するという認識は正しいでしょうか? というのも、あるシェルスクリプトを"kill -9"コマンドで強制終了させたのですが、そのシェルスクリプト内のコマンド(sleepコマンドです)は終了せずに残っていたので(psで確認しました)、??という感じでした。 さらにそのsleepコマンドの親プロセスが1(init?)になっていました。 色々とWEB上で調べてみたのですが、この動作について の記述を見つけることができませんでした。 どなたかご存知でしたら是非ご教授下さい。よろしくお願いします。

  • fork()で作られた子プロセスから親プロセスの生存を知る方法は?

    タイトルの通りなのですが、プロセスAから fork()で子プロセスBを作り、Bには無限ループで処理をさせます。 Aはユーザからの入力を受け、処理を行います。 Aが終了要求をされプロセスを終了するときに、 Bも同時に終了したいのですが、BからAの生存を判定して Aのプロセスが切れていたBも終了する、ということは可能でしょうか? Bの無限ループ処理では、ファイルの書き換えを行っているので AからBのPIDを指定してKillする、ということはせずに B自身で判定して終了するようにしたいのですが。。

  • 子プロセスのコマンド結果

    pipe(),fork(),dup2()等を駆使し、子プロセスにコマンドを実行させる処理にて、 子プロセスの実行したコマンドが入力待ちか処理終了しているかを判定する方法ってありますで しょうか?

  • プロセスの生成

    #include<stdio.h> #include <unistd.h> main(){ int i; printf("\t(%s)プロセスID.....%d\n","元",getpid()); printf("\t(%s)親プロセスID...%d\n","元",getppid()); if((i=fork())==0) { //子プロセスで実行する部分 printf("\t子プロセスでのfork()の値 : %d\n",i); printf("\t(%s)プロセスID.............%d\n","子",getpid()); printf("\t(%s)親プロセスID...........%d\n","子",getppid()); printf("子プロセスを終了します\n"); } else{//親プロセスで実行する部分 printf("\t親プロセスでのfork()の値 : %d\n",i); printf("\t(%s)プロセスID.............%d\n","親",getpid()); printf("\t(%s)親プロセスID...........%d\n","親",getppid()); printf("親プロセスを終了します\n"); } } fork関数の振る舞いについてです。 上記のプログラムをgccでコンパイルして実行した場合出力結果が /_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ (元)プロセスID.....375 (元)親プロセスID...246 親プロセスでのfork()の値 : 376 子プロセスでのfork()の値 : 0 (子)プロセスID.............376 (子)親プロセスID...........375 子プロセスを終了します (親)プロセスID.............375 (親)親プロセスID...........246 親プロセスを終了します _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ という感じで出力されました。 fork関数がプロセスの複製を行っていることと、戻り値が0と376の2つであることはわかりました。 また子プロセスには0を親プロセスには376を返すこともわかりました。 感覚的にはif文の真である子プロセス側の記述文と偽である親プロセス側 の記述文が同時に実行されているのではないかと考えましたが 同時に実行されているのに printf("\t子プロセスでのfork()の値 : %d\n",i); printf("\t親プロセスでのfork()の値 : %d\n",i); で表示される値が違うのはなぜでしょうか。 i=fork()によって代入されているのはわかるのですが、 同時に実行されつつ何故2つの違う値をiは出力できるのかがわかりません。 また出力結果が _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ (元)プロセスID.....377 (元)親プロセスID...246 親プロセスでのfork()の値 : 378 (親)プロセスID.............377 (親)親プロセスID...........246 親プロセスを終了します 子プロセスでのfork()の値 : 0 (子)プロセスID.............378 (子)親プロセスID...........1 子プロセスを終了します _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 子プロセスから見たときの親プロセスが1となっているのは何故でしょうか? 本来ならば377ではないでしょうか? わかりにくい説明ですいません。 よろしくお願いします。

  • forkで作れる子プロセス数が限られている

    for($i=0;$i<1000;$i++) { if($p=fork) { next; } elsif(defined($p)) { sleep 10000; exit; } else { print("$i\n"); <STDIN>; } } 数十個で子プロセスが生成されなくなります メモリは十分あまってます デスクトップヒープ領域が足りなくなったわけじゃなさそうです どうすればメモリが足りる限り子プロセスを生成できるでしょうか? windows xp avtive perl 5.8.7です。

    • ベストアンサー
    • Perl
  • データベースを使用したWebアプリの作り方

    php+Mysqlで簡単な照会プログラムを作ろうと思っているのですが、Webを使ったアプリを作ったことが無いので要領が判らず困っています。 phpの文法やMysqlの操作などはマニュアルを見ればなんとかなると思うのですが、幾つかのフォームを介した場合のセッションの考え方(Web自体のセッションとMysqlに対してのコネクション)がよく判りません。 ログイン画面でユーザーの認証をしたとすると、次のフォームに移ったとき、同じセッションであることを保持する情報をCookieなりデータベースなりに吐き出して処理するんであろうと思うのですが、その時にデータベースのコネクション情報は保持する(できる?)のでしょうか? mysql_pconnectとmysql_connectがあるようですが、mysql_pconnectを使った実践的なアプリケーションの例が見つからないので、立ち止まっています。 初歩的な質問で申し訳ないですが、参考になるサイトを教えて頂けるだけでも結構ですので、よろしくお願いします。

    • 締切済み
    • PHP
  • 子プロセスのデータを親プロセスに渡す方法ってありますか。

    こんにちは。 C言語内でfork()関数を使い親と子を分け、子プロセス間で生成されたデータを親プロセス側に渡して処理したいと考えています。要は、プロセス間でデータのやり取りをpipe()関数かなにかで行いたいと思っています。 子プロセスがデータをテキストファイルでどこかに出力して、それを親プロセスが参照する、というテキストファイルを橋渡しにする原始的な方法があるにはあるのですがこれは最終手段にしたいと考えています。他に良いやり方があればご教授いただけないでしょうか。 以下はサンプルコードです。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<errno.h> #include<signal.h> #include<sys/types.h> int main(){ FILE *fp,*fp2; int fd[2],a,i = 0; pid_t pid; pipe(fd); char buff[1024]; pid = fork(); sigignore(SIGCLD); //ちゃんと子が死ぬようにする if(pid == 0){ close(STDOUT_FILENO); //画面に出力されないようにする dup2(fd[1],STDOUT_FILENO); close(fd[0]); fp = popen("tcpdump","tcpdump","tcp[13] & 255 == 2",NULL); } else{ sleep(1); //一秒だけ子プロセスを起動 kill(pid,SIGTERM); wait(); //完全に子プロセスを殺す fp2 = popen("wc -l fpのファイルデータ","r"); for(i=0;i<3;i++){ a = fgetc(fp2); putc(a,stdout); }printf("\n"); return 0; } } プログラムの内容は、 tcpdumpで処理(子プロセス)した内容を、wc -l で「行数」のみ取得する(親プロセス)というものです。あくまで目標ですが・・。^^; お手数でしょうが、どうぞよろしくお願いします。

  • 【至急】MySQLのエラーを解消したいのですが?

    データを間違って消してしまい、サーバーにデータを バックアップ復活したのですが、以下の様なエラーが生じており、 困っております。 MySQLのエラーを解消したいのですが?、知識がなく、どうすればいいのでしょうか? ・1)Warning: mysql_connect() [function.mysql-connect]: Unknown MySQL Server Host '0net' (1) in /ファイルパス/ファイル.php on line 7 ・2)Warning: mysql_select_db() [function.mysql-select-db]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /ファイルパス/ファイル.php on line 8 ・3)Warning: mysql_select_db() [function.mysql-select-db]: A link to the server could not be established in /ファイルパス/ファイル.php on line 8 ・4)Warning: mysql_query() [function.mysql-query]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /ファイルパス/index.php on line 5 ・5) Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /ファイルパス/index.php on line 5 ・6) Warning: mysql_query() [function.mysql-query]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /アフィルパス/index.php on line 6 ・7) Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /ファイルパス/index.php on line 6

専門家に質問してみよう