PHPファイルをHTMLへワンライナーで変換する簡単な方法

WEBフロントをやっていると、テンプレート化するためにPHPで作り 納品段階ではHTMLに変換することってよくあると思うんですが、 先日業務でPHPファイルをHTMLに変換する必要があり、色々調べていたら

Web学びさんが書かれていたPHPテンプレを静的HTMLに変換するコマンド]の記事を発見いたしました。 Web学びさんがつくられた ptoh は引数で渡したPHPファイルをHTMLに変換するのですが、今回は該当ディレクトリ内にあるPHPファイル全てHTMLに変換したかったので ptohを基にワンライナーで出来るものを作りました。

完成型

完成系は以下のようになります。以下ファイルの $target_dir を変換したいディレクトリに指定し、コマンドプロンプトなりターミナルなりで ファイルを実行すればPHPファイルは全てHTMLに変換されます。変換されたPHPファイルは削除されるのでご注意ください。 削除したくなければ unlink($file); をコメントアウトしてください。

#!/usr/bin/php
<?php

$iterator = new RecursiveDirectoryIterator($target_dir);
$iterator = new RecursiveIteratorIterator($iterator);

$list = array();
foreach ($iterator as $fileinfo) {
    if (!$fileinfo->isFile()) {
        continue;
    }

    $file = $fileinfo->getPathname();
    $info = new SplFileInfo($file);
    if($info->getExtension() == 'php'){
        convertHtml($file);
        unlink($file);
    }
}


function convertHtml($target){
    $contents = '';

    ob_start();
    include($target);
    $contents = ob_get_contents();
    ob_end_clean();

    file_put_contents(
        preg_replace('/\A(.+)\.(php?|html?)\z/', '$1.html', $target),
        preg_replace('/\A\n/', '', $contents)
    );
}

それではブロックずつ解説していきたいと思います。

対象ディレクトリの再起処理

$iterator = new RecursiveDirectoryIterator($target_dir);
$iterator = new RecursiveIteratorIterator($iterator);

対象ディレクトリを RecursiveDirectoryIteratorRecursiveIteratorIterator で 再起処理にてファイルを全て取得します。 恥ずかしながら今回このクラスを初めてしりました。 今までディレクトリの中のファイル一覧を取得するときって再起処理にて自身の関数を呼び出すやり方しかしらなかったもので。 これめっちゃ便利です

ファイルであれば処理をする

foreach ($iterator as $fileinfo) {
    if (!$fileinfo->isFile()) {
        continue;
    }
    ・
    ・
    ・
}

上記で取得したファイル一覧一つずつをみていきファイルであれば処理をするようにしています。

拡張子をみてPHPファイルのみ処理を行う

    $file = $fileinfo->getPathname();
    $info = new SplFileInfo($file);
    if($info->getExtension() == 'php'){
        convertHtml($file);
        unlink($file);
    }

RecursiveDirectoryIteratorFilesystemIteratorFilesystemIteratorDirectoryIterator::getPathnameを継承しているので getPathnameでファイルのパスとファイル名を取得

取得したファイル名から拡張子を取得するため PHP組み込みクラスSplFileInfogetExtensionで 拡張子を判別し、PHPならptohをラッパーした関数にファイルを渡すようにしております。 またHTMLに変換したPHPファイルは不要なのでunlinkにて削除するようにしております。

SqlFileinfoも今回初めてしりました。 以前は正規表現にて拡張子を取得していたのですが、このSplFileinfoもすごい便利ですね。

ptohを関数化

処理が煩雑になるためptohは関数化しております 引数はにて渡されたファイルをHTMLに変換するようにしております。

function convertHtml($target){
    $contents = '';

    ob_start();
    include($target);
    $contents = ob_get_contents();
    ob_end_clean();

    file_put_contents(
        preg_replace('/\A(.+)\.(php?|html?)\z/', '$1.html', $target),
        preg_replace('/\A\n/', '', $contents)
    );
}

以上、となっております。 今回PHP組込みクラスで知らなかったものが色々あったので 勉強になりました。

PHPStorm(WebStorm)でES6をBabelでコンパイル

