1. ホーム
  2. laravel-4

[解決済み] Laravelのデイリーログが間違ったパーミッションで作成される

2022-05-18 11:35:17

質問

私は php artisan を使って実行するスクリプトを持っています ( ルート ユーザー) を使って実行するスクリプトがあるのですが、時々それが原因で毎日のログファイルが apache www-data ユーザーよりも先に作成されることがあります。つまり、実際のユーザーが私のウェブアプリケーションを使用するとき、私はフォルダパーミッションエラーを得ます。

ストリームを開くのに失敗しました。パーミッションが拒否されました。

パーミッションを元に戻すと www-データ に戻していますが、ログファイルを常に正しいパーミッションで作成することで解決したいのです。

ファイルを作成する cron ジョブを作成するか、毎日正しいパーミッションを持つことを確認するためにそれに触れることを検討しましたが、別のスクリプトに依存しないより良い解決策を探しています。

また、php artisan を別のスクリプトでラップして、それが常に www-データ で実行されるようにすることも考えましたが、私たちがやりたいことは、実際には ルート の手続きであり、apache が行うことを許可されていません。

他に何か提案はありますか?

どのように解決するのですか?

重要なこと この回答は、laravel 5.5+と互換性がありません。こちらの回答をご覧ください。 laravel5.6でカスタム(動的)ログファイル名

まずは定数になっているものから。

あなたが持っている php artisan コマンドで実行されます。 root .

このコマンドは毎日実行されていると考えてよいでしょう。

解決策その1。

ファイルを作成したユーザがデフォルトで書き込み権限を持っていることを考えると、このようにユーザごとにログを分けることができます。

App/start/global.php

/*
|--------------------------------------------------------------------------
| Application Error Logger
|--------------------------------------------------------------------------
|
| Here we will configure the error logger setup for the application which
| is built on top of the wonderful Monolog library. By default we will
| build a basic log file setup which creates a single file for logs.
|
*/

Log::useDailyFiles(storage_path().'/logs/laravel-'.posix_getpwuid(posix_geteuid())['name'].'.log');

もし、あなたの wwwデータ のユーザーがエラーログを作成したとしたら、その結果は次のようになります。 storage/logs/laravel-www-data-2015-4-27.log .

もし、あなたの ルート のユーザーがエラーログを作成した場合、その結果は次のようになります。 storage/logs/laravel-root-2015-4-27.log .

解決策その2。

phpスクリプトで、artisanコマンドで使用するログを変更します。

あなたの run() 関数の最初にこの行を追加してください。

Log::useFiles(storage_path().'/logs/laravel-'.__CLASS__.'-'.Carbon::now()->format('Y-m-d').'.log');

もし、クラスの名前が ArtisanRunner であれば、あなたのログファイルは

storage/logs/laravel-ArtisanRunner-2015-4-27.log .

結論 解決策その1は、ユーザーによってログを区別することから、より良いものであり、したがって、エラーは発生しません。

編集: jason が指摘したとおりです。 get_current_user() はスクリプトのオーナーネームを返します。従って、解決策その1を適用するためには chown を使用して、必要なユーザー名にアーティザンクラスファイルをコピーします。