Laravel 5 - Xóa bộ nhớ cache trong máy chủ lưu trữ chia sẻ


125

Câu hỏi khá rõ ràng.

php artisan cache:clear

Có cách giải quyết nào để xóa bộ đệm như trên mà chúng tôi sử dụng trong CLI. Tôi đang sử dụng một dịch vụ lưu trữ chia sẻ phổ biến, nhưng theo kế hoạch của tôi, tôi không có quyền truy cập bảng điều khiển.

** Tôi muốn xóa bộ đệm xem. **

Tôi thấy một câu hỏi gần giống như thế này, nhưng nó không giúp tôi.


2
Chạy Laravel trên chia sẻ lưu trữ là điên rồ, IMO, vì chính xác loại lý do này. Làm thế nào bạn đang chạy di chuyển?
ceejayoz

@ceejayoz .. Thật ra tôi mới bắt đầu dự án này, và dự án laravel đầu tiên của tôi cũng vậy. Tôi chưa đến với sự di cư này ..
Rinto George

11
"Chạy Laravel trên chia sẻ lưu trữ là điên rồ" @ceejayoz ... Nhưng đây là thế giới thực. Đôi khi bạn phải bởi vì không có sự lựa chọn.
elb98rm

2
@ elb98rm Một VPS từ Digital Ocean có giá khởi điểm $ 5 / tháng. Luôn có một sự lựa chọn, bao gồm cả việc không làm việc cho một khách hàng không muốn trả $ 5 / tháng cho việc lưu trữ.
ceejayoz

19
@ceejayoz Không liên quan - Thường thì tôi đã làm việc cho những nơi không phải là tiền, đó là mối quan hệ hoặc chủ nhà và chính trị nội bộ. Hơn nữa - đôi khi nó hoàn toàn không phụ thuộc vào toàn bộ bộ phận của bạn. Thế giới thực có nghĩa là đôi khi bạn cần phải làm việc với một tình huống. Bạn may mắn hoặc được che chở nếu bạn chưa bao giờ phải làm việc với lựa chọn của người khác ...
elb98rm

Câu trả lời:


146

Bạn có thể gọi một lệnh Artisan bên ngoài CLI.

Route::get('/clear-cache', function() {
    $exitCode = Artisan::call('cache:clear');
    // return what you want
});

Bạn có thể kiểm tra tài liệu chính thức tại đây http://laravel.com/docs/5.0/artisan#calling-commands-outside-of-cli


Cập nhật

Không có cách nào để xóa bộ đệm xem. Điều đó cũng php artisan cache:clearkhông.

Nếu bạn thực sự muốn xóa bộ đệm xem, tôi nghĩ bạn phải viết artisanlệnh của riêng mình và gọi nó như tôi đã nói trước đó, hoặc hoàn toàn bỏ qua artisanđường dẫn và xóa bộ đệm xem trong một số lớp mà bạn gọi từ bộ điều khiển hoặc tuyến.

Nhưng, câu hỏi thực sự của tôi là bạn có thực sự cần phải xóa bộ đệm xem không? Trong một dự án tôi đang làm việc hiện tại, tôi có gần 100 lượt xem được lưu trong bộ nhớ cache và chúng có trọng lượng ít hơn 1 Mb, trong khi vendorthư mục của tôi là> 40 Mb. Tôi không nghĩ rằng bộ đệm xem là một nút cổ chai thực sự trong việc sử dụng đĩa và không bao giờ có nhu cầu thực sự để xóa nó.

Đối với bộ đệm ứng dụng , nó được lưu trong storage/framework/cachethư mục, nhưng chỉ khi bạn định cấu hình filetrình điều khiển config/cache.php. Bạn có thể chọn nhiều trình điều khiển khác nhau, chẳng hạn như Redis hoặc Memcached , để cải thiện hiệu suất qua bộ đệm dựa trên tệp.


1
Có gì bộ nhớ cache được bạn cố gắng để xóa? Các cache:clearlệnh làm việc với bộ nhớ cache ứng dụng , một trong đó là truy cập từ Cachemặt tiền.
Marco Pallante 16/07/2015

