WordPressをphp7.4にバージョンアップ

wordpressを動かすphp-fpmのバージョンを7.0から7.4にした際にやった事と、つまづいた事をメモします。

やったこと

初めに、PHP Compatibility Checker を使って、php7.3までの動作をチェックしました。

全てのプラグインで「互換性あり」と出たので、php7.4-fpmへ切替したのですが、ヘッダーは表示されるのに、コンテンツが何も表示されない状態になりました。php7.3-fpmも試しましたが、同じ現象となりました。

ググると、どうも crayon-syntax-highlighter が怪しいという事がわかり、githubにfix versionが公開されていたので、ダウンロードして現在のプラグインに上書きし、php7.4-fpmにしたところ、ちゃんと動作しました。めでたしめでたし。以下に作業ログを貼っておきます。

作業ログ

Fixバージョンを取ってきて展開する

% mkdir ${HOME}/tmp
% cd ${HOME}/tmp
% wget https://github.com/Crunchify/crayon-syntax-highlighter/archive/2.8.6.tar.gz
% gzip -dc 2.8.6.tar.gz | tar xf -

展開したファイルを運用中のpluginに適用する

展開すると、crayon-syntax-highlighter-2.8.6 というディレクトリが出来ている。Wordpressのプラグインのpathが、/var/www/wp-content/plugins/crayon-syntax-highlighter/ だとして、以下で上書きする。

% cd crayon-syntax-highlighter-2.8.6/
% tar cf - . | \
  ( cd /var/www/wp-content/plugins/crayon-syntax-highlighter/ ; \
  sudo tar xf - )

php7.4-fpmに変更する

以下は、私の環境ですので、各々の環境に合わせて変更してくださいね。

php7.0と同じパッケージをphp7.4でも用意する

% apt list --installed | \
  grep ^php7.0 | \
  awk -F\/ '{print $1}' | \
  sed 's/7.0/7.4/' | \
  xargs -n1 sudo apt install -y

php7.0-fpm と php7.4-fpm 両方とも起動している事を確認する

% sudo service php7.0-fpm status
% sudo service php7.4-fpm status

※ php-fpmの設定 /etc/php/7.0/php-fpm.confや、/etc/php/7.0/pool.d/www.conf など変更していたら、php7.4-fpmの設定にも反映し、reloadしておいてください。

nginxの設定を変更して切り替える。ここでは、old.confが古い設定で、new.confが新しい設定と仮定します。その変更差分の結果を示します。

% cd /etc/nginx/sites-enabled
% diff old.conf new.conf
12c12
< fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
---
> fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;

% sudo service nginx restart

バージョンが上がっていることを確認します。

ツール>サイトヘルス>情報>サーバー の順で選択し PHPバージョンの欄を確認してください。

php7.0-fpmを停止して削除する

% sudo service php7.0-fpm stop
% sudo service php7.0-fpm status
% sudo apt list --installed | \
  grep ^php7.0 | \
  awk -F\/ '{print $1}' | \
  xargs -n1 sudo apt remove
% sudo apt list --installed | \
  grep ^php7.0 | \
  awk -F\/ '{print $1}' | \
  xargs -n1 sudo apt-get purge
% dpkg -l | grep ^rc | grep php7.0

以上です。お疲れさまでした~(*’▽’)ノ

imapをつかったDoCoMoからGmailへの転送ツールの作成

概要

例えば、プロバイダメールや、スマホメールをGoogleメールに集めたい。でも、Gmailでは、POP3による外部メールの取り込み機能はあるけど、IMAPで取り込みが出来ない・・・
そんな時に以下のスクリプトをどこかに仕掛けておけばOKです!
私は使っていませんでしたが、昔imodeのメールを転送するサービス「imoten」というのがあったようですね。今回のツールはメールを転送するものではなくて(結果そうなっているように見えますが)クライアント動作として、source側からIMAPでとってきて、destination側にIMAPで差し込みをしちゃうだけのツールになります。

事前準備

imap接続に際して、以下の準備が必要です。

  • Gmailの設定で、IMAPアクセスの項目で、IMAPを有効にするを選択
  • googleアカウントの設定で、安全でないデバイスからの接続を許可
  • 各種スマホメールをWifiなどのインターネット経由で閲覧可能にする

手順概要

  1. スクリプトファイルを設置する
  2. cronの設定をする

