Jump to content

Recommended Posts

Posted

New thread from this original comment in the main RM thread.

So I have WireCache Filesystem installed and it's a critical part of the back end of the ProcessWire application. This is a drop-in replacement by Ryan for the core database cache system.

@bernhard from your original response:

Quote

Could you please open a new thread for this and explain the benefits of filesystem cache and how you are using it? Then we can discuss there in an isolated environment which makes it easier to reply, link, refer to... Please also explain your use case as I've never used filesystem cache.

So the benefits of a filesystem cache are that it's lightning fast. It's really preferable in a lot of situations to database caches which require DB queries. It would be difficult to quantify in hard numbers but the simple fact is that filesystem reads are much faster that MySQL queries. This is negligible on local environments but in production is has a significant impact.

The compatibility issue is that RM is getting the lastrun value in the __construct() before the filesystem cache has a chance to boot. Is it possible to move that to init or ready?

  • Like 2
Posted

@bernhard I made the following change to the code and it appears to work correctly.

<?php

  public function __construct()
  {
    parent::__construct();
    $this->path = $this->wire->config->paths($this);
    $this->wire->classLoader->addNamespace("RockMigrations", __DIR__ . "/classes");
    $this->lastRunLogfile = wire()->config->paths->logs . 'rockmigrations-lastrun.txt';

    // load all constant-traits in /site/modules/*/
    $file = wire()->config->paths->site . "RockMigrationsConstants.php";
    if (is_file($file)) require_once $file;
    $dir = wire()->config->paths->siteModules;
    foreach (glob($dir . '*/RockMigrationsConstants.php') as $file) {
      require_once $file;
    }

    $this->watchlist = $this->wire(new WireArray());
    // $this->lastrun = (int)$this->wire->cache->get(self::cachename);	<- Move this from here
  }

  public function init()
  {
    $this->lastrun = (int)$this->wire->cache->get(self::cachename); // <- To here
    $this->wire->classLoader->addNamespace("RockMigrations", __DIR__ . "/classes");
    $this->wire->classLoader->addNamespace("ProcessWire", wire()->config->paths->assets . 'RockMigrations');

    $config = $this->wire->config;
    $this->wire('rockmigrations', $this);
    if (!wire()->modules->isInstalled('MagicPages')) $this->installModule('MagicPages');
    if ($config->debug) $this->setOutputLevel(self::outputLevelVerbose);
    
    // ...etc

I'm not sure if there is a need to have the last run timestamp checked in __construct() that you know of and I am not familiar with but this change seems to work for migrations and resolves the issue.

  • Thanks 1
Posted

Hey @FireWire thx sounds good! I can't remember any reason for having it in __construct

I have just added this to the dev branch so we have a month of testing before it's merged to main 🙂 

  • Thanks 1
Posted

@bernhard Awesome as always 😎

I don't know if you have a use case for trying the filesystem cache, but I recommend it. As it's a drop-in replacement it's a default for my projects. Sometimes just knowing it's the caching method is nice (I sleep better at night?) haha

If you see any issues that pop up during testing it would be great if you could share them ahead of the release. Maybe there's a fix, maybe I need to reconsider it in project. 

  • FireWire changed the title to [SOLVED] Compatibility with WireCache Filesystem

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...