ホームページ  >  記事  >  バックエンド開発  >  Php 7.4 のアップグレードによって引き起こされる 2 つの大きな落とし穴

Php 7.4 のアップグレードによって引き起こされる 2 つの大きな落とし穴

藏色散人
藏色散人転載
2020-02-08 13:07:145471ブラウズ

私のマシンは Archlinux のローリングアップデートを使用しているため、知らないうちに Php が 7.4 にバージョンアップされていましたが、このアップデートによって大きなトラブルが発生するとは予想していませんでした。まず、Php-fpm の新しいオプション ProtectHome により、古典的なファイルが見つからないエラーが発生し、次に Php インタープリタは、null 型の添え字アクセスに対して、null 型の値の配列オフセットにアクセスしようとしているというエラーを直接報告します。

最近、私は友人の Web サイト構築を手伝っていたので、テストのためにオンライン コードをローカルのミラーに戻しました。 Web アプリケーションには奇妙な依存関係があるため、ローカル環境を汚さないように、テストのために Docker にデプロイしました。 Docker の基本イメージは、先月末にリリースされた Php7.4 と組み合わせた急進的な Archlinux を選択します。そのため、私はデバッグピットで丸一日を過ごしました...

まず第一に、シャトルで環境をセットアップした後、それを実行し、Php で最も古典的で最も悲惨なエラーの 1 つを報告しました。 fpm: ファイルが見つかりません。 Php-fpm を設定したことのある人なら誰でも、このエラーは通常、ファイルのアクセス許可が間違っているか、ファイル パスが間違っていることが原因で発生し、これらのエラーはどちらも見つけるのが比較的難しいことを知っています。そこで改めて大きな目と小さな目で経路検査を体験しましたが、問題ありませんでした。ファイルのパーミッションチェック、うーん、問題ないでしょうか?戻って道を確認したら、まだ大丈夫でした! chmod 777 で問題が解決しないことにとてもイライラし、自分の人生に少し疑問を感じました...

Php-fpm のファイルが見つからないエラーをネットで検索したところ、結果はたくさんありましたが、理由はこの2つだけでした。そして、これら 2 つの理由が 1 つずつ解消され、事態は突然魔法のような角度から発展しました...

これが PHP のバージョンに関連しているのではないかと考えるまでにどれくらい時間がかかったのか分かりません (なぜなら、私のローカル コンピューターでは他の Php アプリケーションも実行していたので、最初は Php に問題があるとは思いませんでした)。そこで、新しいバージョンの Php7.4 と Php-fpm7.4 の変更点を検索したところ、原因はすぐに見つかりました。

Php7.4 Commit

(https:/ /github.com/php/php-src/commit/40c4d7f1820df1872a71ab07fd26da45a203e37f#diff-c0605c0e7e1db864472acf66a9812d33R22)

このコミットには、ProtectHome オプションが追加されました。名前が示すように、オンにすると、PHP はホーム ディレクトリ内のファイルを実行しなくなり、この新しいオプションのデフォルト値がたまたまオンになっています。 systemctl edit php-fpm.service を使用してオプション オーバーライドを追加します。サービスを再起動すると、最終的にすべてが正常になり、2 番目の大きなエラーが発生します:

Inlcude、require などは、インクルードするために Php でよく使用されます。他のファイル。デバッグの結果、特定のインクルードの後、PHP は実行を直接停止し、null 型の値の配列オフセットにアクセスしようとしているというエラーを報告したことがわかりました。しかし、オンラインコードは問題なく動作するのですが、これが非常に不思議で、インクルードファイルをたどってみると、配列要素にアクセスしている箇所があるのに、配列自体はnullになっていることが分かりました。この構文は通常、Php のような弱い型指定言語でサポートされており、全体として null を返しますが、新しいバージョンの Php7.4 では、この構文はエラーとして報告されます。 Phpも言語の特徴を少しずつ標準化しているようですが、仕方がありません、自分でコードを変えるしかありません。 (私は現在、古いバージョンの Php を使用することを選択していますが)

Php7.4 がリリースされてからそれほど時間が経っていないため、広く更新および使用されていないと推定され、さまざまなアプリケーションの開発者が利用していない可能性があります。 Php7.4 と互換性のある変更をテストしました。インターネットでこの情報を検索しても、貴重な提案を見つけることができなかったのはまさにこの理由です。この記事は、この新機能にだまされた午後全体を記録することに加えて、他の人に解決策のアイデアも提供します。同様の問題。バー。

以上がPhp 7.4 のアップグレードによって引き起こされる 2 つの大きな落とし穴の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsbw.soで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。