手順

  1. スクリプトファイルを設置する
    ココでは、設置するファイル名を mailrelaytool.php と、します。
    また、phpは imap, sslをコンパイル時に利用できるようにしており、imap.soをphp.iniもしくは実行時のextensionの設定で利用できる状態である事とします。
    以下のプログラムを /home/USERNAME/bin/mailrelaytool.php に設置したとします。

    < ?php
    
    $imapSrc = array(
      'user' => 'test1'
     ,'pass' => 'test1'
     ,'host' => 'imap.spmode.ne.jp'
    );
    
    $imapDst = array(
      'user' => 'test2@gmail.com'
     ,'pass' => 'test2'
     ,'host' => 'imap.gmail.com'
    );
    
    $now  = time();
    $last = $now - 1800;
    
    $imapSrc = imap_open("{" . $imapSrc['host'] . ":993/imap/ssl/novalidate-cert}INBOX"
                   , $imapSrc['user']
                   , $imapSrc['pass']
                   ) or die (var_dump(imap_errors()));
    
    $imapDst = imap_open("{" . $imapDst['host'] . ":993/imap/ssl/novalidate-cert}INBOX"
                   , $imapDst['user']
                   , $imapDst['pass']
                   , NULL
                   , 1
                   , array('DISABLE_AUTHENTICATOR' => 'PLAIN')
                   ) or die (var_dump(imap_errors()));
    
    $imapSrcs = imap_check($imapSrc);
    $overview_list = imap_fetch_overview($imapSrc, "1:{$imapSrcs->Nmsgs}", 0);
    
    foreach ($overview_list as $overview) {
      $time = strtotime($overview->date);
      if ($time < $last) { continue; }
    
      $head = imap_fetchheader($imapSrc, $overview->msgno);
      $body = imap_body($imapSrc, $overview->msgno);
    
      imap_append($imapDst, "{" . $imapDst['host'] . ":993/imap/ssl/novalidate-cert}INBOX", $head . $body);
    }
    
    imap_close($imapSrc);
    imap_close($imapDst);
    exit();
    
    ?>

    ※ここでミソはgmailはPLAINに対応していない事です!

  2. cronの設定をする
    % export EDITOR=vi
    % crontab -e
    0,30 * * * * /usr/bin/php -d extension=imap.so -f /home/USERNAME/bin/mailrelaytool.php 2>&1
    

    ※cliのphp.iniにextension=imap.so の記述があれば、「-d extension=imap.so」の部分は不要です。

以上です!

その後、修正版。2重起動防止。いつ発動しても良いように、前回取得時間を記憶するようにした版
エラー処理とか手抜きなので、使う時には直してね!

< ?php

$imapSrc = array(
  'user' => 'test1'
 ,'pass' => 'test1'
 ,'host' => 'imap.spmode.ne.jp'
);

$imapDst = array(
  'user' => 'test2@gmail.com'
 ,'pass' => 'test2'
 ,'host' => 'imap.gmail.com'
);

$count = 0;
$wait  = 10;
$retry = 2;
$lockfile = "./relaymail.lock";
$backNumber="./relaymail.bknm";

if(file_exists($lockfile) && (time() - filemtime($lockfile)) < 300){
  exit();
}
$lock = fopen($lockfile, "w");

$src = imap_open("{" . $imapSrc['host'] . ":993/imap/ssl/novalidate-cert}INBOX"
               , $imapSrc['user']
               , $imapSrc['pass']
               );

$dst = imap_open("{" . $imapDst['host'] . ":993/imap/ssl/novalidate-cert}INBOX"
               , $imapDst['user']
               , $imapDst['pass']
               , NULL
               , 1
               , array('DISABLE_AUTHENTICATOR' => 'PLAIN')
               );
if(imap_errors()) {
  fclose($lock);
  unlink($lockfile);
  exit();
}

$srcs = imap_check($src);
$overview_list = imap_fetch_overview($src, "1:{$srcs->Nmsgs}", 0);


$last=file_get_contents($backNumber, true);
if(!$last){ $last = time() - 60; }

foreach ($overview_list as $overview) {
  $time = strtotime($overview->date);
  if ($time < $last) { continue; }

  $count++;
  $head = imap_fetchheader($src, $overview->msgno);
  $body = imap_body($src, $overview->msgno);

  imap_append($dst, "{" . $imapDst['host'] . ":993/imap/ssl/novalidate-cert}INBOX", $head . $body);
}
imap_close($src);
imap_close($dst);

file_put_contents($backNumber, time());

fclose($lock);
unlink($lockfile);
exit();

?>