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

執筆者:

関連記事

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

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

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

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

【EC-CUBE2】 SQLをデバック出力する方法

EC-CUBE2で実行されるSQLをデバッグ出力する方法について。 コードをコピペする事で、実行されたSQLを画面にデバッグ出力できます。 スポンサーリンク 目次EC-CUBE2でSQLをデバックする …

PhpStormに乗り換えて良かった!オススメの5つの機能

EclipseからPhpStormに乗り換えて2年目に突入し、迷わずPhpStormのライセンスを更新しました。 PhpStormにはかな〜り満足しています。 開発効率はだいぶ上がったんじゃないでしょ …

【EC-CUBE】CSV出力設定「出力設定リストが入力されていません」エラーで登録できない件の修正方法

EC-CUBE2で作ったサイトのお客様から、CSV出力設定の登録が出来ないとの連絡が。 CSV出力する項目を設定しているにもかかわらず、「※ 出力設定リストが入力されていません。」とエラーになり登録出 …

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

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