Tôi muốn xóa bộ đệm xem, có rất nhiều trang được lưu trong thư mục xem bộ đệm. Một câu hỏi nữa, khi nói bộ đệm ứng dụng, đó là tất cả các thư mục mà nó nhắm mục tiêu.
Rinto George

Cảm ơn đã giải thích!. Tôi không lo lắng về dung lượng ổ đĩa :) Nhưng một câu hỏi nếu bộ đệm xem không xóa, thì những thay đổi mới trong chế độ xem có ảnh hưởng như thế nào trong trang web, đó có phải là bất kỳ kiểm tra I / O nào xảy ra trong laravel không?
Rinto George

1
Tôi nghĩ rằng nó thực hiện kiểm tra dấu thời gian trên các tệp, nhanh hơn so với việc xây dựng lại mẫu lưỡi cắt
Marco Pallante

Vâng, tôi đoán vậy, dù sao bạn đã giúp tôi suy nghĩ đúng cách, cảm ơn!
Rinto George

61

tôi hi vọng điêu nay se giup được ai đo

Đi đến laravelFolder/bootstrap/cachesau đó đổi tên config.phpthành bất cứ điều gì bạn muốn, ví dụ. config.php_oldvà tải lại trang web của bạn. Điều đó sẽ làm việc như voodoo.

Mã hóa hạnh phúc ...


Tôi xác nhận. Hoạt động trong laravel 5.4. Tôi cúi đầu.
simon

1
Giải pháp một và duy nhất! Nếu bạn tự hỏi tại sao làm việc? chỉ có chúa mới biết
Luis Tương phản

Xác nhận nó xóa sạch nỗi đau trong ** trong khi lưu trữ laravel 5.4 từ cửa sổ đến lưu trữ chia sẻ .... CẢM ƠN BẠN !!!
Đau Rikudo

Có vẻ như trong một vài kịch bản, đây là giải pháp duy nhất hoạt động. Nếu bạn có cấu hình được lưu trong bộ nhớ cache và sau đó bạn xóa Mặt tiền hoặc Nhà cung cấp dịch vụ, khi bạn chạy lệnh để tạo cấu hình được lưu trong bộ nhớ cache mới, nó sẽ chạy bằng cấu hình được lưu trong bộ nhớ cache hiện có và cố gắng tham chiếu các lớp Nhà cung cấp dịch vụ và / hoặc Nhà cung cấp dịch vụ. không còn tồn tại và thất bại. Tùy chọn khác sẽ là xóa các tham chiếu khỏi tệp cấu hình, tạo lại cấu hình được lưu trong bộ nhớ cache của bạn, sau đó xóa các lớp Mặt tiền và / hoặc Nhà cung cấp dịch vụ thực tế.
Jason Wheeler

1
Đối với Laravel 6.6, Để xóa bộ nhớ đệm, tôi chỉ xóa cachethư mục & trong .envgiá trị bộ đệm mặc định của tệp. Nhưng sau khi xóa tất cả vấn đề này một lần nữa .. khi nào php artisan optimize. Cuối cùng, điều này đã giải quyết vấn đề của tôi, không phải bằng cách đổi tên mà thay đổi giá trị khóa trong tệp config.php. Cảm ơn @DeadGuy
Chandan Sharma

49

Như tôi có thể thấy: http : //itsolution ware.com/post/laravel-5-clear-cache-from-route-view-config-and-all-cache-data-from-applicationexample.html

có thể sử dụng mã dưới đây với các lệnh xóa bộ nhớ cache mới:

//Clear Cache facade value:
Route::get('/clear-cache', function() {
    $exitCode = Artisan::call('cache:clear');
    return '<h1>Cache facade value cleared</h1>';
});

//Reoptimized class loader:
Route::get('/optimize', function() {
    $exitCode = Artisan::call('optimize');
    return '<h1>Reoptimized class loader</h1>';
});

//Route cache:
Route::get('/route-cache', function() {
    $exitCode = Artisan::call('route:cache');
    return '<h1>Routes cached</h1>';
});

