Where are laravel cache files stored? - caching

I have an application and my cache driver is
In config/cache.php
'default' => env('CACHE_DRIVER', 'file'),
In my .env
CACHE_DRIVER=file
In my application if I cache something, then where these cache files are stored?

Cache will be stored in the storage/framework/cache
If this is not working then make sure you have sufficient folder permission to access it.
If you want to access it. Simply access it by keylike:
Cache::get('key');

Should be at:
storage/framework/cache
Checked it ?

Get the cache folder for Laravel 4 and 5.
function getCacheFolder()
{
// Check version & get folder for Laravel 4
$app = app();
if ($app) {
$ver = $app->VERSION();
$v = explode('.', $ver);
if ($v[1] <= 4) {
return storage_path('cache');
}
}
// Laravel 5
return storage_path('framework/cache'),
}

Related

Permission denied on storage/app/all_html/1658920379.blade.php. The communication protocol is not supported

Hi I just want to download my storage file to pdf but it show this error.
Here is my Controller
public function html(Request $request, $id=null){
if($request->isMethod('post')){
$html = $request->html;
$data = [];
if($request->hasFile('html')){
// dd($html);
$data['html'] = $request->file('html')->storeAs('all_html', time().'.blade.php');
// $data['html'] = Storage::putFile('all_html', $html);
}
$url = "storage/app/".$data['html'];
$random = 'dOC'.str::random('10');
Pdf::loadfile($url)->setPaper('a4', 'landscape')->setWarnings(false)->save(public_path('pdf/'.$random.'.pdf'));
return response()->download(public_path('pdf/'.$random.'.pdf'));
}
return view('html');
}
You need to check first in laravel storage link or not if the storage is not linked then you need to run a below command in your terminal
Storage Link command => php artisan storage:link
then check our code and run again
If this not working then you need to check your laravel storage folder permission and give them to permission
Happy Coding!!

How to change public folder to public_html in laravel 8?

I wanna deploy my application on shared hosting on Cpanel where the primary document root has public_html but Laravel project public
You have to follow 2 steps to change your application's public folder to public_html then your can deploy it or anything you can do :)
Edit \App\Providers\AppServiceProvider register() method & add this code .
// set the public path to this directory
$this->app->bind('path.public', function() {
return base_path().'/public_html';
});
Open server.php you can see this code
if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
return false;
}
require_once __DIR__.'/public/index.php';
Just Replace it with :
if ($uri !== '/' && file_exists(__DIR__.'/public_html'.$uri)) {
return false;
}
require_once __DIR__.'/public_html/index.php';
Then serve your application with php artisan serve, you also can deploy it on your Cpanel shared hosting where primary document root public_html
You can rename your public directory to whatever you want and tell Laravel to use the current directory path as the public path. Just navigate to the index.php inside the public folder (or whatever you renamed it to) and add the following code after the $app definition:
$app = require_once __DIR__.'/../bootstrap/app.php';
/* *** Add this code: *** */
$app->bind('path.public', function() {
return __DIR__;
});
/* ********************** */
there, idk if you have same problem like me, my cases is i using shared hosting, and i deploy it in my main domain. i place all my files in the root, my problem is the storage:link keep between public, not public_html (because its default by the hosting) so what i need to do i changhe the link using this code :
Before :
'links' => [
public_path('storage') => storage_path('app/public'),
],
After :
'links' => [
app()->basePath('public_html/storage') => storage_path('app/public'),
],
I hope it can help few people :)
Just Rename the "public" folder to "public_html" and it will work.
No changes are required in the code. Tested in Laravel 8.
my two cents :) What helped to me was:
Open LaravelService/vendor/laravel/framework/src/Illuminate/Foundation/Application.php and change publicPath() method to return public_html.
public function publicPath()
{
return $this->basePath.DIRECTORY_SEPARATOR.'public_html';
}
Then if you are using webpack also change the output folder:
const output = 'public_html';
mix.ts('resources/js/web/App.ts', output + '/js/web').setPublicPath(output).react();
This helped to me. Only issue is that it is probably not recommended to change Application.php as it is part of Laravel framework and after updating it, it will be probably erased so you have to put it back.

Laravel - timezone - Config null

I installed laravel-timezone as described here: https://github.com/jamesmills/laravel-timezone
also added teh configuration file, and in the configuraiton file there is this:
timezone.php
'lookup' => [
'server' => [
'REMOTE_ADDR',
],
'headers' => [
],
],
After the login, the script is suposed to update the timezone automatically, but I get Invalid argument supplied for foreach() in the file \vendor\jamesmills\laravel-timezone\src\Listeners\Auth\UpdateUsersTimezone.php:111
the function is this:
/**
* #return mixed
*/
private function getFromLookup()
{
$result = null;
foreach (config('timezone.lookup') as $type => $keys) {
if (empty($keys)) {
continue;
}
$result = $this->lookup($type, $keys);
if (is_null($result)) {
continue;
}
}
return $result;
}
I tried to put a dd() there, and config('timezone.lookup') is null..
why does it return null, if the file exists, and a value is assigned in the file?
Is there anything I have to do to make this timezone.php accesisble?
When you are caching the configuration Laravel creates a file in bootstrap/cache/config.php with all the configuration. After this is done the individual cache files and the .env file are no longer read.
You therefore need to clear your config cache, and I recommend to not cache it while in development. Only cache the config in production.
Just run:
php artisan cache:clear
Sorry you’re having issues using the package. As far as I’m aware you don’t have to publish the config for the package to work after initial install. It should pick up defaults so you should be able to install it and go! However, like others have said, if you do publish the config then please try to flush your config cache php artisan cache:clear
Thank you #apokryfos for your help on this issue.
If you have any further issues please don’t hesitate to reply.
James

