PHP

【PHP】リモートファイル(SSHなど)をfreadする時は注意!正しい実装方法

投稿日:2018年11月15日 更新日:

PHPでリモートファイルをfreadする時は注意が必要です。

はい、お察しの通り僕はこれで不具合出しちゃいました。笑

同じように不幸なプログラマーが増えないように、
また既に同じ不具合を出してしまったプログラマーの為に実装の注意点と正しい実装方法を解説します。

スポンサーリンク

リモートファイルをfreadすると途中でファイル読み込みが切れる

リモートファイルをfreadすると、途中でファイル読み込みが切れちゃうんです。

恐ろしいのは、そこそこのファイルサイズじゃないと切れないので大きいサイズのファイルでテストしていないと気づかないんですよね。
僕は、うっかりしてまして本番で不具合が発覚しちゃいました。笑

なぜファイルの読み込みが途中で切れちゃうかというと…

警告
通常のローカルファイル以外のもの、例えば リモートファイル や popen()、fsockopen() が返す ストリームを読み込んでいる場合には、 パケットが有効になった後に読み込みはストップします。 つまり以下の例のように分割されたデータを結合すべきであるということです。

PHPリファレンスにちゃんと書いてありました。

これは言い訳できませんね。今回の不具合は僕が悪いです。
でもみなさん毎回リファレンスなんて読んでますか?
僕は読んでません!
これからも読みたくありません!
これがプログラミングの難しいところですね。

ちなみに、リファレンスではhttpでファイルを開いたケースが紹介されいますが、
僕はssh2で読み込んだファイルで発生しました。
リファレンスで言われている通り、リモートファイルの読み込み全般で発生すると思われます。

freadではなくstream_get_contentsを使おう

正しい実装方法もリファレンスに書いてあります。

一応引用しておきますね。

PHP5以降

PHP5未満

参考:PHPリファレンス

PHP5以降であれば、freadstream_get_contentsに変えればOKです。

修正は至って簡単ですね!

まとめ

僕が出してしまった不具合を記事にしてみました。

不具合出しちゃうと凹みますよね。

今回もやっちゃったな〜と思って、どうしたら防げたかなと考えるとやっぱりテストなんですよね。

でもテストにかける時間は限られている場合がほとんどで、どこまでテストしてどこで妥協するかは難しいところですよね。

今回の教訓は、大容量のテストはやるべし!でした。

スポンサーリンク


-PHP

執筆者:

関連記事

EclipseからPhpStormへ乗り換える時に行った事

こんにちは! こへいんです! 僕はもともとJavaエンジニアだったので、PHPの開発ももっぱらEclipseです。 もう10年近くEclipseを使っています。 使い慣れたIDEで不満もなく使っていま …

【PHP】Shift-JISにエンコードしたCSVが文字化けするのはBOMが原因?

PHPでShift-JISに変換エンコードしたCSVをダウンロードする機能を実装したのですが、日本語の文字化けが発生。 この問題がちょっとややこしくて解決するのに時間がかかりました。 なんと文字化け …

【PhpStorm】phpMyAdminのデバッグを無効にする方法

PhpStormでデバッグしていると、なぜかphpMyAdminで一時停止してしまう問題。ブレークポイントなんて貼ってないんですけどね! phpMyAdminを使う時は毎回デバッグをOFFにしていたの …

Windows/XAMPP/Eclipseでローカルに複数サイトの開発環境構築

Windows/XAMPP/Eclipseでバーチャルホストを使って複数の開発環境を構築する方法についてのメモです。 (Macの環境構築方法はMac/XAMPP/Eclipseでローカルに複数サイトの …

PhpStorm&MAMP環境のデバッグ(Xdebug)の設定方法

Phpstorm&MAMPP環境でデバッガー(Xdebug)を使えるようにする手順の説明です。 面倒ですけど、デバッガーを設定すると開発がめちゃくちゃ捗りますよ! デバッグ用にダンプ出力したりしている …

フォスターフリーランス
プロフィール

このサイトを運営しているこへいんです。
アングラーのフリープログラマー。 主にプログラミングと釣の話を発信しています。
プログラミングで自由になり思う存分に釣りをしまくる生活実践中。
詳しいプロフィールはこちら