//Clear Route cache:
Route::get('/route-clear', function() {
    $exitCode = Artisan::call('route:clear');
    return '<h1>Route cache cleared</h1>';
});

//Clear View cache:
Route::get('/view-clear', function() {
    $exitCode = Artisan::call('view:clear');
    return '<h1>View cache cleared</h1>';
});

//Clear Config cache:
Route::get('/config-cache', function() {
    $exitCode = Artisan::call('config:cache');
    return '<h1>Clear Config cleared</h1>';
});

Không cần thiết phải cung cấp khả năng xóa bộ nhớ cache cho mọi người, đặc biệt là trong môi trường sản xuất, vì vậy tôi đề nghị nhận xét rằng các tuyến đường và khi cần, để nhận xét mã và chạy tuyến.


1
Tôi thấy đoạn trích này hữu ích nhất.
Haseeb Zulfiqar

Tôi có vấn đề với cấu hình: bộ đệm không hoạt động trong tuyến hoặc bộ điều khiển nhưng các bộ khác đều hoạt động. vấn đề là gì
Nayeem

40

Cấu hình bộ đệm ẩn Cấu hình laravel trải đều trên hàng tá tệp và includingmỗi tệp cho mỗi yêu cầu là một quá trình tốn kém. Để kết hợp tất cả các tệp cấu hình của bạn thành một, sử dụng:

php artisan config:cache

Hãy nhớ rằng mọi thay đổi đối với cấu hình sẽ không có bất kỳ ảnh hưởng nào khi bạn lưu trữ bộ đệm đó. Để làm mới bộ đệm cấu hình, hãy chạy lại lệnh trên. Trong trường hợp bạn muốn loại bỏ hoàn toàn bộ đệm cấu hình, hãy chạy

php artisan config:clear

Bộ nhớ đệm định tuyến Định tuyến cũng là một nhiệm vụ đắt tiền trong laravel. Để lưu tệp cache.php, hãy chạy lệnh dưới đây:

php artisan route:cache

Lưu ý rằng nó không hoạt động với đóng cửa. Trong trường hợp bạn đang sử dụng các bao đóng, đây là cơ hội tuyệt vời để chuyển chúng vào bộ điều khiển, vì lệnh thủ công sẽ đưa ra một ngoại lệ khi cố gắng biên dịch các tuyến bị ràng buộc để đóng thay vì các phương thức điều khiển thích hợp. Giống như bộ đệm cấu hình, mọi thay đổi đối với Rout.php sẽ không còn tác dụng nữa. Để làm mới bộ đệm, hãy chạy lệnh trên mỗi khi bạn thay đổi tệp tuyến. Để hoàn toàn thoát khỏi bộ đệm tuyến, hãy chạy lệnh dưới đây:

php artisan route:clear

Tối ưu hóa sơ đồ lớp

Không có gì lạ khi một dự án cỡ trung bình được trải rộng trên hàng trăm tệp PHP. Khi các hành vi mã hóa tốt ra lệnh cho chúng ta, mọi thứ đều có tệp riêng. Điều này, tất nhiên, không đến mà không có nhược điểm. Laravel phải bao gồm hàng tá tệp khác nhau cho mỗi yêu cầu, đây là một việc tốn kém.

Do đó, một phương pháp tối ưu hóa tốt là khai báo các tệp nào được sử dụng cho mọi yêu cầu (ví dụ: đây là tất cả các nhà cung cấp dịch vụ, phần mềm trung gian và một vài tệp khác) và kết hợp chúng trong một tệp, sau đó sẽ được tải cho mỗi yêu cầu. Điều này không khác với việc kết hợp tất cả các tệp javascript của bạn thành một, vì vậy trình duyệt sẽ phải thực hiện ít yêu cầu hơn đến máy chủ.

Các tệp biên dịch bổ sung (một lần nữa: nhà cung cấp dịch vụ, phần mềm trung gian, v.v.) phải được bạn khai báo trong config / compile.php, trong khóa tệp. Khi bạn đặt mọi thứ cần thiết cho mọi yêu cầu được thực hiện cho ứng dụng của mình, hãy ghép chúng trong một tệp với:

