ホーム > タグ > php
php
eclipseでphpコードをデバッグするとApacheが落ちる
- 2009-12-29 (火)
- eclipse
どうも、うしねずみです。
最近eclipseを使ったPHPの開発でハマった(ハマっている)ので書きます。
いまPHPの開発にeclipseのパッケージの一つである、Eclipse for PHP Developersを使っているのですが、どうもコレ、Vistaとの相性が悪いらしい。というより、PHPのデバッガとVistaの相性が悪いらしい。
この開発環境は
Window>Preference>PHP>Debug
のPHP Debuggerの項目でXDebugとZend Debuggerを選べるのですが、ネットで調べてみるとVistaPCでXDebugを使ってデバッグするとApacheが落ちるらしい。私はZendを使っていたので関係ないかと思いきや、Apacheが落ちる落ちる。
最初は2,3回に1回だったので落ちたら再起動して我慢していたのですが、そのうち落ちる頻度が増え、PHPのソース内で読み込んでいるswfファイル(Flexアプリケーション)の挙動まで安定しなくなってきました。もう少し具体的に言うと、Flexアプリ側からPHPにアクセスしてDBからデータを拾ってほしいのですが、PHPから正常に値が返ってこない。最初はFlexアプリ側でどんなに探してもバグらしきものが見つからなくて困りました。しかしブラウザからアクセスすると正常な挙動を示すので、どうやらPHPのデバッガのせい。しまいには、eclipseまで落ちまくるようになって、ホントに困りました。
今のところブラウザからアクセスした感じではアプリ全体にバグがなさそうなのでいいですけど、このままだとPHP部分とFlex部分の結合テストができないなー。。。
あー、面倒だ。
- Comments: 0
- Trackbacks: 0
PHPのアカウント管理ライブラリ、phpUserClassを使ってみた
- 2009-10-14 (水)
- php
どうも、うしねずみです。
PHPのアカウント管理やログイン、ログオフ管理に便利なライブラリのphpUserClassというものを使ってみました。
こちらでダウンロードできます。
http://phpuserclass.com/
PHPとMySQLを使って、アカウントの作成、アクティベーション、ログイン処理、ログアウト処理などアカウント管理に関することが簡単にできるようになっています。access.class.phpというファイルの中に一つだけクラスが定義されていて、このクラスのメンバ関数を使ってログイン、ログアウトなど、いろんな処理をします。関数名も分かりやすくつけられているので、使い方が分からなくなることもあまりないかも。
使うときは以下のような流れで使うことになります。
MySQLに必要なテーブルを作る
これは簡単です。ダウンロードして解凍したphpUserClassのフォルダの中にある「example2.php」というファイルの先頭に、そのテーブルを作るために必要なSQL文がコメントで書いてあります。こんな感じで。
1 2 3 4 5 6 7 8 9 10 11 |
CREATE TABLE `users` ( `userID` mediumint(8) unsigned NOT NULL auto_increment, `username` varchar(50) NOT NULL default '', `password` varchar(100) NOT NULL default '', `email` varchar(150) NOT NULL default '', `active` tinyint(1) NOT NULL default '0', PRIMARY KEY (`userID`), UNIQUE KEY `username` (`username`), UNIQUE KEY `email` (`email`), KEY `active` (`active`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
このSQL文を実行するだけで必要なテーブルが作成されます。ここでは、「account_data」というDBでこのSQL文を実行して「users」というテーブルを作成したとして、以下の説明を進めていきます。
アカウント作成
アカウントの作成は以下のようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
require_once 'access.class.php'; $dbConnection = mysql_connect('localhost', 'root'); $settings = array('dbName' => 'account_data'); mysql_select_db('account_data', $dbConnection); $user = new flexibleAccess($dbConnection, $settings); $data = array( 'username' => $_POST['username'], 'email' => $_POST['email'], 'password' => $_POST['pwd'], 'active' => 1 ); $userID = $user->insertUser($data); //The method returns the userID of the new user or 0 if the user is not added if ($userID==0) echo 'User not registered';//user is allready registered or something like that else echo 'User registered with user id '.$userID; |
このコードの五行目までは全てのページに書かなければいけないおまじないです。一行目はphpUserClassのファイルの読み込み。二行目はMySQLに接続する処理。第一引数はMySQLのユーザ名で、第二引数はMySQLのパスワードです。第一引数はサーバ名で、第二引数はMySQLのアカウント名です。三行目はアカウント情報が格納されているDBを指定するオプションを付けています。先程説明したとおり「account_data」というDBであるとします。四行目ではMySQLを実際にそのDBに切り替えておきます。五行目はphpUserClassが提供するクラスであるflexibleAccessというクラスをnewします。
ここで作られた$userというオブジェクトのメンバ関数を呼ぶことでいろんな処理を実現します。例えばアカウントを作るときは13行目のように$userのinsertUserメソッドを呼びます。引数には必要な情報を格納した連想配列。activeというのはアカウントを作成と同時にアクティブにするか、それとも仮登録メールを送信して、それに書かれたリンクをユーザがクリックした後にアクティブにするかを指定します。1を入れておくと、メール送信は行わず、作成と同時にアクティベートされます。連想配列に入れたデータのサニタイズはphpUserClassが内部的にやってくれるので全く気にする必要はありません。楽ちんですね。さらにパスワードもsha1かmd5を使って(デフォルトではsha1)暗号化(?)して保存されます。
ログイン
次はすでにアカウントを作った人がログインする処理です。
これも比較的簡単。まず先頭五行におまじないを書きます。次に$userのloginメソッドを呼びます。これでだけです。第一引数はユーザ名。第二引数はパスワード。第三引数はログイン画面でよく見る「次回から自動的にログインする」っていうチェックマークに相当すると思います(たぶん)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
require_once 'access.class.php'; $dbConnection = mysql_connect('localhost', 'root'); $settings = array('dbName' => 'account_data'); mysql_select_db('account_data', $dbConnection); $user = new flexibleAccess($dbConnection, $settings); if ( !$user->login($_POST['uname'],$_POST['pwd'],$_POST['remember'] )){ //Mention that we dont have to use addslashes as the class do the job echo 'Wrong username and/or password'; } else { //user is now loaded //ログイン後の処理 header('Location: main.php'); // たとえばメインページにリダイレクト } |
ログインチェック
で、実際そのページに飛んできた人がログインしているかどうかはどうやって確かめるかと言うと、これも簡単。以下のようにします。
1 2 3 4 5 6 7 8 9 10 11 |
require_once 'access.class.php'; $dbConnection = mysql_connect('localhost', 'root'); $settings = array('dbName' => 'account_data'); mysql_select_db('account_data', $dbConnection); $user = new flexibleAccess($dbConnection, $settings); if ( $user->is_loaded() ){ echo 'OK'; } else { echo 'NG'; } |
先頭五行目までは例のごとくおまじない。そして$userのis_loadedメソッドを呼んで、trueが返ってきたらログイン済みのちゃんとしたユーザです。簡単ですよね?
さて、ここで不思議に思った人もいるかもしれません。なぜなら、ログインしているかどうかをチェックしているはずなのに、ユーザ名とか一切指定していないですね。セッション管理のコードを自前で書いたことがある人なら、session_start関数が呼ばれていないことも気になるかもしれません。でも、そこは一切気にしない。全部phpUserClassにお任せ。
実はphpUserClassの中でsession_start関数が呼ばれていて、セッション変数としてユーザ名を持っているため、現在のユーザが誰かとかは全く気にすることなくログインチェックができるのです。便利っすね、ホント。
ちなみにユーザ名が知りたいときは以下のようにします。
1 |
$user->get_property('username'); |
ログアウト
これも簡単。以下のようにするだけ。logoutメソッドの引数は、ログアウト処理後のリダイレクト先です。
1 2 3 4 5 6 7 |
require_once 'access.class.php'; $dbConnection = mysql_connect('localhost', 'root'); $settings = array('dbName' => 'login_data'); mysql_select_db('account_data', $dbConnection); $user = new flexibleAccess($dbConnection, $settings); $user->logout('http://www.usinezumi.com/hoge.php'); |
まとめ
いやー、簡単です!!
やり方は詳しく見てませんがアクティベーション処理もできるようです。アクティベーション処理というのは、アカウント登録のときにメールアドレスを入れると、そのメールアドレス宛てに仮登録メールが送られてきて、そのリンクをクリックした時点で初めてアカウントを有効にするっていう、よくあるアレ。設定をちゃんとやるとメールを自動で送ってアクティベーション処理までやってくれるという。すごいっすね。ログアウト処理時にセッション変数を空にしたりとかセキュリティにも気を使われているようで安心です(私はあんまり詳しくないですが)。
どんどん活用させて頂きます!
- Comments: 0
- Trackbacks: 0
さくらインターネットでAdmin SSLが使えない
- 2009-07-08 (水)
- wordpress
どうも、うしねずみです。
ブログを始めようと思ってレンタルサーバを探し、さくらインターネットに決めました。
以前レンタルサーバを探した時には「共有SSLがない」というのがネックになって対象外になったのですがどうやら今年の初めからさくらでも共有SSLサービスが始まったらしく、値段とスペックのバランスが良かったです。
さてさて、何しろブログは初めてなものでいろいろ調べてみるとどうやらWordpressというツールが一番人気なようです。ということで早速Wordpressをインストール。私は以前からセキュリティは気になるほうで(と言っても知識は少ないのですが)Wordpressでも管理画面をSSLで操作するためのAdmin SSLというプラグインを入れました。
ところが!!
のっけからトラブル発生。うごかない。。。
Admin SSLの説明では「プラグインを有効化するとすぐにhttps接続になるよ(再ログインが必要)」的なことが書いてあるのですが、ログイン画面にアクセスしてもブログのトップページにリダイレクトされます。
仕方がないのでphpソースをちょっとのぞいてみる。
(最近たまーにphpを触る)
ソースをたどっていくと、どうやらAdmin SSLの設定画面の
1 |
$_SERVER['HTTPS'] == 'on' |
だったらHTTPS接続だと判断する、ということをしているようです。
そしてHTTPSではない場合は「ちゃんとHTTPSでアクセスしなさい」ってことでブログトップにリダイレクトされるらしい。
この値がちゃんと返ってきてるのか、さくらのサーバにテスト用のphpを書いてアップして確かめてみる。
phpのサーバ変数の中でhttpsに関係するのは以下の二つのようだ。
- HTTPS ・・・ https接続のときには空でない値が入る(通常は’on’が入る?)。
- SERVER_PORT ・・・ サーバが使っているポート番号。HTTPなら80番でHTTPSなら443番。
この二つが見れればいいので次のように書けばよろし。
1 2 |
print( $_SERVER['HTTPS'] ); print( $_SERVER['SERVER_PORT'] ); |
このファイルをtest.phpとかにしてアップロードしてアクセスしてみる。
。。。だめ。
httpでアクセスしてもhttpsでアクセスしても、$_SERVER[‘HTTPS’]は空のままだし$_SERVER[‘SERVER_PORT’]は80番が返ってくる。
これではせっかくSSLが使えるのに使えない(><)
これ以上自分ではわからなかったのでさくらのサポートに問い合わせました。
「phpのソース内から接続がhttpsかどうかを知る方法ってないんですか?」
回答は以下のような感じ。
「さくらのレンタルサーバ」にてご利用いただけます機能の一つに
Webアプリケーションファイアウォール(WAF)がございます。WAF機能はHTTPの環境変数についても対象としており、一部の値についてはフィ
ルタされます。ご了承ください。尚、こちらについては当面サーバ仕様を変更することがございませんため、
現状のままとなります。ご了承ください。
つまり、無理ってことです。
悪あがきをして、Admin SSLソース内のis_https()関数の戻り値が常にtrueになるように書き換えてみたけどムダでした。パスワード送信のときだけでもSSLで通信してくれないかなーと思って、ログインボタンのリンク先が
https://ほげほげ/blog/wp-login.php
になるように書き換えてみたけど、共有SSLだとSSLと非SSLでドメイン名が変わるので
(SSL) https://共有SSLサーバ/自分のドメイン名/blog/wp-login.php →ドメイン名は「共有SSLサーバ」の部分
(非SSL)http://自分のドメイン名/blog/wp-login.php →ドメイン名は「自分のドメイン名」の部分
Cookieを使ったphpのセッションがログイン処理後に引き継げなくてうまくいきませんでした。
誰か解決策わかる方いらしたら教えてください。
- Comments: 0
- Trackbacks: 1
Home > Tags > php
- Search
- Feeds