質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

6441閲覧

apache配下で実行されるPHP内でファイル書き込み処理をしているが、ファイルが書かれない

shanxia

総合スコア1038

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/08/28 09:58

編集2017/08/28 10:27

外部からWebAPIを実行された際に、サーバー内のファイルに書き込み処理をしたいと考えています。
そこでPHPのfile_put_contentsで簡単に書き込み処理を追加したのですが、ファイルが作成されませんでした。いったんtouchコマンドでファイルを作成してみても、中身が追加されず、行き詰まってしまいました。

php

1 $fileName = '/tmp/test_log'; 2 $ir = is_writable($fileName); 3 $ret = file_put_contents($fileName, 'Called'.PHP_EOL, FILE_APPEND); 4 header('HTTP/1.0 200 OK'); 5 echo "ret=$ret, ir=$ir".PHP_EOL;

上記のテストPGMを作成し、curlコマンドで実行した結果は「ret=7, ir=1」となりました。
しかし /tmp ディレクトリにファイルは作成されませんでした。
また、touchコマンドで、0666 の権限で test_log ファイルを作成してから実行しても駄目でした。

apacheのerror_logを見ても、特にエラーが出力されていなかったので、この他に何を調べれば良いでしょうか。
よろしくお願いします。

【環境】
Red Hat Enterprise Linux Server release 7.3 (Maipo)
Apache/2.4.6
PHP 7.1.4 (cli) (built: Apr 11 2017 19:36:58) ( NTS )

追記:
seLinuxは無効にしています。

追記2:
apacheの書き込み先をドキュメントルート配下に変更すると成功しました。
何故なんでしょう?
ls -lコマンドの結果では権限エラーはなさそうなんですが。

-rw-rw-rw- 1 ec2-user ec2-user 0 Aug 28 19:22 test_log

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

RHEL7から、/tmpをプロセス毎(?)に分離するprivate tmpなる機能が搭載されているそうです。

/tmp/systemd-private-XXXXXX

というディレクトリがないでしょうか。

(質問の内容ではミスや勘違いをされているようには読めませんでした。)

投稿2017/08/28 10:52

suzukis

総合スコア1449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shanxia

2017/08/28 12:00

ありました。非常に長いディレクトリ名の下にまたtmpディレクトリがあり、その中にファイルがありました。 こんな機能が搭載されたとは知りませんでした。ありがとうございます。
退会済みユーザー

退会済みユーザー

2017/08/28 13:05

Service専用の /tmp を用意する機能があるんですね。知りませんでした。 知らなかったらハマるなぁ。。。
suzukis

2017/08/28 13:18 編集

私もこの機能は知りませんでしたが、「RHEL7 Apache tmp 書けない」で検索したら一発でした。こういう新機能の罠は自分の知識の中だけで考えるとあさっての方向ばかり調べることになり解決にたどり着くのは難しいですが、罠はたいてい先人が踏み抜いてくれているものですので、症状で検索してみる癖を付けるとよいですよ。「なにか新機能が影響してるだろう」という臭いは経験積むとわかるようになってきます。
guest

0

なんかケアレスミスしてそうですね。

結果は「ret=7, ir=1」

とあるので、書き込みは成功しています。
less /tmp/test_logとして確認してみてください。

ちなみに、ir=$iriw=$iwの転記間違いと読みました。
そうでないと1にならないので。。。

追記
切り分け用のスクリプトです。

php

1<?php 2$fileName = '/tmp/test_log'; 3$ret = file_put_contents($fileName, 'Called'.PHP_EOL, FILE_APPEND); 4$tmp = file_get_contents($fileName); 5echo $tmp;

追記2
ファイルを探すスクリプトを追加してみました。

php

1<?php 2$fileName = '/tmp/test_log'; 3$ret = file_put_contents($fileName, 'Called'.PHP_EOL, FILE_APPEND); 4$tmp = shell_exec('find / -mmin -1 2>/dev/null | grep test_log'); 5echo $tmp;

投稿2017/08/28 10:19

編集2017/08/28 12:55
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shanxia

2017/08/28 10:23

すいません。そこは転記ミスです。直しました。 less /tmp/test_log を実行すると、 test_log (END) のみ表示されました。
退会済みユーザー

退会済みユーザー

2017/08/28 10:34

切り分け用のスクリプトを追記してみました。
shanxia

2017/08/28 10:39

いただいたスクリプトを実行すると、以下の様な結果が返りました。 Called Called Called これはどこか他に書いている?
退会済みユーザー

退会済みユーザー

2017/08/28 12:56

解決したみたいですね。お疲れ様です。 変更したファイルを探すスクリプトを作成したので、追記しておきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問