php artisan optimize --force

Tối ưu hóa trình soạn thảo tự động tải

Ứng dụng này không chỉ dành cho laravel, mà còn cho bất kỳ ứng dụng nào sử dụng trình soạn nhạc.

Trước tiên tôi sẽ giải thích cách tự động tải PSR-4 hoạt động, sau đó tôi sẽ chỉ cho bạn biết bạn nên chạy lệnh nào để tối ưu hóa nó. Nếu bạn không quan tâm đến việc làm thế nào nhà soạn nhạc hoạt động, tôi khuyên bạn nên nhảy trực tiếp vào lệnh console.

Khi bạn yêu cầu nhà soạn nhạc cho App\Controllers\AuthControllerlớp, trước tiên, nó sẽ tìm kiếm một liên kết trực tiếp trong sơ đồ lớp. Bản đồ lớp là một mảng với các liên kết 1 đến 1 của các lớp và tệp. Vì, tất nhiên, bạn không thêm thủ công lớp Đăng nhập và tệp được liên kết của nó vào sơ đồ lớp, trình soạn thảo sẽ di chuyển và tìm kiếm trong các không gian tên. Vì Ứng dụng là không gian tên PSR-4, mặc định đi kèm với Laravel và được liên kết với app/thư mục, nhà soạn nhạc sẽ thử chuyển đổi tên lớp PSR-4 thành tên tệp với quy trình thao tác chuỗi cơ bản. Cuối cùng, nó đoán rằng nó App\Controllers\AuthControllerphải nằm trong tệp AuthControll.php, nằm trong một Controllers/thư mục may mắn nằm trong thư mục không gian tên app/.

Tất cả công việc khó khăn này chỉ để có được rằng App\Controllers\AuthControllerlớp tồn tại trong app/Controllers/AuthController.phptệp. Để nhà soạn nhạc quét toàn bộ ứng dụng của bạn và tạo các liên kết trực tiếp 1 đến 1 của các lớp và tệp, hãy chạy lệnh sau:

composer dumpautoload -o

Hãy nhớ rằng nếu bạn đã chạy php artisan tối ưu hóa - lực lượng, bạn không phải chạy cái này nữa. Vì lệnh tối ưu hóa đã báo cho nhà soạn nhạc tạo ra tự động tải tối ưu hóa.


29

Gói này dành cho php ^ 7.0 và ^ laravel5.5 .

Sử dụng gói này trong cronjob mà tôi đã tạo cho mục đích này. Tôi cũng đã phải đối mặt với tình huống tương tự. https://packagist.org/packages/afrazahmad/clear-cached-data Cài đặt nó và chạy:

php artisan clear:data

và nó sẽ chạy các lệnh sau một cách tự động

php artisan cache:clear
php artisan view:clear
php artisan route:clear
php artisan clear-compiled
php artisan config:cache

Hy vọng nó giúp.

Nếu bạn muốn chạy nó tự động vào thời gian cụ thể thì bạn sẽ phải thiết lập crnjob trước. ví dụ

 in app/console/kernel.php

Trong chức năng lịch trình:

$schedule->command('clear:data')->dailyAt('07:00');

17

Về cơ bản tôi muốn xóa bộ đệm xem.

Hiện tại đã có một lệnh trong Laravel 5.1 cho điều đó

php artisan view:clear

9

Bạn có thể kết nối qua FTP và xóa storage\framework\viewsthư mục cho laravel 5hoặc app\storage\viewscho laravel 4.


7

Để xóa tất cả bộ đệm ngoài CLI , hãy làm điều này; Điều này làm việc cho tôi.

Route::get('/clear', function() {

   Artisan::call('cache:clear');
   Artisan::call('config:clear');
   Artisan::call('config:cache');
   Artisan::call('view:clear');

   return "Cleared!";

});

config:cachesẽ xóa và cấu hình bộ đệm - vì vậy tôi đoán không cần thêm cả hai
Raja Khoury

chắc chắn rồi. bạn chỉ cần sử dụng dòng bạn yêu cầu.
Amos Chihi

