人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP+MySQLで2回mysql_connect()を実行すると”Warning: mysql_connect(): Can’t connect to local MySQL server through socket ’/var/tmp/mysql.sock’ (2) ”というエラーが出てしまう(mysql_close()はしてるんですが)ので、処理の最初にmysql_connect()を一回だけ実行し、mysql_close()せずに接続を使いまわすようにしました。調べた所接続の切断は自動的に行われるのでmysql_close()は使用しなくて良い、と書いてあるリソースを見つけたためですが、何となく心配です。セキュリティ的・リソース的に、この方法で問題は無いのでしょうか?

ちなみに、下記の問題が解決しないのでこの方法を採用しています。
http://www.hatena.ne.jp/1114105997

●質問者: dak
●カテゴリ:コンピュータ
✍キーワード:CONNECT MySQL PHP Warning エラー
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● kura_jet
●20ポイント

http://www.yahoo.co.jp/

Yahoo! JAPAN

URLはダミーです。

問題はありませんというか、むしろDBのOpen/Closeを頻繁にするよりは処理の一番最初と最後に1回ずつ行う方がいいと思います。

理由はDBサーバに接続をするのは時間の掛かる処理だからです。頻繁にOpen/Closeを行うことにより、処理待ちが発生する可能性がありますので、1回で行った方が逆にリソースは軽減されると思います。

セキュリティ的な問題は回数というよりも、ネットワーク上に存在しますので、この件で気にする必要は無いと思います。

◎質問者からの返答

なるほど。接続処理自体が時間が掛かると。電気(照明)のON/OFFを頻繁に行い過ぎると寿命が短くなるみたいな感じですね(逆か)。裏を取れるリソースが指定されてるとより良かったですが、とても参考になりました。有難うございます!あ、close処理は最後に明示的に行った方が良いのでしょうか?


2 ● hukko
●20ポイント

http://www.php.net/manual/ja/function.mysql-connect.php

PHP: mysql_connect - Manual

「同じ引数で2回mysql_connect()をコールした場合、 二回目は新規のリンクが確立されるのではなく、代わりにすでにオープンされた リンクのリンクIDが返されます。」

http://ns1.php.gr.jp/pipermail/php-users/2002-September/010173.h...

[PHP-users 10167] リソース変数の開放のタイミング

http://ns1.php.gr.jp/pipermail/php-users/2002-September/010177.h...

[PHP-users 10171] Re: リソース変数の開放のタイミング

「このため、PHPプログラミング(とくにWebプログラミング)ではリソースは明示的に解放しない方が良いです。」

◎質問者からの返答

実は細かい部分は良く分からなかったのですが、正しいリソースで、結論もきっと正しいんだろうな、という雰囲気は感じ取る事ができました(笑)。今時点ではそれで十分だと思いましたので、大変役に立つ回答でした。ありがとうございます。参考までに質問は継続します。


3 ● くいっぱ
●20ポイント

http://php.s3.to/man/language.variables.scope.html

変数のスコープ

ごめんなさい、前回の質問のRESを読むのに時間がかかりました。


まず、その方法には問題があります。

通常、自動的に切断されるので問題がないといえば無い…(!??)ですが、セッションが切れるのをWebサーバーが認識するまでゴミトランザクションが残る可能性があります。できるだけ、明示的に処理を完結させた方がよいかと思います。


その上で…


http://www.hatena.ne.jp/1114105997

人力検索はてな - PHP+MySQLで自前のアクセスカウンターを作っています。”Warning: mysql_connect(): Can’t connect to local MySQL server through socket ’/var/tmp/mysql.sock’ (2) ..

この下の

function dbclose($con) {

という関数。

これだと$conが値渡しになっています。

function dbclose(&$con) {

にするか

function dbclose() {

global $con;

と記述する必要があるかと思います。

◎質問者からの返答

でも、dbopen()の時は値渡しで返り値を取れてるんですよね。。リンクIDというのは値として渡せるものかと思っていましたが、違うのでしょうか?一応、http://www.hatena.ne.jp/1114421243 の方法で本件は仮解決したつもりになっていますが、今後のために制限時間一杯まで回答受付けます。どなたか分かりやすく説明できる方がいらしたら、是非お願いします。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