Docker for Windows で開発したPHPシステムがレンタルサーバで動かないとき

Docker 環境でPHP開発すると

作業用の Windows マシン上で Docker 環境を構築し、その上でPHPシステムを開発するというケースも増えてきたと思います。私の場合は、よくローカルのディレクトリを Docker にマウントし、PHPの細かいマイナーバージョンまで合わせた環境を用意してその中で開発をします。ところが、それだけですと実際の本番環境とは異なる部分も多く、FTPで全く同じPHPファイルをアップロードしているのに動かないなんてこともしばしばあります。
私が出会った問題と解決方法を以下に列挙していきますのでご参考になれば幸いです。

問題と解決法

1. 作成したファイルアップローダーが正常に機能しない

PHPで作ったファイルアップローダで、画像をアップロード・サーバに保存完了したはずなのに、画面に表示されない場合があります。 FTPから確認するとファイル自体は出来ているのですが、パーミッションが 600 になっていることがありました。
アップロード完了した時点で、一度 chmod($file, 0604) を実行するようにPHPを改修するといいかと思います。

PHP: chmod - Manual

2. フォーム送信/Ajax送信時に謎の403エラーが返ってきたりこなかったり

WAFのせいかもしれません。
WAF(わふ:Web Application Firewall)というのは、最近多くのレンタルサーバで実装されはじめたセキュリティ機能の一種なのですが、フォームを送信する時などにサーバに送られるデータの中身にアヤシイものがあれば 403エラー にするというものです。 このWAF制限の基準はサーバ会社によってかなり違っており、"少しでも多めのデータが送られてきたら通さない"など、厳しいルールがあるところもあります。
なんでか知らないけど謎の403エラーが出て困ってる という場合、このケースを疑った方がいいかもです。

対策としては、サーバ屋さんのコンパネにログインしてWAFを無効にするか、サーバ屋さんによっては各ディレクトリに .htacess ファイル作成して細かい設定ができる場合もあるようですので、ご参考ください。
アヤシイデータが送られないようにするのが一番なのでしょうが、アクセシビリティとのトレードオフになるかと思いますので十分検討しましょう。

3. ファイルが見つからない、クラスが見つからない。

これはホストOS側のファイルシステムと本番サーバのファイルシステムとの違いにより、ファイル名の大文字小文字が区別されることが原因によることが多いです。 Windowsだとファイル名は大文字小文字の指定はどちらでもOKなのですが、ほとんどの本番サーバであるLinuxでは区別するのです。
composer などで生成されるオートローダなどでも影響があるようですので、PHPのコード中に書くファイル名(またはクラス名)は実在するファイル名と全く同じケース(大文字小文字)で打ったほうがよいです。

4. パスに依存している

開発環境と本番環境とでパスの違いによる差異がある場合です。
なるべく Docker にマウントする際に本番と同じパス構成にするといいです。Docker 起動時にシンボリックリンク貼るんでもかまいません。 理想はどのディレクトリレベルにシステムを配置しても機能するようにポータビリティな開発を心がけることだと思いますが、難しい場合もあるので、その際はそれぞれの環境にあったパスを自動調整するなどの対応が必要かもです。




今のところは以上です。
思いついたら都度追記するかもしれません。