4
php artisan view:clear

sẽ xóa các khung nhìn được lưu trữ


Thay thế cho lệnh php artisan cache:clear được yêu cầu. Điều này sẽ không xóa bộ nhớ cache xem được lưu trữ trong thư mục lưu trữ, đó là chính xác những gì cần thiết.
Spidi

2

Bạn có thể làm điều này nếu bạn đang sử dụng Lumentừ Laraveltrên routes/web.phptệp của mình :

use Illuminate\Support\Facades\Artisan;

$app->get('/clear-cache', function () {
    $code = Artisan::call('cache:clear');
    return 'cache cleared';
});

1

Bạn cũng có thể thực hiện thông qua bộ định tuyến, tương tự như câu trả lời của Francesco nhưng ít lộn xộn hơn trong cấu hình bộ định tuyến

Route::get('/artisan/{cmd}', function($cmd) {
    $cmd = trim(str_replace("-",":", $cmd));
    $validCommands = ['cache:clear', 'optimize', 'route:cache', 'route:clear', 'view:clear', 'config:cache'];
    if (in_array($cmd, $validCommands)) {
        Artisan::call($cmd);
        return "<h1>Ran Artisan command: {$cmd}</h1>";
    } else {
        return "<h1>Not valid Artisan command</h1>";
    }
});

Sau đó chạy chúng thông qua truy cập http: //myapp.test/artisan/cache-clear, v.v ... Nếu bạn cần thêm / chỉnh sửa các lệnh Artisan hợp lệ, chỉ cần cập nhật mảng $ validCommands.


1

Điều này làm việc cho tôi. Trong dự án của bạn, hãy chuyển đến: Storage> framework> view. Xóa tất cả các tập tin trong đó và làm mới trang của bạn.



1

Đã sử dụng trang này một vài lần để sao chép và dán các lệnh nhanh vào trình soạn thảo, vì vậy tôi đã viết một lệnh thực hiện các lệnh này trong một lệnh thủ công duy nhất.

namespace App\Console\Commands\Admin;

use Illuminate\Console\Command;

class ClearEverything extends Command
{

    protected $signature = 'traqza:clear-everything';

    protected $description = 'Clears routes, config, cache, views, compiled, and caches config.';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        $validCommands = array('route:clear', 'config:clear', 'cache:clear', 'view:clear', 'clear-compiled', 'config:cache');
        foreach ($validCommands as $cmd) {
            $this->call('' . $cmd . '');

        }
    }
}

Đặt trong app\Console\Commands\Adminthư mục

sau đó chạy lệnh trong trình soạn thảo php artisan traqza:clear-everything

Chúc mừng mã hóa.

Github -> https://github.com/Traqza/clear-everything


0

Mặc dù tôi hoàn toàn không đồng ý với ý tưởng chạy ứng dụng laravel trên dịch vụ lưu trữ chia sẻ (một ý tưởng tồi xung quanh), gói này có thể sẽ giải quyết vấn đề của bạn. Nó là một gói cho phép bạn chạy một số lệnh thủ công từ web. Nó không hoàn hảo, nhưng có thể làm việc cho một số giai đoạn.

https://github.com/recca0120/laravel-terminal



0

Tôi tin rằng cách tiếp cận hiệu quả hơn cho việc này là sử dụng mô đun công việc cron trong bảng quản trị máy chủ dùng chung để chạy lệnh trình lập lịch trình laravel, từ đó sẽ gọi lệnh artisan được cấu hình, một cái gì đó như thế này sẽ thực hiện công việc:

* * * * * /usr/bin/php /var/www/web/artisan schedule:run /dev/null 2>&1

Với thiết lập lịch trình trong cron, bạn có thể chỉnh sửa phương thức lịch biểu trong \ App \ Console \ Kernel.php để gọi đúng lệnh thủ công, đại loại như sau:

$schedule->command('queue:work')->cron('* * * * *')->withoutOverlapping();
$schedule->command('route:cache')->cron('0 0 * * *')->withoutOverlapping();

Bạn luôn có thể xóa các dòng trên sau khi các lệnh chạy

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.