日本PHPユーザ会 掲示板

日本PHPユーザ会運営の掲示板です。※ただいまテスト運用中です。

日本PHPユーザ会 掲示板 » PHP事はじめ » MySQLを操作できない?

MySQLを操作できない?

ページ: 1

投稿者 投稿
会員
登録者: 2 2009
返信数: 2
PHPからMySQLを操作するコマンド群が正常に動作しなくなりました。
どうかご教示いただけましたら幸いです。

異常の詳細は以下の通りです。
(1)ターミナル(bash)からphpスクリプトを実行
 →「セグメンテーション違反です」と表示されて実行できない。
【スクリプトコード】

#!/usr/local/bin/php
<?php
$link = mysql_connect('localhost','user','password');
?>

※ターミナルから直接MySQLへのアクセスには問題なし。
※処理内容にMySQLが絡まないPHPスクリプト(ファイルのコピー、テキスト処理)の実行には問題なし。

(2)MySQLのデータを読み込んでhtmlを出力するphpページにアクセス
Apacheエラーログに前項同様のエラー(child pid ***** exit signal Segmentation fault (11)」(*****は毎回異なる数値))。

※やっていることは1つ目のhtmlソースを読み込み、特定の文字列があれば2つ目のhtmlソースとMySQLから読み込んだ内容を挿入するものです。
※2つ目のhtmlソースの途中までで表示が止まり、以降が表示されません。
※MySQLから読み込む部分をコメントアウトすると、それ以外部分は正常に最後まで表示されます。

【ソースコードの概略】

<?php
$insertstart = "<div id=¥"main¥">"; #ファイル挿入箇所検知文字列
#1つ目ファイルのファイルハンドラ
$handle_comm = fopen("/usr/local/apache2/htdocs/common.html","r");
#2つ目ファイルのファイルハンドラ
$handle_main = fopen("/usr/local/apache2/htdocs/main1.html","r");

while (!feof($handle_comm)) {
$buffer_comm = fgets($handle_comm);
echo $buffer_comm; #1つ目のファイルを1行ずつ出力
if ((strpos ($buffer_comm, $insertstart)) !== false) { #挿入開始
#====2つ目のファイル挿入
while (!feof($handle_main)) {
$buffer_main = fgets($handle_main);
echo $buffer_main;
}
fclose($handle_main);
#====2つ目のファイル挿入おわり

#====MySQLデータ挿入
$link = mysql_connect('localhost','user','password');
$db_selected = mysql_select_db('userdb',$link);
$result_resource = mysql_query('SELECT id,`year`,month,`name` FROM `index2` ORDER BY id DESC');
$result = mysql_fetch_array($result_resource);
while ($result !==false) {
printf ("%03s",$result["id"]);
printf (":%4s",$result["year"]);
printf ("/%02s",$result["month"]);
printf (":%s<¥/li>¥n",$result["name"]);
$result = mysql_fetch_array($result_resource);
}
echo "<¥/ul>¥n";
mysql_close($link);
#====MySQLデータ挿入おわり
} #挿入おわり
} #1つ目出力おわり
fclose($handle_comm);
?>


元々は問題なく表示できていましたが、下記経緯にて問題が発生するようになりました。
1.MySQLのアップグレード(5.0.49→5.1.30)を実施。
 →Apacheの停止再起動ができなくなった。
 エラーメッセージは
「modules/libphp5.so が libmysqlclient.so.15 を呼び出そうとしたが見つからない」
 という内容。
2.確認するとこのファイルの名前がlibmysqlclient.so.16に変わったことが判明。
 →php(5.2.8)を上書き再インストール。
 →Apacheは問題なく再起動できるようになった。
  PHPも引き続き正常動作(MySQLの絡まないものについては)

環境は以下の通りです。
OS:CentOS 5.2
Service:Apache 2.2.9、PHP 5.2.8、mysql 5.1.30
管理者
登録者: 10 2005
返信数: 38
察するにapache,MySQL,PHPそれぞれRPMでインストールをしていませんね
RPMはCentOS付属という意味ではなく,たとえばmysql.comのRPMを使ったり,自分でRPMを作成して使ったりということです.
#RPMをちゃんと作成してインストールしていれば通常依存関係がこういう問題の発生を阻止してくれます

っで,前置きはさておき結論からいうとABIがおかしい問題が完全に解決していないと推測します.

libphp5.soと,もし共有ライブラリー形式にしている場合,mysql.soがどこにあるかわかりますか?
それぞれのファイルにlddコマンドをかけてみてください.
lddは共有ライブラリーの依存関係を表示します.

たとえば下記はとある環境での実行例です.

$ ldd `php -r 'echo PHP_EXTENSION_DIR . "/mysql.so";'`
linux-gate.so.1 => (0x00110000)
libmysqlclient.so.15 => /usr/lib/libmysqlclient15/lib/mysql/libmysqlclient.so.15 (0x0011d000)
libc.so.6 => /lib/libc.so.6 (0x00281000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x003ea000)
libnsl.so.1 => /lib/libnsl.so.1 (0x0041c000)
libm.so.6 => /lib/libm.so.6 (0x00436000)
libssl.so.7 => /lib/libssl.so.7 (0x0045f000)
libcrypto.so.7 => /lib/libcrypto.so.7 (0x004aa000)
libz.so.1 => /lib/libz.so.1 (0x005f8000)
/lib/ld-linux.so.2 (0x00b46000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x0060c000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x0063b000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0x006da000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x006dd000)
libresolv.so.2 => /lib/libresolv.so.2 (0x00702000)
libdl.so.2 => /lib/libdl.so.2 (0x00717000)
libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x0071c000)
libkeyutils.so.1 => /lib/libkeyutils.so.1 (0x00726000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00729000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00742000)


この例でいう「libmysqlclient.so.15」が見つけられなくなっているんだと思います.

引用
2.確認するとこのファイルの名前がlibmysqlclient.so.16に変わったことが判明。


細かいことを抜きにすると単にファイル名が変わったわけではないです.
やるべきことで言うと,ちゃんとlibmysqlclient.so.16をリンクするようにPHPに関連するバイナリーを作り直してください.
リンクできるようになっているかどうかは上記のようにlddコマンドで確認できます.

lddの共有ライブラリーの検索は/etc/ld.so.conf,/etc/ld.so.conf.dあたりが参照されます.
この辺りのキーワードも込みで必要な調査をしてみてください.
会員
登録者: 2 2009
返信数: 2
ELFさん

早速のコメントありがとうございます。

RPMのことはよく分からず、RPMなしでインストールしてしまいましたが、
追々RPMのことも勉強します。

さて、ご指摘いただきましたlibphp5.so(/usr/local/apache2/modules/の下にありました)に対するlddコマンドの結果を見ると、
出力結果にあるいずれのファイルも存在していて問題ないようでした。

結局、PHPを再度インストールしてみたら正常に動作するようになりました。

その際、
・./configure と make の前に make clean の手順を入れました。

あと、もしかしたら先日の再インストール時は
・make と make test の間に行ったchcon コマンド
(SELinuxによるlibmysqlclient.so.16ファイルへのアクセス拒否を回避するのに必要のこと)において、パスが間違っていて効いてなかった、かも知れません。
(make test, make install 時のメッセージによると、そんなことはなかったと思いますが…)

以上、お騒がせしました。

ページ: 1

日本PHPユーザ会 掲示板 » PHP事はじめ » MySQLを操作できない?

日本PHPユーザ会 掲示板 は UseBB 1 フォーラムソフトウェア を使用しています