速習ECMAScript6: 次世代の標準JavaScriptを今すぐマスター! を買ったので PhpStormでECMAScript6をコンパイルしようとしたら少しハマったので その方法を記述いたします。

実行環境は以下の通りとなっており nodjsとnpmはすでにインストール済みの想定です - MAC OS X Yosemite
- node v5.3.0
- npm v3.3.12

Babelをインストール

Babel本体はnpmからインストールするのでターミナルにて以下コマンドを実行

npm install -g babel-cli

ECMAScript6対応プリセットをインストール

Babel 本体だけではES6はコンパイルできないのでES6対応プリセットを 別途インストールする必要があるのでターミナルにて以下コマンドを実行

npm install --save-dev babel-preset-es2015

ES6コンパイル環境の作成

Babel に対応プリセットを設定するため PhpStormにてプロジェクトを作成しプロジェクトディレクトリのルートに .babelrc を作成し以下内容を記述

{
"presets": ["es2015"]
}

ES6コンパイルの設定

common.es6(ファイル名は適当)を作成すると File wather 'Babel' is ~~ と表示されるので、「Add Watcher」をクリック

f:id:ultrasevenstar:20160104231553j:plain

New Watcher ダイアログが表示されるので Watcher Settings File type ECMAScript 6 に変更し「OK」を押下

f:id:ultrasevenstar:20160104231607j:plain

f:id:ultrasevenstar:20160104231617j:plain

ES6コンパイル

common.es6に以下を記述しコンパイルされているか確認

class hoge{
    hogeMethod(){
       let hogeFunction = () => alert('test')
    }
}

上記ファイルの下にcommon-compeled.jsが作成され以下ファイルになっていれば コンパイル完了

'use strict';

var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var hoge = (function () {
    function hoge() {
        _classCallCheck(this, hoge);
    }

    _createClass(hoge, [{
        key: 'hogeMethod',
        value: function hogeMethod() {
            var hogeFunction = function hogeFunction() {
                return alert('test');
            };
        }
    }]);

    return hoge;
})();

//# sourceMappingURL=test-compiled.js.map

これでES6の実行環境は完成です。 PhpStormがあればリアルタイムで、コンパイルしてくれるので良いですね。

速習ECMAScript6: 次世代の標準JavaScriptを今すぐマスター!

速習ECMAScript6: 次世代の標準JavaScriptを今すぐマスター!

file_get_contentsの結果が404の場合

file_get_contentsでWEBサイトや画像を取得している時に 404で失敗する時の対処法。

ちなみにfile_get_contentで失敗した場合はfalseが返ると公式にはあるんですが、どうもPHPエラーが出てしまうので、その対処法も兼ねて。

$context = stream_context_create();
stream_context_set_option($context, "http", "ignore_errors", true);

まず上記のようにHTTPコンテキストオプションでignore_errorsをtrueに設定 設定するとステータスコードを無視してくれるようになります。

$html = file_get_contents("〜URL〜", false, $context);

設定したオプションを第3引数として渡してやると404ページでも エラーが表示されなくなります。

ちなみに404であった場合は返り値の配列の最初の値に404が記載されているので下記のようにすると判定可能

if(! preg_match("/404 Not Found/", $html[0])){
    echo "404です";
}

VagrantでMySQL daemon already running with the same unix socketが表示される

Vagrantを落とさずにPCを再起動した時に

MySQL daemon already running with the same unix socket

が表示されMySQLが正常に起動されない場合があります。

環境に左右されるんでしょうか? いまの環境やとVagrant起動時にPCの電源を落とすと100%上記現象が発生しますが 以前の環境だと全く発生しませんでした。

上記現象が発生した場合は

$ sudo rm -rf /var/lib/mysql/mysql.sock

とすることにより正常に起動する事ができる

大阪のドカ盛り聖地 喫茶Y

喫茶Y

f:id:ultrasevenstar:20140808124738j:plain

最近は老いもさらばえてきて、食欲減退が激しいですが これではイカんということで、職場の20代の大喰い二人を伴って 大阪のドカ盛りの聖地

喫茶Y

f:id:ultrasevenstar:20140808124800j:plain

に行って参りました。

