カテゴリー: PHP

  • 【XAMPP】VirtualHostの設定【PHP】

    XAMPPでのVirtualHostの設定の覚書です。

    なお、ここで使用するXAMPPのバージョンは、1.7.4です。利用するPCはvistaです。

    VirtualHostの設定をすると、ローカル環境で通常のドメインのようにWEB開発をすることができます。

    設定無し:http://localhost/example.com/

    設定有り:http://example.com

    設定有りにしてやると、localhostのパスが不要になり、より本番環境に近い開発ができます。一番の利点には、絶対パスと相対パスが本番環境と同じになることが挙げられます。

    VirtualHostの設定手順は、大きく二つに分かれます。

    1.XAMPPの処理・・・httpd-vhosts.confの設定

    2.利用するパソコンの処理・・・hostファイルの設定

    それぞれ、10分前後で終わるので、初心者の人も試してみる価値があると思います。

    それでは、実際に、設定してみましょう。

    1.XAMPPの処理・・・httpd-vhosts.confの設定

    XAMPP1.7.4では、httpd-vhosts.confに設定を書き加えます。

    ファイルのある場所は、

    C:\xampp\apache\conf\extra\httpd-vhosts.conf

    になります。利用するテキストエディタでファイルを開きます。

    そうしたら、

    NameVirtualHost *:80

    の行を見つけます。1.7.4では、20行目あたりになります。

    この文の先頭に#があるなら、外します。#はコメントであり、外すことで設定が有効になります。

    次に、先ほどの行の下に、ヴァーチャルホストの設定を書き加えます。

    <VirtualHost *:80>
    DocumentRoot "C:/xampp/htdocs"
    ServerName localhost
    </VirtualHost>
    
    <VirtualHost *:80>
    DocumentRoot "C:/xampp/htdocs/example.com"
    ServerName example.com 
    </VirtualHost>

    一つ目は、localhostをhtdocsのルートにする設定です。

    二つ目が、自分が利用したいドメイン名を設定する処理です。example.comを自分のドメインに書き換えてください。DocumentRoot と ServerName の2行を書き換える必要があります。

    ここまで書き換えたら保存します。ここで、1段階目の処理が終了です。次に2段階目の処理に移ります。

    2.利用するパソコンの処理・・・hostファイルの設定

    今度は、自分のパソコン(windows)の設定をします。

    ここでは、windows付属のメモ帳を使います。

    スタートメニュー → すべてのプログラム → アクセサリ → メモ帳 と選択して、メモ帳の上で右クリック。管理者として実行を選択します。

    空のメモ帳が開いたら、「ファイル」を選択し「開く」を選択します。

    hostファイルのある場所は、

    C:\WINDOWS\system32\drivers\etc\host

    になります。ただし、etcまで行っても何もファイルが表示されないと思います。

    ここで、ウインドウ右下の「テキスト文書(※.txt)」を「すべてのファイル」に変更してやります。すると、hostファイルが表示されるようになります。

    表示されたら開いて編集します。

    書き加えるのは以下の2行です。

    127.0.0.1       localhost
    127.0.0.1       example.com

    もし、上のlocalhostの行があれば、下の一行を書き加えるだけでOKです。

    ちなみに、ここでも、#は外しておきます。有効にするには、#を外すのです。

    これで、2段階目も終了です。

    さて、最後に、XAMPPを一度、終了して、再度、起動してみましょう。立ち上げたら、自分の利用するドメイン(ここでは、exmaple.com)

    http://example.com

    にアクセスしてみましょう。

    http://localhost/example.com

    にしなくても、表示されていると思います。

    以上です。

  • 【phpMyAdmin】エラーが出たためセッションを開始できませんでした。【XAMPP】

    XAMPPを起動して、phpMyAdminにログインしようとすると、

    「エラーが出たためセッションを開始できませんでした。PHP やウェブサーバのログファイルに出ているエラーを確認して、PHP を正しく設定してください。」

    と赤い文字でエラーが出る場合があります。

    ここではその対処法を覚書しておきます。

    結論から言うと、セッション関連のエラーのようです。

    セッションファイルはどこに保存されているかというと、

    C:\xampp\tmp

    です。

    このtmpフォルダの中に、最近できたセッションファイルがあると思います。

    sess_xyzabc…

    のようなのが、セッションファイルです。このセッションファイルのうち自分がログインしてできたと思われる直近、または、最近のセッションファイルを削除します。(.tmpファイルは削除しないように。)

    削除した後に、再度ログインしてみると、上手くいきました。

    どういうことか推測すると、どうやら先に生成されたセッションファイルがあることで、後のセッションが開始されないエラーらしい。(あくまでも推測ですが。)

    以前にもこのエラーが発生したことがあるのですが、一晩おいたら、なぜか、ログインできた経験があります。

    多分、その時は、先に出来たセッションファイルが時間の経過によりガーべジコレクションとかで削除されたのかもしれません。

    ですから、tmpフォルダ内のセッションファイルを自分で削除してやるとセッションが開始できるという訳です。

    ちなみに、正常にできたセッションファイルは、ファイルのサイズが40KBほどですが、このエラーが生じているときには、0から1KBほどのセッションファイルが出来ていたような気がします。この中途半端なセッションファイルがエラーの原因かもしれません。

  • 【PHP】配列の初期化のベンチマーク

    PHPの配列を初期化する場合には、

    $array = array() ;

    とします。

    配列に値を入れて初期化する場合には、

    $array = array(1, 2, 3, 4, 5)  ;

    とします。

    それでは、要素を10個もつ配列のすべての要素を、NULLで初期化するにはどうしたら良いでしょうか?

    //1の方法
    $array = array(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL ) ;

    たしかに、これでも、初期化できてますが、スマートではありません。

    それでは、ループさせてみては?

    //2の方法
    for ($i = 0; $i < 10; $i++)  {       
      $array[] = NULL ;
    }

    たしかに、これでも初期化できます。しかし、ループにすると速度落ちない?という疑問もでてきます。

    そこで、関数を調べてみると、array_fill なる関数が使えそうです。

    //3の方法
    $array = array_fill(0, 10, NULL);

    これは、配列のインデックス0から10個をNULLで初期化するというものです。
    つまり、インデックス0から9までNULL値の配列ができるのです。

    ここまでで、3つの方法を挙げてみましたが、果たして、どれが一番よいのでしょうか?

    確認するためにベンチマークを取ってみました。

    配列初期化ベンチマーク
    配列初期化ベンチマーク

    1の方法と3の方法は、ほとんど速度が変わりませんでした。しかし、ループさせる2の方法は、倍以上も遅くなってます。

    1の方法は、NULLの羅列が目障りなので、やはり、3の array_fill 関数を利用するのが良いという結論に達します。

    一応、確認のため、別の方法でもベンチマークをとってみました。

    すると、結果はやはり同一になりました。

    array()を算出

    • 平均値: 0.000090 [sec]
    • 全測定結果:
      Array
      (
          [1] => 0.000098
          [2] => 0.000088
          [3] => 0.000092
          [4] => 0.000089
          [5] => 0.000087
          [6] => 0.000090
          [7] => 0.000090
          [8] => 0.000089
          [9] => 0.000090
          [10] => 0.000092
          [mean] => 0.000090
          [iterations] => 10
      )

    array_fillを算出

    • 平均値: 0.000099 [sec]
    • 全測定結果:
      Array
      (
          [1] => 0.000104
          [2] => 0.000099
          [3] => 0.000099
          [4] => 0.000099
          [5] => 0.000099
          [6] => 0.000098
          [7] => 0.000099
          [8] => 0.000100
          [9] => 0.000098
          [10] => 0.000100
          [mean] => 0.000099
          [iterations] => 10
      )

    for loopを算出

    • 平均値: 0.000227 [sec]
    • 全測定結果:
      Array
      (
          [1] => 0.000230
          [2] => 0.000229
          [3] => 0.000228
          [4] => 0.000227
          [5] => 0.000229
          [6] => 0.000227
          [7] => 0.000227
          [8] => 0.000226
          [9] => 0.000228
          [10] => 0.000228
          [mean] => 0.000227
          [iterations] => 10
      )

    以上、覚書です。

  • PHPの比較演算子についての覚書

    PHPの比較演算子には、気をつけるべき点が多くあります。

    今回、少しはまったので覚書しておきます。

    基本的に、一致を確認する場合には、型まで比較する
    ===
    演算子を使うことが推奨されています。

    === 演算子は、2つの要件を必要とします。

    1.型が同一であること。かつ、2.値が同一であること。

    この2つの要件を両方満たして、真となります。

    逆に、不一致を確認する場合には、
    !==
    演算子を使います。

    !== 演算子は、2つの要件のうち、1つを必要とします。

    1.型が同一でないこと。または、2.値が同一でないこと。

    このどちらか1つの要件を満たせば、真となります。

    つまり、=== は、かつ、という要件が必要ですが、!== は、または、で良いわけです。

    基本中の基本ですが、混乱しやすいので覚書しておきます。

    なお、型については、PHPマニュアルにかなり詳しく記述されています。

    比較演算子
    http://www.php.net/manual/ja/language.operators.comparison.php

    型の相互変換
    http://www.php.net/manual/ja/language.types.type-juggling.php

    型の比較表
    http://www.php.net/manual/ja/types.comparisons.php

    上記ページは、必読です。

    ところで、これらとは別に、型について緩く比較する演算子もあります。

    == 演算子ですが、これは使わない方が良いということです。

    理由は、気づかないうちに、型が自動変換されて、値も変換されてしまうからです。

    マニュアルにも以下の記述があります。

    整数値を文字列と比較したり、比較に数値形式の文字が含まれる場合は、文字列が    数値に変換され、数値としての比較を行います。

    型の自動変換は、便利なようで、思わぬバグの温床となるようです。

    もう一つの、

    != 演算子も、== 演算子ほどではないにしても、バグを生む可能性があります。理由は、やはり、型の自動変換をしているからです。

    以上、覚書でした。

  • 【PHP】セッションの削除の仕方

    PHPのセッションの削除方法についての覚書です。

    まずは、コード

    /**** セッション情報を削除 ****/
    //セッション変数を空に
    $_SESSION = array();
    //セッションクッキー削除
    if (isset($_COOKIE[session_name()])) {
        setcookie(session_name(), '', time() - 42000, '/') ;
    }
    //セッション破棄
    session_destroy();

    マニュアルでは下のリンク先の通りです。

    http://jp.php.net/manual/ja/function.session-destroy.php

    ポイントは、サーバー側でセッションを破棄するだけでなく、クライアント側のブラウザのクッキーも削除しなければならない点です。

    セッションを紐付けるクッキーは、セッションクッキーと呼ばれるもので、この自動生成されるクッキーも忘れずに削除する必要があります。

    公式マニュアルでは、ini_get関数を使って下のようにセッションクッキーを削除しています。

    // Note: セッション情報だけでなくセッションを破壊する。
    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $params["path"], $params["domain"],
            $params["secure"], $params["httponly"]
        );
    }

    ただ、これだと少しややこしいので、

    if (isset($_COOKIE[session_name()])) {
        setcookie(session_name(), '', time() - 42000, '/') ;
    }

    このように簡略化しても良いと思います。

    なお、蛇足ですが、このセッションの削除の処理は、ログアウト時点だけでなく、ログイン処理の最初でも行う方が良さそうです。ログイン前のセッションクッキーを削除することにより、セッションハイジャックの予防的な処理にもなるようです。