2021年11月30日
とあるライブラリーがPHP7.1~7.4でうまく動かない現象に出くわしたので調べてみました。
どういう状況かというと、SJIS-win(CP932)にエンコードした文字列をmb_split関数に渡して配列に変換する際に
PHP5.3 → うまく配列に変換できる。
PHP7.3 → falseが返ってきてうまく行かない。
PHP8.0 → うまく配列に変換できる。
という事が起こりました。
mb_split関数はマニュアルによると
https://www.php.net/manual/ja/function.mb-split.php
注意:
どういう状況かというと、SJIS-win(CP932)にエンコードした文字列をmb_split関数に渡して配列に変換する際に
PHP5.3 → うまく配列に変換できる。
PHP7.3 → falseが返ってきてうまく行かない。
PHP8.0 → うまく配列に変換できる。
という事が起こりました。
mb_split関数はマニュアルによると
https://www.php.net/manual/ja/function.mb-split.php
注意:
書いた人:木本
2021年06月02日
PHPを動かしているサーバーから別にサーバーにSSHで接続してなんやかんやの操作を行いたいことがあったのでいろいろと調べた。
PHPには公式でSSH2というPECL拡張モジュール(https://www.php.net/manual/ja/book.ssh2.php)があるが、インストールが少々面倒。
なので他にいい方法が無いか探してみるとphpseclibというライブラリーが公開されていたので、これを使うことにした。
■phpseclib
https://github.com/phpseclib/phpseclib
■サンプルコード
http://phpseclib.sourceforge.net/new/ssh/examples.html
今回はお試しとして
・SSH2でログインする。
PHPには公式でSSH2というPECL拡張モジュール(https://www.php.net/manual/ja/book.ssh2.php)があるが、インストールが少々面倒。
なので他にいい方法が無いか探してみるとphpseclibというライブラリーが公開されていたので、これを使うことにした。
■phpseclib
https://github.com/phpseclib/phpseclib
■サンプルコード
http://phpseclib.sourceforge.net/new/ssh/examples.html
今回はお試しとして
・SSH2でログインする。
書いた人:木本
2020年09月01日
前回の続き
1番目の記事で書いたケース2(PHP7.3)のimagecreatefromjpeg関数で破損した画像を開いた際にfalseを返してくるはずが、
なぜかリソースIDを返してくる件を確認するためにテスト用のプログラムを用意した。
まずは壊れた画像ファイルの用意から。
今回はお手軽に画像ファイルの先頭30,000バイトを抜き出して壊れた画像ファイルを作成することにした。
PHPコード
1番目の記事で書いたケース2(PHP7.3)のimagecreatefromjpeg関数で破損した画像を開いた際にfalseを返してくるはずが、
なぜかリソースIDを返してくる件を確認するためにテスト用のプログラムを用意した。
まずは壊れた画像ファイルの用意から。
今回はお手軽に画像ファイルの先頭30,000バイトを抜き出して壊れた画像ファイルを作成することにした。
PHPコード
書いた人:木本
2020年08月31日
前回の続き
残りは各OSの標準バージョン環境の作成。
それぞれOSが異なるのでOSごとにマシンを用意していく。
特に何の設定もなくyumで入れれるのでどんどん入れていく。
CentOS6標準環境の作成
PHP5.3
yum -y install php php-gd
php -v
残りは各OSの標準バージョン環境の作成。
それぞれOSが異なるのでOSごとにマシンを用意していく。
特に何の設定もなくyumで入れれるのでどんどん入れていく。
CentOS6標準環境の作成
PHP5.3
yum -y install php php-gd
php -v
書いた人:木本
2020年08月28日
前回の続き
CentOS8 AppStreamリポジトリ環境の作成
AppStreamリポジトリも場合は複数バージョンの共存ができないので、都度インストール&アンインストールを行う。
また、AppStreamリポジトリはCentOS8用のものなので、CentOS8を用意して確認した。
dnf module list php
Last metadata expiration check: 0:01:20 ago on Wed 26 Aug 2020 10:19:36 AM UTC.
CentOS-8 - AppStream
Name Stream Profiles Summary
php 7.2 [d][e] common [d], devel, minimal PHP scripting language
CentOS8 AppStreamリポジトリ環境の作成
AppStreamリポジトリも場合は複数バージョンの共存ができないので、都度インストール&アンインストールを行う。
また、AppStreamリポジトリはCentOS8用のものなので、CentOS8を用意して確認した。
dnf module list php
Last metadata expiration check: 0:01:20 ago on Wed 26 Aug 2020 10:19:36 AM UTC.
CentOS-8 - AppStream
Name Stream Profiles Summary
php 7.2 [d][e] common [d], devel, minimal PHP scripting language
書いた人:木本
2020年08月27日
前回の続き
Amazon Linux 2 amazon-linux-extrasリポジトリ環境の作成
amazon-linux-extrasリポジトリも場合は複数バージョンの共存ができないので、都度インストール&アンインストールを行う。
PHP.7.2
amazon-linux-extras enable php7.2
yum clean metadata
yum -y install php php-gd
php -v
PHP 7.2.31 (cli) (built: Jul 2 2020 23:17:00) ( NTS )
Amazon Linux 2 amazon-linux-extrasリポジトリ環境の作成
amazon-linux-extrasリポジトリも場合は複数バージョンの共存ができないので、都度インストール&アンインストールを行う。
PHP.7.2
amazon-linux-extras enable php7.2
yum clean metadata
yum -y install php php-gd
php -v
PHP 7.2.31 (cli) (built: Jul 2 2020 23:17:00) ( NTS )
書いた人:木本
2020年08月24日
前回の続き
iusリポジトリ環境の作成
iusリポジトリの場合は複数バージョンが共存できないので、都度インストール&アンインストールを行う。
公式( https://ius.io/setup )の手順に従う。
yum install \
https://repo.ius.io/ius-release-el7.rpm \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
iusリポジトリ環境の作成
iusリポジトリの場合は複数バージョンが共存できないので、都度インストール&アンインストールを行う。
公式( https://ius.io/setup )の手順に従う。
yum install \
https://repo.ius.io/ius-release-el7.rpm \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
書いた人:木本
2020年08月21日
前回の続き
remiリポジトリ環境の作成
remiリポジトリから入れる場合は複数バージョン共存可能なので、どんどん入れていく。
amazon-linux-extras enable epel
yum clean metadata
yum install -y epel-release
rpm -Uvh https://rpms.remirepo.net/enterprise/remi-release-7.rpm
PHP5.4
yum install --enablerepo remi -y php54 php54-gd
remiリポジトリ環境の作成
remiリポジトリから入れる場合は複数バージョン共存可能なので、どんどん入れていく。
amazon-linux-extras enable epel
yum clean metadata
yum install -y epel-release
rpm -Uvh https://rpms.remirepo.net/enterprise/remi-release-7.rpm
PHP5.4
yum install --enablerepo remi -y php54 php54-gd
書いた人:木本
2020年08月20日
PHPをインストールする際に
・OS標準のリポジトリから入れる場合
・ソースをコンパイルして入れる場合
・remi等の外部リポジトリから入れる場合
という方法が考えられるが、入れ方によってPHP GDがbundled版になるかどうかが変わってしまう。
挙動に影響が無ければ別にいいのだが、どうもそうはいかないみたいなので確認した結果を記録しておく。
そもそもなぜこんなことを調べたのかというと、開発環境と本番環境でPHPのバージョンが同じなのに本番環境でだけ想定通りに動かないということが起こったから。
具体的に書くと
ケース1(PHP5.6)
・OS標準のリポジトリから入れる場合
・ソースをコンパイルして入れる場合
・remi等の外部リポジトリから入れる場合
という方法が考えられるが、入れ方によってPHP GDがbundled版になるかどうかが変わってしまう。
挙動に影響が無ければ別にいいのだが、どうもそうはいかないみたいなので確認した結果を記録しておく。
そもそもなぜこんなことを調べたのかというと、開発環境と本番環境でPHPのバージョンが同じなのに本番環境でだけ想定通りに動かないということが起こったから。
具体的に書くと
ケース1(PHP5.6)
書いた人:木本
2017年06月02日
PHPに限らない話だが、デバッグ中やテスト中などにエラーメッセージが出た場合は漏らさずチェックしたいものである。
しかし、php.iniで「display_errors = On」と設定し、注意深く画面を見ていたとしても気づかないことは多々ある。
・ヘッダーの裏に文字が出ていたので見えなかった。
エラーメッセージの分だけ全体的にコンテンツ部分が下にずれていたりするが、急いで操作していると気づかない。
・jQueryDialogなどのダイアログを閉じる瞬間に警告メッセージが表示され、見逃してしまう。
submit結果のHTMLをdialog内に流し込んでいたりすると、ダイアログを閉じるJavascriptと共に警告メッセージがダイアログ内に流し込まれ、
次の瞬間にはダイアログが閉じてしまう。
しかし、php.iniで「display_errors = On」と設定し、注意深く画面を見ていたとしても気づかないことは多々ある。
・ヘッダーの裏に文字が出ていたので見えなかった。
エラーメッセージの分だけ全体的にコンテンツ部分が下にずれていたりするが、急いで操作していると気づかない。
・jQueryDialogなどのダイアログを閉じる瞬間に警告メッセージが表示され、見逃してしまう。
submit結果のHTMLをdialog内に流し込んでいたりすると、ダイアログを閉じるJavascriptと共に警告メッセージがダイアログ内に流し込まれ、
次の瞬間にはダイアログが閉じてしまう。
書いた人:木本