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

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

【PHP】dateとstrtotimeで相対時刻を取得する

現在日からの相対時刻を取得して処理したいことってよくありますよね。 例えば、現在時刻の1日前以前のデータのステータスを変更するとか。 phpでは、内部関数のdate関数とstrtotime関数を組み合 …

RewriteEngine onで403エラーの解決方法

ローカル環境でRewriteEngine onにしたら、403エラーが発生。 その解決方法の解説です。 スポンサーリンク 目次環境についてFollowSymLinksを有効にする事で解決まとめ 環境に …

【現役フリーランスがレビュー】 ”いきなりはじめるPHP”は入門にオススメ

こんにちは! こへいんです。 今回はPHPの入門書”いきなりはじめるPHP”のレビューです! いきなりはじめるPHP posted with ヨメレバ 谷藤賢一 リックテレコム 2011年12月 楽天 …

【EC-CUBE2】CSVをUTF-8でダウンロードさせる修正方法

デフォルトのEC-CUBE2だと、ダウンロードされるCSVはShift-JISになっています。 おそらく、EXCELでCSVを編集する事を考慮しているのでしょう。 でも、Shift-JISだと困るシー …

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

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

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

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