ブログ

  • PHPの可変変数 $$変数 ドルが2つ連続

    PHPのサンプルプログラムを見ていたら、よくわからない記号が。

    $$変数 という記号。いきなり、ドルが2つ連続。

    昔、どこかで見たなと思いつつ調べてみると、可変変数だとか。

    PHPマニュアル参照↓
    http://php.net/manual/ja/language.variables.variable.php

    <?php
    $a = 'hello';
    ?>
    
    <?php
    $$a = 'world'; //これが可変変数。ドルが連続。
    ?>
    <?php
    echo "$a ${$a}"; //表示すると、hello world
    ?>
    <?php
    echo "$a $hello"; //これも表示すると、hello world
    ?>

    なるほど。変数に更に変数を入れる感じと理解。

    ただ、あまり使いたくないテクニックかも。わかりづらいし。

  • CRONをXREA/CORESERVERで利用する方法

    XREA/CORESERVERにはCRONという機能が備わっています。

    CRONとは、定期的にプログラムを自動実行してくれる機能です。

    早速、試しに、このCRONをCORESERVERに設置してみましょう。

    【ここでのCRONの目的】

    サーバーのCRONを設定して、実際にどのように動くのか簡単なサンプルを使って実験してみます。

    サンプルの内容は、cron起動ファイル cron.sh を起動して、実行ファイル cron1.php で毎時、時刻を取得し、その結果をcron2.php に書き出すという単純なものです。

    【ファイル構成例】

    • cron.sh (705) ルートディレクトリに設置(一番上の階層)
    • cron1.php  (705) public_htmlディレクトリ内に設置
    • cron2.php  (606) public_htmlディレクトリ内に設置

    カッコ内の数字はファイルのパーミッションです。cron2.php に結果を書き出すので、このファイルは606としておきます。

    cron.shの拡張子 .sh は見慣れないかもしれませんが、シェルスクリプトの先頭shをさしていると思われます。cronの起動にはこの.shファイルが必要です。ここでは、phpファイルで実行するのですが、phpでなくてもよく、Perl,Rubyなどのスクリプトでも可能です。

    それでは、各スクリプトの中身を記述します。

    【スクリプトの中身】

    cron.sh

    #!/bin/sh
    #PHP
    /usr/local/bin/php /virtual/account/public_html/cron1.php
    exit

    accountには、XREA/CORESERVERの自分のアカウントを入れます。そして、実行するファイルが、public_html/cron1.phpなので、そこまでのパスを記述します。たったの4行だけです。
    ※ 改行コードは必ず「LF」で指定。

    cron1.php

    <?php
    # 出力先ファイル名を設定します。
    $fileName = 'cron2.php';
    // 書き込む文字列
    $string = date('Y年m月d日 H時i分s秒');
    $string .= '<br>';
    # データを書き込みます。
    file_put_contents($fileName, $string, FILE_APPEND );
    ?>

    まず、出力先であるcron2.phpを、$fileNameに代入しています。続けて、date関数で年月日と時刻を取得して$stringに代入。その後改行のための<br>も追加で代入しています。そして、file_put_contents 関数でcron2.php に追加書き加えしていきます。

    cron2.php

    //このファイルに時刻を自動的に書き込みます。
    //文字列testとでも書いておいてください。空でもOK。
    test

    cron2.phpはcron1.phpの結果を受けるものなので、空でもかまいません。

    おさらいすると、cron.sh で、CRONを起動して、cron1.php でプログラムを自動実行。そして、その結果を cron2.php に書き込むいうものです。

    【CRONジョブの設定】

    ファイルを設置したら、XREA/CORESERVERの管理画面からCRONジョブを選びCRONの設定をしてみましょう。

    XREA/CORESERVERでcronの設定

    CRON設定画面の一番上の設定0の枠に設定していきます。

    毎時、実行する場合には、分を0 にします。その他はワイルドカードの*を記入します。

    そして、ファイルのパスは、起動のための cron.sh を記入します。

    記入が終わったら「保存」をクリックして保存します。

    これで、毎時、00分にCRONが実行されます。
    果たしてどうなるでしょうか?

    【実行結果】

    XREA/CORESERVERでのCRONの結果

    ブラウザで、cron2.phpを開くとこのように毎時、日時を取得して書き加えられていることがわかります。ここでのCRONの設置は上手くいきました。
    (01秒となっているのは、cron.shファイルが00秒に実行され、cron1.phpがその一秒遅れになっているからと思われます。)

  • PHPスクリプトで誕生日や記念日までの残日数をカウントする

    誕生日や記念日などの毎年訪れる定期日までの残日数をカウントするためのPHPスクリプトを作ってみました。

    下記のスクリプトは、例として、年度末(3月31日)までの日数を計算するように設定しています。必要に応じて、最初の、3、31の部分を変更してください。

    <?php
    
    $tuki = 3 ;
    $niti = 31;
    
    $one_day = 60 * 60 * 24;
    $this_y = date(Y);
    
    $t1 = time();
    $t2 = mktime(0, 0, 0, $tuki, $niti, $this_y);
    
    if ($t1 < $t2) {
    
    $remain_day = ceil (($t2 - $t1) / $one_day);
    echo ($remain_day);
    
    } else {
    
    $next_y = ++$this_y ;
    $t3 = mktime(0, 0, 0, $tuki, $niti, $next_y);
    $remain_day = ceil (($t3 - $t1) / $one_day);
    
    $tukihi1 = date ('Ymd', $t1) ;
    $tukihi2 = date ('Ymd', $t2) ;
    $remain_day = ($tukihi1 != $tukihi2) ? $remain_day : 0;
    
    echo ($remain_day);
    }
    
    ?>

    PHPを知らない人のためにコメントを付けておきます。

    <?php
    
    $tuki = 3 ; //設定したい月
    $niti = 31; //設定したい日
    
    $one_day = 60 * 60 * 24; //1日の秒数
    $this_y = date(Y); //現在の年
    
    $t1 = time(); //現在のタイムスタンプ
    $t2 = mktime(0, 0, 0, $tuki, $niti, $this_y); //目標日のタイムスタンプ
    
    if ($t1 < $t2) { //目標日の月日が今日より後の場合
    
    //タイムスタンプの差を日付に直し、切り上げて残日数を計算
    $remain_day = ceil (($t2 - $t1) / $one_day);
    echo ($remain_day); //出力
    
    } else { //目標日の月日が今日より前の場合(当日含む)
    
    $next_y = ++$this_y ; //来年の年
    $t3 = mktime(0, 0, 0, $tuki, $niti, $next_y); //来年の目標日のタイムスタンプ
    
    //タイムスタンプの差を日付に直し、切り上げて残日数を計算
    $remain_day = ceil (($t3 - $t1) / $one_day);
    
    //当日に365と表示されるのを0にする処理
    //当日に365と表示されてもよいなら下3行は不要
    $tukihi1 = date ('Ymd', $t1) ; //現在の月日
    $tukihi2 = date ('Ymd', $t2) ; //目標日の月日
    //カウントダウン当日:現在の月日と目標日の月日が同じなら0を代入
    $remain_day = ($tukihi1 != $tukihi2) ? $remain_day : 0;
     
    
    
    
    echo ($remain_day); //出力
    }
    
    ?>

    一応こんな感じです。間違いや不具合があるかもしれないので、ご利用は自己責任でお願いします。当ブログでは一切責任を負いません。間違いを見つけられた場合、コメントでご指摘くださるとありがたいです。

    <参考にしたブログ>
    フロッグさんの日記
    http://d.hatena.ne.jp/frogfrogfrog/20091111
    わかりやすくてとても助かりました。

  • super-goo.comからの不審なアクセス

    最近、自分の運営するWEBサイトのアクセスカウンターの数値と、そのサイトに設置しているアクセス解析の数値が乖離気味なので、不審に思いサイトのアクセスログを久しぶりに開いてみました。

    すると、異常なアクセスが一つ。

    super-goo.com が日に、300~500件ほどアクセスしています。

    hostは、
    hk2-lr680005g.super-goo.com
    hk2-lr680091g.super-goo.com

    調べると、goo社の携帯向け検索ロボットだとか。

    http://help.goo.ne.jp/help/article/1142

    .htacessで、このhost自体をアクセス拒否することも可能なのですが、検索ロボットということでアクセス拒否するか少し迷います。

    googleなどからもロボットは来るのですが、それは、日に30件ほど。super-goo.comは、その10倍以上です。もう少し様子を見て、これ以上、巡回がきたらアクセス拒否にした方が良いかな。

  • 【Ajax】ieでonreadystatechangeが動かないエラーの対策

    Ajaxの非同期通信をWEBページに取り入れるべく、コーディングしていたら、ie(インターネットエクスプローラー)だけでエラーが出る現象に直面。

    FireFoxやSafari、Operaなどでは、スイスイ動くのに、なぜかie7では動かない。前日の夜と本日の半日をかけて、ようやく動いたので覚書しときます。

     req.onreadystatechange = function(){
     処理
    }

    結論から言うと、onreadystatechangeの処理の中身がifの入れ子になっていたため動かなかった模様。

    if節のエラーかとも思って確認したところif節にはエラーは確認できず。そもそも、FireFoxなどでは問題なく動くので原因は不明。

    しかし、このif節を単純化し下のようにしたら、なぜかieでも動くように。

    req.onreadystatechange = function(){
      if(req.readyState == 4 && req.status == 200 ){
      var kekka = req.responseText;
       document.getElementById("result").innerHTML = kekka;
       }
     }

    上記だと、ifは一つだけです。単純化できてミスも防げます。

    エラーがでていたコードは、if (){if(){}else{}}else{} のように場合わけしていたのですが、この構文の時には、onreadystatechangeがピクリともせず。
    調べると、キャッシュされていると動かないとか。if節の場合分けの過程で、キャッシュされている可能性があるのかも。

    JavaScriptでエラー箇所を探すには、下のコードを怪しい部分に一行ずつ、ずらしながら入れていくと発見できます。

    alert("アラート");

    onreadystatechangeの下に入れると正常に動く場合には、連続して3回このアラートが出るので動いているかいないかの判断がつきます。

    参考(調べているとき参考になったページ)

    http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1022889295