PHP5.6 から PHP7 への移行

セキュリティサポートは延長され2年程続くが、アクティブサポートは終了している。
PHPのリリース日とサポート期限

PHP 5.6.x から PHP 7.0.x への移行

余程の変態コーディングをしていなければ、大事にはならない模様。
一部削除された関数があるので要チェック。
ereg()、split()は削除されたがmb_ereg()、mb_split()は残っていたりする為。

また、エラーレベルが変わった関係でAjaxレスポンスにエラーメッセージが混入して、Jsonパースエラーみたいな例があったり。
自前のコードはどうにでも出来るがComposer経由でインストールしているライブラリのが面倒。
(PHP7に対応しているバージョンがあればそちらを指定)

AmazonのMWSライブラリの一部が軒並みダメ。

PHP Fatal error: Redefinition of parameter $quotaMax in FBAInboundServiceMWS\Model\ResponseHeaderMetadata.php on line 31

引数名の重複を修正。
システムのソースに混ぜるのは嫌だったので、GitHubに修正版を登録。ライセンスで再配布を許可しているため、同じような目的でforkされているのが散見される。
Composerからのインストール後で入れ替えが効くようZIPから展開させている。

公式の期限では後2年となり、移行期間として十分だろう。
7.1からパフォーマンスが上がっているのも嬉しい。
IDEなどを利用して、日頃から@deprecatedに気を配れば移行の負担も軽減される。

PHP7とSSL

WordPressのPHPを5.6から7にしてみました。
一部プラグインがエラーになり、画面すら表示されませんでしたが、エラーログを見て該当プラグインを削除して対応。

PHP5からPHP7への移行は比較的カンタンになっていますが、一部関数が削除されていたり、今まではwarningだったのがfatalになっていたりするので、全文検索して修正すると良いでしょう。

また、こちらのサイトは「さくらインターネット」のレンタルサーバで運用しています。
複数ドメインあるならVPSでも良かったのですが、メンテを考えると安上がりです。

最近では無料SSLなるものが登場しており、興味を持ったのですが、更新作業が必要だったり手間が掛かりそう。
レンタルサーバにも「ラピッドSSL」オプションが登場していて、3年で3,456円(2017年)と爆安。
ブロガーではないのでgoogleの常時SSL化には怯えていないのですが、導入してみました。
証明書の発行もあっという間で、設定は管理画面に貼り付けるだけなので、楽々出来ました。

Raspberry Piでblink(1)を光らす Gmail編

公開って程でもないけど!!ハードルを下げてからいきます。

なぜモジュールがあるrubyでないのか、面倒だったからです・・・。

lib/blink1.php

<?php
class blink1 {
        public function __construct() {
//              $this->blink1Tool('-m 0 --off');
        }
 
        protected function blink1Tool($arg) {
                $last_line = system('blink1-tool ' . $arg, $retval);
 
                echo $last_line;
 
                return $retval;
        }
 
        protected function rgb($r, $g, $b, $ms = 500) {
                $this->blink1Tool("-m {$ms} --rgb {$r},{$g},{$b}");
        }
 
        protected function turnOnOne($r1, $g1, $b1, $r2, $g2, $b2, $ms = 500) {
                $this->blink1Tool("-l 1 -m {$ms} --rgb {$r1},{$g1},{$b1} && blink1-tool -l 2 -m {$ms} --rgb {$r2},{$g2},{$b2}");
        }
 
        private function repeatFlashes($r, $g, $b, $repeat) {
                for($i = 0; $i < $repeat; $i++) {
                        $this->rgb($r, $g, $b);
                        usleep(500000);
                        $this->rgb(0, 0, 0);
                        usleep(500000);
                }
        }
 
        public function red($repeat = 3) {
                $this->repeatFlashes(255, 0, 0, $repeat);
        }
        public function green($repeat = 3) {
                $this->repeatFlashes(0, 255, 0, $repeat);
        }
 
        public function blue($repeat = 3) {
                $this->repeatFlashes(0, 0, 255, $repeat);
        }
 
        public function white($repeat = 3) {
                $this->repeatFlashes(255, 255, 255, $repeat);
        }
 
        public function yellow($repeat = 3) {
                $this->repeatFlashes(255, 255, 0, $repeat);
        }
 
        public function purple($repeat = 3) {
                $this->repeatFlashes(255, 0, 255, $repeat);
        }
 
        public function policecar($repeat = 6) {
                for($i = 0; $i < $repeat * 2; $i++) {
                        $this->turnOnOne(
                                255, 0, 0,
                                0, 0, 0,
                                300
                        );
                        usleep(300000);
                        $this->turnOnOne(
                                        0, 0, 0,
                                        0, 0, 255,
                                        300
                        );
                        usleep(300000);
 
                        $this->rgb(0, 0, 0, 100);
                        usleep(100000);
                }
        }
        public function fireengine($repeat = 6) {
                for($i = 0; $i < $repeat * 2; $i++) {
                        $this->turnOnOne(
                                        255, 0, 0,
                                        0, 0, 0,
                                        300
                        );
                        usleep(300000);
                        $this->turnOnOne(
                                        0, 0, 0,
                                        255, 0, 0,
                                        300
                        );
                        usleep(300000);
 
                        $this->rgb(0, 0, 0, 100);
                        usleep(100000);
                }
        }
}

Windows版ユーティリティの点灯パターンをちょっとだけ再現。

gmail.php

<?php
require_once 'lib/blink1.php';
 
$gmail = new gmail();
$gmail->check();
 
 
class gmail {
        private $hostname;
        private $port;
        private $flags;
        private $username;
        private $password;
 
        public function setUp() {
                mb_language('ja');
                mb_internal_encoding('UTF-8');
                $this->hostname = 'imap.googlemail.com';
                $this->port = '993';
                $this->flags = '/novalidate-cert/imap/ssl';
                $this->username = 'アカウント名';
                $this->password = 'パスワード';
        }
        public function check(){
                $this->setUp();
 
                $mbox = imap_open(
                        '{' . $this->hostname . ':' . $this->port . $this->flags . '}INBOX',
                        $this->username,
                        $this->password
                );
                $uids = imap_search($mbox, 'UNSEEN', SE_UID);
                imap_close($mbox);
 
                if($uids === false) return ;
 
                $unread = count($uids);
                $blink1 = new blink1();
 
                if($unread >= 1 && $unread <= 3) {
                        $blink1->blue(5);
                } else if($unread >= 4 && $unread <= 6) {
                        $blink1->yellow(5);
                } else if($unread >= 7 && $unread <= 10) {
                        $blink1->red(5);
                } else if($unread > 10) {
                        $blink1->fireengine();
                }
        }
}

単純に未読数をしきい値に光らせてます。

check.sh

#!/bin/bash
 
cd /home/pi/notification
/usr/bin/php gmail.php

シェルスクリプトを作って、cronから呼びます。

*/15 8-23 * * * /home/pi/notification/check.sh

夜中は光ってほしくないので8~23時の間、15分間隔でチェック。