file_put_contentsを使用して、相対的に配置されたフォルダーにファイルを作成して入力します。
インクルード パスとファイルの作成に関連するいくつかの奇妙な癖に気づきました。
短いバージョン: イテレーション 2 とイテレーション 3 を見てください。前者が失敗するのに後者が機能するのはなぜですか?
反復 1
file_put_contents('../../public/remixes/screenshots/test.txt', $data);
これはうまくいきます。
反復 2
しかし、このモジュールの「ルート」に public ディレクトリがあり、事前に設定されたインクルード パスを使用して直接参照したいと考えています。例えば:
echo(get_include_path()); // this outputs "../../"
file_put_contents('public/remixes/screenshots/test.txt', $data, FILE_USE_INCLUDE_PATH);
エラー: 「ストリームを開けませんでした: そのようなファイルまたはディレクトリはありません」
反復 3
わかりました。PHP のインクルード パスは不安定なので、変なことをして何が起こるか見てみましょう。最初にfopenを使用して実際にファイルを作成してみます。
fopen('../../public/remixes/screenshots/test.txt', 'w');
file_put_contents('public/remixes/screenshots/test.txt', $data, FILE_USE_INCLUDE_PATH);
それは再び機能します... ワット?
反復 4
面白い; 最初に fopen を実行しても問題ありませんが、インクルード パスも使用する必要があります。
fopen('public/remixes/screenshots/test.txt', 'w', 1);
file_put_contents('public/remixes/screenshots/test.txt', $data, FILE_USE_INCLUDE_PATH);
これにより、2 つの「ストリームを開くことができませんでした」というエラーが発生します。だんだん悪くなってる。
反復 5
インクルードパスの「魔法」を省き、それを使用して直接パスを構築します
file_put_contents(get_include_path().'public/remixes/screenshots/test.txt', $data);
これは機能し、私が得ることができる最高のものです。
結論
イテレーション 3 が成功するのに、イテレーション 2 が失敗する理由が不思議に思います。
反復 4 は、fopen に問題があることを意味します (file_put_contents は明らかに fopen / fwrite / fclose の単なるラッパーであるため)。
考え?