Laravel, getting uploaded file's url

I'm currently working on a Laravel 5.5 project, where I want to upload files, and then, I want to get their url back of the file (I have to use it client side).
now my code looks like this:
public function pdfUploader(Request $request)
{
Log::debug('pdfUploader is called. ' . $request);
if ($request->hasFile('file') && $request->file('file')->isValid()) {
$extension = $request->file->extension();
$fileName = 'tmp' . round(microtime(true) * 1000) . '.' . $extension;
$path = $request->file->storeAs('temp', $fileName);
return ['status' => 'OK', 'path' => URL::asset($path)];
}
return ['status' => 'NOT_SAVED'];
}
It works fine, I got back the OK status, and the path, but when I want to use the path, I got HTTP 404. I checked, the file is uploaded fine..
My thought is, I should register the new url in the routes. If I have to, how can I do it dynamically, and if its not necessary what is wrong with my function?
Thx the answers in advance.
By default laravel store all uploaded files into storage directory, for example if you call $request->file->storeAs('temp', 'file.txt'); laravel will create temp folder in storage/app/ and put your file there:
$request->file->storeAs('temp', 'file.txt'); => storage/app/temp/file.txt
$request->file->storeAs('public', 'file.txt'); => storage/app/public/file.txt
However, if you want to make your uploaded files accessible from the web, there are 2 ways to do that:
Move your uploaded file into the public directory
$request->file->move(public_path('temp'), $fileName); // => public/temp/file.txt
URL::asset('temp/'.$fileName); // http://example.com/temp/file.txt
NOTE: make sure that your web server has permissions to write to the public directory
Create a symbolic link from storage directory to public directory
php artisan storage:link
This command will create a symbolic link from public/storage to storage/app/public, in this case we can store our files into storage/app/public and make them accessible from the web via symlinks:
$request->file->storeAs('public', $fileName); // => storage/app/public/file.txt
URL::asset('storage/'.$fileName); // => http://example.com/stoage/file.txt

How do I disable Laravel view cache?

I have an exception in one of my views. However, instead of telling me the name of the view so I can find it and fix it, laravel says it is in app/storage/views/110a3ecc0aa5ab7e6f7f50ef35a67a8b, which is meaningless.
How do I disable this view caching, so that laravel uses and refers to the actual files?
Out of the box? You can't. But you can extend the BladeCompiler class, overriding the method resposible for checking if the view has been expired:
class MyBladeCompiler extends BladeCompiler {
public function isExpired($path)
{
if ( ! \Config::get('view.cache'))
{
return true;
}
return parent::isExpired($path);
}
}
You'll need to replace the BladeCompiler instance in IoC container, with your own compiler:
$app = App::make('app'); // or just $app = app();
$app->bindShared('blade.compiler', function($app)
{
$cache = $app['path.storage'].'/views';
return new MyBladeCompiler($app['files'], $cache);
});
And then you just need to create that key in your app/config/view.php file
<?php
return [
'cache' => false,
'paths' => [base_path().'/resources/views'],
'pagination' => 'pagination::slider-3',
];
Or, like I do here:
return [
'cache' => in_array(App::environment(), ['production', 'staging']),
];
this worked for me... added this to the .env file
CACHE_EXPIRE=-1
In latest version of laravel (> v9.7.0), you can now add inside config/view.php:
'cache' => App::environment('local') ? false : true
Here is the PR: https://github.com/laravel/framework/pull/41859
Solution
open php.ini
opcache.revalidate_freq=0
opcache.fast_shutdown=0
change to this. restart apache.
check your .env file
Change CACHE_DRIVER=file to CACHE_DRIVER=array
If you have artisan, it's easy to clear the cache
php artisan view:clear
If you don't have or don't want artisan (can't think why you wouldn't want it, it's very useful), you can from the root of your project do
cd storage/framework/views/
rm *.php
Laravel Creates view cache file because it has been told to do that. In .env File you will come across cache_driver which has default property as file change it to array.
You can clear cache in this way, as well:
// Clear cache in laravel
Route::get('/clear-cache', function() {
Artisan::call('cache:clear');
// return what you want
return "Cache is cleared";
});
Here is the full answer
Go to vendor/illuminate/BladeCompiler.php
change these 2 lines
use Illuminate\View\Compilers\Compiler;
class BladeCompiler extends Compiler implements CompilerInterface
with the following:
use App\Support\CustomCompiler;
class BladeCompiler extends CustomCompiler implements CompilerInterface
in your app/support folder (or whatever structure you are using)
create the following class
namespace App\Support;
use Illuminate\View\Compilers\Compiler;
class CustomCompiler extends Compiler {
public function isExpired($path) {
if ( !\config('blade.use_cache'))
return true;
return parent::isExpired($path);
}
}
your blade config file will look like this
return [
'use_cache' => false,
'cache' => storage_path('cache'),
'views' => resources_path('views')
];
auto dump and run....
If you are using MAMP, disable OPCache under Preferences, General, PHP-Cahce. just select off. thank me later.
Although some would call this sketchy, this was the quickest and most minimal way to do this on a small application I was working on
On the controller(s) that my routes pointed to:
public function __construct()
{
exec('php /full/path/to/artisan view:clear');
}
A bit late to the party, however.
I had the same issue: the browser not reflecting changes to the php code.
Simple solution for me was:
set the clock on the server to the same time as the dev computer !
sudo date +%T -s "11:14:00"
In development environment, I just add and modify the next:
bootstrap/start.php
$env = $app->detectEnvironment(function(){return 'testing';});
app/config/testing/cache.php add in array
'cache' => false,
app/config/view.php add in array
'cache' => false,

Resources