Linuxサーバー構築・設定,PHP

PHPでmb_strposを使い、XMLフィードから特定の文字列を抽出するコードを書きました。

こちらは、早朝にCronで自動で実行するものです。

手動(コマンド)で実行は問題なし

手動(コマンド)で実行すると期待通りの結果が出てきます。問題なさそうです。

Cronで実行すると失敗が多い

手動(コマンド)で実行すると期待通りの結果になるのに、Cronでは何故かmb_strposで抽出できていない文字列が多数出てきました。

文字コードを明示的に指定する必要がある

サーバーの内部はUTF-8ですし、PHPのソースコードもXMLフィードもUTF-8なので明示的に指定する必要など無いと思っていましたが、Cronなどで実行する場合は指定する必要があるようです。

PHPソースコードで指定

まず、PHPソースコードの上の方に以下を記載しました。

mb_internal_encoding("UTF-8");

このPHPはブラウザからアクセスして実行するのではなく、Cronで実行したいので.htaccessではなくPHPソース内に上記を記載しました。

しかし、Cronで実行すると抽出漏れが発生しています。

次に、mb_strposでも文字コードを指定しました。

mb_strpos(抽出したい文字列, "対象となる文字列", 0, "UTF-8")

これでも駄目です。Cron実行すると同様に抽出漏れが置きます。

正解はCronで文字コードを指定

結果、Cronを記述する時に以下のようにすることで解決しました。

01 9 * * * export LANG="UTF-8"; /usr/bin/php /home/*********.php

なぜCronでは上記のように文字コード指定しないと行けないのかは不明ですが、上記のようにCronで文字コードを指定することで無事解決しました。

Linuxサーバー構築・設定,PHP

550-5.1.1 The email account that you tried to reach does not exist. Please try 550-5.1.1

メールアドレスは正しいのにGmailから「550-5.1.1 The email account that you tried to reach does not exist. Please try 550-5.1.1」というエラーメールが返ってくることがあります。

他のメールアカウントから送信すると正常に送信されます。

SPFやDKIMの設定はされているのになぜ?となりましたが、以下が原因でした。

メール本文に問題あり

メール本文内に区切りのために「——–」「=======」などを多用すると上記のようにエラーが返ってくることが分かりました。

上記をなくすと無事エラーメールにはならなくなりました。

恐らくスパムメールのような扱いになってしまうんですね。

MYSQL,PHP

MYSQLの文字コードはUTF8だと3バイトまでしか対応していないため上記の様なエラーが出ます。

そこで、DB・テーブルともにutf8mb4に変更し4バイト対応したのですが同様のエラーが出続ける。

原因はPHP側

$cnn->set_charset('utf8mb4');

とすることで解決しました。

PHP

# yum install --enablerepo=remi,remi-php71,epel php71-php-bcmath

上記だけだと、phpinfoに出てこないことがあります。Apacheを再起動してもbcmathが出てきません。

/etc/php.d/や/etc/php.d/に必要なファイルがコピーされていないことが原因なので以下を実行し手動でコピーします。

# cp /etc/opt/remi/php70/php.d/20-bcmath.ini /etc/php.d/
# cp /opt/remi/php70/root/usr/lib64/php/modules/bcmath.so /usr/lib64/php/modules/
# systemctl restart httpd
# php -m
[PHP Modules]
bcmath

PHP

CentOS7にComposerをインストールする手順です。PHPはすでにインストールされている前提です。

# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

上記を実行すると、composer-setup.phpというファイルがダウンロードされます。composer-setup.phpを実行します。

# php composer-setup.php

上記を実行するとcomposer.pharが出来上がります。必要のなくなったcomposer-setup.phpは削除します。

# php -r "unlink('composer-setup.php');"

色々な場所・ユーザーで使いたいので、composer.pharを/usr/local/bin/に移動します。

# mv composer.phar /usr/local/bin/composer

PHP,ニュース

最近はPHPはアクティブサポートは2年、セキュリティサポートは3年という周期が続いています。PHP7.4はとっくに2022/11/28でSecurityサポートが終了しました。

バージョン初回リリースアクティブサポートセキュリティサポート
8.12021/11/252023/11/252024/11/25
8.02020/11/262022/11/262023/11/26
7.42019/11/282021/11/282022/11/28

PHPのバージョンアップが早すぎて、各ディストリビュージョンはついていけてない感じ?サーバー管理者はPHPを使う場合は、各自でバージョンを確認しインストールする必要がありそうです。