POASの稼働環境がすべてPHP7に

昨日の更新で、POASがすべてPHP7の環境下での稼働に切り替わりました。
数年前の脱PHP5を考えていた頃に、CentOSが(いろいろな意味で)使えなくなる騒動があり、様子を見ている間に凄い年月が経ってしまっていました。
現在はAlmaLinuxが安心だということで、サーバを切り替えている途中でして、これでやっと一段落です。

POASとはPrintOrderAdministrationSystemの略で、要は印刷注文システムです。
更新停滞気味のサイトも用意しております。
※たまにサイトが移動します。どちらかでアクセスできるはずです。
印刷業者や新規参入の方、印刷注文のウェブ受注を始めたいと興味を持たれた場合はご連絡ください。

現時点の開発環境では、PHPのバージョンを5か7かを判定する分岐が残っていますので、これをすべてPHP7ように最適化してPHP5までのコードを完全に削除される予定です。
他にも色々最適化は行っており、運営しながらあーでもない・こーでもないとシステムを弄りまくっておりますので、更新のたびに不具合が直ったり逆に増えたりするかもしれません。

PHPでSSLの情報を取得する

以前にも少し仕掛けていたのですが、PHPでSSLの情報を取得するクラスを作りました。
正確には、作りかけていたクラスをしっかりした形に直しました。
ベースとなっていたソケットを使用する方法に、エラー判定や新しいメソッドを追加したりした上で、
cURLを使用する方法を追加しました。
モードを切り替えることで、ソケットとcURLを使い分けられるわけですが、VPSでもレンサバでも、どっちも動くみたいなので、1つのクラスに両方を実装した意味があったのかどうかは謎です。

で、新しく用意したクラスを使ったツールは、「SSL情報取得」にて公開しました。
サーバー管理ツールに組み込んだり、結果をフックして通知させたり、API的に使えるようになるといいかもですね。
いい加減に、Let’s Encryptの更新漏れを見落とさないようにしないと…

PHP5.3で#は非推奨(いまさら)

特に変更を加えていない処理を通るテストをしていると、
Deprecated: Comments starting with '#' are deprecated
と大量の非推奨メッセージが。
どうやらPHP5.3から#のコメントは非推奨になったとのことで、そのエラーが出ていたようです。

ちょっと前に、Yahoo!ウォレット実装のために5.3に上げたのが原因でしょう。
そういえば、まだ審査結果が来ないのですが。

通常のスクリプトには#は使わないのですが、iniファイルでは普通に使っていました。
perlと共用できる利点があったのですが、これで分けないといけなくなったのはちょっと残念です。

PHPのセッション管理はスッキリさせたい

PHPで手続きの途中で別のことをさせてまた戻るときに、
セッションに中断した情報を保存させたりします。
また、リダイレクト先でメッセージを表示させたいときにも利用しますね。

いままでは
$_SESSION['notice'] = $_SERVER['REQUEST_URI'];

$location = './';
if( isset($_SESSION['location']) ){
$location = $_SESSION['location'];
unset($_SESSION['location']);
}
header("Location: $location");

とかやったりするわけですが、あちこちでこんな処理を書くのはダサいですよね。

なので、ユーザ用クラスを作って放り込むことにしたわけです。
手続の中断情報を入れるために、カッコよくInterceptとでもしましょう。

class USER {

public function setIntercept( $location ){
$_SESSION['location'] = $location;
}
public function getIntercept( $flagClear=false ){
if( !isset($_SESSION['location']) ){ return; }
$location = $_SESSION['location'];
if( $flagClear ){ $this->clearLocation(); }
return $location;
}
public function clearLocation(){
if( !isset($_SESSION['location']) ){ return 0; }
unset($_SESSION['location']);
return 1;
}

}

こんな感じでスッキリさせました。
※コードは直書きでtypoちゃんと見てません、あしからず。

PHPのSmartyテンプレート内でstr_repeatを使う

テンプレートエンジンSmartyでのお話。
PHPの関数も基本的には使用できるのですがパラメータで何時も同だったらちょっと悩むので、検索したらヒットするように残しておこうかなと。
マニュアルを見なくても大体わかりますよね。
string str_repeat ( string $input , int $multiplier )
PHPでstr_repeat(1,2)と書くものは、
Smartyでは第1パラメータを先頭に持ってきて、{1|str_repeat:2}となります。
一度使うとしばらくは覚えてるんですが、なぜか忘れてしまっていますね。

ImageMagickの動作が重いオプション

開発環境のWindows7上では全く問題にならなかった、dissolveオプション。
明るさを調整したかったものの、brightness-contrastがバージョンの都合で使えず、modulateはコントラストだったので、白い画像を作成してdissolveで透明度を指定して合成するように調整してみた。
開発機では問題がなく、いざVPSに上げると動作が遅い、というか重い。
これは使えたもんじゃない。
まだmodulateの方がまし。
この感じだと、むりにOSのバージョン上げてImageMagickを上げても動作が遅い可能性もあるわけで、どうしたものか。
処理によってPHPとPerlが走って、結果は同じにならないと困るので、言語ごとにチューンされてるGDも少し危険な感じ。

困った困った。

PHPのsimplexmlでハマる

PHPでXMLファイルを使用する必要がありました。
多段階層のデータを参照配列で扱いたいのです。
PHPでXMLファイルを作成して、Perlのスクリプトで使用するというプロセスです。
PHPのセッションに格納しておいて、セッションファイルを直接読みに行かせるなども考えたのですが、
メンテナンスを考えて結局XMLファイルを用意する方法に決定。

XMLファイルをPHPで読み直す際に問題が発生。
ノードがオブジェクトのまま、simpleXMLElementになっていて扱いづらい。
単階層の場合は、(string)$hogeとか、“$hoge”とかするだけで何とかなるのですが、多段階層の場合はそうもいきません。
他に構造を扱う関数としてjson_decode(json_encode($hoge),true)で何とかなるかと思いきや、空値が配列になってしまう問題が発生。空値用の特別文字「{empty}」などを用意してみたりしても、判定を追加する箇所が多すぎで挫折。
さらに、「<!CDATA[fuga]]>」も配列になることが判明、まったく使い物になりませんでした。

最終的には、ドキュメントで何を言っているのかよくわからなかったパラメータを適当に採用していたら、希望する動作を見せたので落ち着きました。
結局はこうなりました。
simplexml_load_file( $set_file, 'simpleXMLElement', LIBXML_NOCDATA )

PHPは、関数の動作がこうもいい加減なものが多いですね。
互換のためにいろんなパラメータが追加されたり、関数名が変更になったりと振り回され続けるしかないですね。

PHP5.3に怒られる

PHPを5.3にアップデートすると、今までのスクリプトが動かなかったりエラーが表示されるようになったりする。
特に、split関数を使うなコノヤローと、
「Deprecated: Function split() is deprecated in…」
と怒られるので、見逃してもらえるようphp.iniに呪文を唱える。
「error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED」
標準では、
「error_reporting = E_ALL」
となっているのでコメントアウトしておこう。
php.iniを保存して、httpdをリスタートさせれば、エラー表示が消えるはずです。
とりあえず、今後はsplitを使うのをやめて、explodeを使うように心がけよう。
でめたしでめたし。