richiama la funzione ancora una volta dopo un errore, senza linee duplicate?

0

Ho quella che probabilmente è una domanda di ingegneria eccessiva. Ho qualche codice PHP che registra i messaggi in un file. Abbiamo avuto un problema con il file avente i permessi sbagliati di volta in volta. Mentre stiamo risolvendo il problema, sto scrivendo una soluzione per questo nella funzione di logging, cambiando i permanenti e i proprietari unix sul file di log.

Quindi il mio codice assomiglia a questo:

function log($message) {
  if ( FALSE === file_put_contents(log_path(), $message) ) {
    chown(log_path(), 'apache');
    chgrp(log_path(), 'www-data');
    chown(log_path(), 0770);

    // now I'm repeating this line
    if ( FALSE === file_put_contents(log_path(), $message) ) {
      // log error to database
      db_log($message);
    }
  }
}

Nell'interesse di DRY, posso in qualche modo modificare il codice per evitare di ripetere la riga if ( FALSE === file_put_contents(log_path(), $message) ) { ? Certo, non posso usare la ricorsione, perché sarebbe andata avanti all'infinito.

    
posta user1936 09.09.2015 - 20:34
fonte

3 risposte

-1

Non è necessario, ma se vuoi asciugarlo:

function and_($now, $then) {
    return function($seed) use($now, $then) {
        return $now($seed) && $then($seed);
    };
}

function or_($now, $else) {
    return function($seed) use($now, $else) {
        return $now($seed) || $else($seed);
    };
}

function write_message($message) {
  return file_put_contents(log_path(), $message);
}

function fix_file($message) {
  chown(log_path(), 'apache');
  chgrp(log_path(), 'www-data');
  chown(log_path(), 0770);
  return TRUE;
}

function log_($message) {
    $log = or_('write_message', and_('fix_file', or_('write_message', 'db_log')));
    $log($message);
}
    
risposta data 09.09.2015 - 22:07
fonte
1

Se lo desideri, puoi farlo:

function log($message)
{
  for($i = 0; $i < 2; ++$i)
  {
    if ( FALSE !== file_put_contents(log_path(), $message) )
    {
      return;
    }
    if($i == 0)
    {
      chown(log_path(), 'apache');
      chgrp(log_path(), 'www-data');
      chown(log_path(), 0770);
    }
    else
    {
      // log error to database
      db_log($message);
    }
  }
}

Non mi piace, tuttavia ... Solo una semplice chiamata di funzione? Bene, va bene. Se si trattasse di un codice più complesso che dovevi eseguire prima di poter prendere una decisione, scriverei una funzione separata per questo , restituendo true o false e facendola chiamare due volte, proprio come te fatto con la funzione file_put_contents.

    
risposta data 10.09.2015 - 01:33
fonte
0

Un paio di possibilità che non sono state menzionate:

  1. Se l'impostazione delle autorizzazioni è sempre accettabile, imposta sempre le autorizzazioni, evitando il primo "se" interamente. Soprattutto perché questa è una soluzione alternativa.
  2. Controllare le autorizzazioni, impostandole se necessario, quindi chiamare file_put_contents (...). Questo ha l'ulteriore vantaggio di distinguere un errore di autorizzazione da un errore reale nella chiamata a file_put_contents (...), che può aiutare con il debug.
risposta data 10.09.2015 - 16:16
fonte

Leggi altre domande sui tag