ニューロッドを購入
Class 'ZipArchive' not found in ... そうcatalinaにアップグレードしてから
Class 'ZipArchive' not found in ...
PhpSpreadsheetを使ってExcelのデータをAPI経由で各システムに登録するツールをMacのローカルで動かしていたんだけど、Catalinaにアップグレードしてからこのエラーで全く動かず。
まずPhpSpreadsheetは動作環境としてZipArchive classが必要だが、アップグレード後はインストールされていない。
色々ググったけど、いまいち見つからなかった。
で、対応方法は簡単だった。
足りないツールとPHPを最新にすること。
コンソールを立ち上げて、
足りないツールを以下のコマンドでインストールする。
xcode-select --install
次に、最新のPHPをインストールするとZipArchiveも一緒に自動インストールされる。
更新前のPHPは7.3.8でこの記事を書いてるときは7.3.10が最新。(2019/10/18時点)
brew update
brew install php@7.3
brew link php@7.3
最後に、コンソールを一度閉じて再度起動して完了。
一応、
php -vでバージョンが上がっていることを確認する。
php -v
PHP 7.3.10 (cli) (built: Sep 30 2019 19:59:57) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.10, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.10, Copyright (c) 1999-2018, by Zend Technologies
あーよかった。
しかし最新のMac OSであるCatalinaは不具合が多い。
Sidecarはいいんだけど、メモや写真がiPhoneともうまく同期されなくなったり、Mac mini だとHDMIからディスプレイが表示されなくなったりと。
PHPで文字列をユニコードエンコードする。
探してたらこんなのを見つけた。
スマレジでAPIを投げてレスポンスのエラーはユニコードなので見にくい。
毎回、コピーして変換サイトで見てたけど、ログもtailできるようになったので、
変換して読める形にログ出力するようにした。
// 文字列のユニコードデコードを行う
function
unicode_decode(
$str
) {
return
preg_replace_callback(
"/((?:[^\x09\x0A\x0D\x20-\x7E]{3})+)/"
,
"decode_callback"
,
$str
);
}
function
decode_callback(
$matches
) {
$char
= mb_convert_encoding(
$matches
[1],
"UTF-16"
,
"UTF-8"
);
$escaped
=
""
;
for
(
$i
= 0,
$l
=
strlen
(
$char
);
$i
<
$l
;
$i
+= 2) {
$escaped
.=
"\u"
. sprintf(
"%02x%02x"
, ord(
$char
[
$i
]), ord(
$char
[
$i
+1]));
}
return
$escaped
;
}
// 文字列のユニコードエンコードを行う
function
unicode_encode(
$str
) {
return
preg_replace_callback(
"/\\\\u([0-9a-zA-Z]{4})/"
,
"encode_callback"
,
$str
);
}
function
encode_callback(
$matches
) {
$char
= mb_convert_encoding(pack(
"H*"
,
$matches
[1]),
"UTF-8"
,
"UTF-16"
);
return
$char
;
}
XServerでPHPのエラーログをTailする
実はかなり簡単にできた。
ステップは大きく分けて以下の2店。
1.PHPのログ出力先を変更
2.sshでログインしTailする
ここでは1のみを説明する。sshログインについては色々と情報があるので、他を参考にしてください。
で、XServerではsshでログインしても標準で設定されているであろうログフォルダにはアクセスする権限がなくてたどり着けない。
またXserverはsshのアクセスユーザーをroot権限にできない仕様だ。
なので、php.iniを編集し新たな場所へログを書き出すことで実現できた。
管理画面から、php.ini設定を選択する。
php.ini直接設定で、以下を追加。
xxxxは各自の契約に合わせて変更する。
error_log = /home/xxxx/xxxxx.xsrv.jp/log/php.log
sshでXServerにログインして、以下のコマンドを実行。
tail -f php.log
いやー、PHPのデバッグがはかどること、はかどること。
これをする前は、毎回管理画面からエラーログをダウンロードして確認してたから、嫌になってたところ。
どんだけログの確認で時間を奪われたのだろうか。。。
PHPからスマレジにAPIで商品情報を登録・更新する
なんかスマレジのAPIは癖があって一筋縄で行かなかったのでここに記録しておく。
昨夜、相当に悶々としたのですよ。