PHP API が MySQL から CSV エクスポートを作成し、後でダウンロードするためのファイルを提供するレガシー プロジェクトを処理する必要があります。
問題は、API が CSV ファイルをディレクトリにコピーできず、そこから Apache 経由でダウンロードできないことです。
プロセスは次のようになります。
- 誰かがウェブサイト上のボタンをクリックして CSV エクスポートを作成します。
- API は SQL ステートメントを作成し、shell_exec(mysql ...); でそれを実行します。
- データベースはデータを含むCSVファイルを作成し、それを/tmp/に保存します。
- APIはファイルをApacheの専用ダウンロードディレクトリにコピーします。
- API は、ボタンをクリックしたユーザーにダウンロード リンクを含むメールを送信します。
上記の手順 4 を除いてすべて機能します。
API で見つけたものは次のとおりです。
$exportCommand = "mysql ....";
// mysqlExportTmpDir = /tmp
// mysqlExportTargetDirectory = download directory for apache
$moveExportFileCommand = "cp ".$this->mysqlExportTmpDir."/$filename ".$this->mysqlExportTargetDirectory;
shell_exec("( $exportCommand; $moveExportFileCommand; $sendNotificationCommand) &");
前述したように、MySQL コマンドは機能し、メール通知も機能しますが、 cp コマンドは機能しません。
ログを見ると、次のエラーが表示されます:
cp: '/tmp/610278f414d84.csv' を stat できません: そのようなファイルまたはディレクトリはありません
また、shell_exec("ls /tmp/*.csv");
古いエクスポート ファイルが API に表示されるかどうかも確認しようとしましたが、次のような結果になりました。
ls: '/tmp/*.csv' にアクセスできません: そのようなファイルまたはディレクトリはありません
そこには間違いなく CSV ファイルがあります。そのため、権限の問題かもしれないと思い、ターミナルでこれを実行してみました: sudo -u www-data cp /tmp/610274ad5a8a5.csv /path/to/api/download
。ログから cp コマンドをコピーしたので、まったく同じになるはずです。
それはうまくいきました。www-data は Apache を実行し、shell_exec("whoami") を使用すると PHP API からも www-data を取得するので、今私は混乱しています。コマンドがsudo -u www-data cp ...
期待どおりに動作しないのかもしれません (そのユーザーと同じ権限を持っていると期待していました)。しかし、わかりません。
PHP が /tmp 内の csv ファイルにアクセスできず、別のディレクトリにコピーできない理由を誰か知っていますか?
ターゲット ディレクトリは www-data グループに属しており、そこにあるファイルはブラウザーからダウンロードできます。
データベースからデータをエクスポートするアプローチは奇妙だとわかっていますが、1年前まではうまくいっていたようです。現在、このプロジェクトに携わった人は会社に誰もおらず、何が変わったのかわかりません。
答え1
Apacheのプライベートtmpディレクトリが にあります/tmp/*apache2.service*/tmp
。これは のプライベートtmp設定により存在します/lib/systemd/system/apache2.service
。私は少し記事はこちら。
copy(/tmp/....)
PHP スクリプトを呼び出すたびに、 Apache 固有のプライベート tmp ディレクトリが検索されます。/tmp
このオプションを有効にすると、Apache はその内容を見ることができません。
したがって、このオプションを無効にするか、MySQL に CSV ファイルを別の場所にダンプさせるしかありません。