僕自身は10年程前に一度行ったきりでして その時はカレー定食を頼み 1.ハンバーグ 2.焼き魚 3.おひたし 4.ハムエッグ 5.カレー が出てきて(全ておかわり自由)見事撃沈して参りました。

10年越しのリベンジと言うことで気合いは十分 朝からクリームパンと牛乳と言うベストカップルを胃に詰め込み いざ喫茶Yへ!

10年振りで以前お邪魔した時とは場所も変わっておりましたが、 外観は威風堂々としてドカ盛りの聖地としては風格十分!

僕は喫茶Yの屋号を戴く Y定食 若手二人は チキンカツサンド豚の生姜焼き定食 を頼むことに。

若手二人の腹の虫をBGMに待つ事少々

待望のファーストコンタクトは ハムエッグさんです!

f:id:ultrasevenstar:20140808124814j:plain

ベーコン丸ごとが2枚にハム1枚、卵が2個で これだけでメーンイベンターを貼れるのではないかという御仁 これだけで僕は少々お腹が膨れてきました。

さらに間髪入れず。ありし日のモハメドアリを彷彿とさせるワンツーで ハンバーグ様のご光臨です。

f:id:ultrasevenstar:20140808125205j:plain

とても家庭的な味でオカンの顔がまぶたの裏にうつりました。 オカーーン!

そこからは怒濤のラッシュで

  • 切り干し大根
  • 貝割れ大根のみそ汁
  • ハムカツ

f:id:ultrasevenstar:20140808131856j:plain

そして豚の生姜焼き定食でご待望のメインディッシュ! 豚の生姜焼き

f:id:ultrasevenstar:20140808131927j:plain

からの全盛期の殺人魚雷コンビを彷彿とさせる チキンカツサンドアイスコーヒー

f:id:ultrasevenstar:20140808131948j:plain

僕は殺人魚雷コンビより 人間魚雷スティーブ・ウィリアムス の方が記憶に残ってます。 当時3冠ベルトホルダーの故三沢光晴への挑戦権をかけた 小橋建太とスティーヴウィリアムスの対決

当時流行りだした投げ捨てジャーマンスープレックスや垂直落下式バックドロップ等のかなり危険な技の応酬 スティーブウィリアムスの垂直落下式バックドロップを何度も喰らいながらもフラフラになりながら立ち上がり続けた小橋健太のあの姿には涙しました。

おっと、テンションあがってきて話が逸れてしまいました。 申し訳ないです。

もう僕は1周目でK.O寸前やったんですが 若手ははそこからさらに生ビールの大ジョッキに注がれた バナナジュース

f:id:ultrasevenstar:20140808132238j:plain

チキンカツサンドに関しては確認してなかったんですが、 それ以外のメニューに関しては基本的におかわり自由という 太っ腹仕様

さらにマスター?のお姉さんと写真も撮って頂きました。

f:id:ultrasevenstar:20140808132256j:plain

10年振りやったんですが、ドカ盛りの看板には偽りなしでした。

ドカ盛りって見るだけではしゃげるし、かなり楽しめること間違い無しです。

杓子定規なことは良いたくは無いですが、 正におなかも心も一杯な昼下がりでした。

関連ランキング:喫茶店 | 中崎町駅中津駅(大阪市営)梅田駅(阪急)

醤油は黄!ソースは赤!

f:id:ultrasevenstar:20140729233246j:plain
思い込みは怖いなって話

職場の近くにチェーン展開してるうどん屋さんがあるんです。
カウンターだけで定食がワンコインで食べれるとあって昼時はカウンターの後ろでサラリーマンが立って待っている程。

そこの定食でいつも冷奴がついてくるので、いざ食べようと思うといつも間違ってソースをかけてしまうんです。

別にソースが好きでも、耄碌してるわけでもない。

f:id:ultrasevenstar:20140807035911j:plain

ソースの瓶が黄色なんです!
そして醤油の瓶が赤!

さらにソースがキーッコーマン!


キッコーマンて醤油のイメージじゃないですか?
僕だけ?!


この話すると大半は頷いてくれるんで、やはり黄色が醤油、赤がソースは暗黙の了解なのかなとは思ったんでんすが、皆さんどうでしょうか?

ご意見もらえたらありがたいなーとスケベ根性で締めたいとおもいます。

ありがとうございました。