GlisWeb framework
_config.php
Vai alla documentazione di questo file.
1 <?php
2 
227  // debug
228  // die( 'CONFIG INIT' );
229 
230  // TODO documentare
231  function path2custom( $p ) {
232  return str_replace( '_', NULL, $p );
233  }
234 
235  // REFACTORING le costanti DIRECTORY_* dovrebbero diventare per brevità DIR_* inoltre il nome dovrebbe rappresentare
236  // il percorso (ad es. per DIRECTORY_LOG e DIRECTORY_LOG_LATEST dovrebbero diventare DIR_VAR_LOG e DIR_VAR_LOG_LATEST)
237  // inoltre i percorsi dovrebbero essere composti concatenando le cartelle (ad es. DIR_VAR_LOG_LATEST = DIR_VAR_LOG . 'latest/')
238  // infine le cartelle figlie di DIR_BASE dovrebbero includere DIR_BASE (ad es. DIR_VAR = DIR_BASE . 'var/' e di conseguenza
239  // DIR_VAR_LOG = DIR_VAR . 'log/) questo per semplificare l'uso delle costanti di directory e ridurre il ricorso
240  // in concatenazione a DIR_BASE)
241 
242  // REFACTORING conseguentemente dove possibile i nomi delle cartelle andrebbero ridotti a tre lettere (ad es. _src/_lib/_external
243  // può divnetare _src/_lib/_ext/ e _src/_inc/_controllers può diventare _src/_inc/_cnt/ e così via) lasciando come eccezione
244  // le cartelle custom che non esistono in standard (ad es. var/cache/ può rimanere così) anche se preferibilmente per i nomi
245  // delle cartelle andrebbe usato l'inglese (ad es. var/immagini/ dovrebbe essere var/images/)
246 
247  // controllo performances
248  define( 'START_TIME' , microtime( true ) );
249 
250  // directory base
251  define( 'DIRECTORY_BASE' , str_replace( '_src' , NULL , dirname( __FILE__ ) ) );
252 
253  // directory
254  define( 'DIRECTORY_ETC' , '_etc/' );
255  define( 'DIRECTORY_DIZIONARI' , '_etc/_dictionaries/' );
256  define( 'DIRECTORY_MODULI' , '_mod/' );
257  define( 'DIRECTORY_SRC' , '_src/' );
258  define( 'DIRECTORY_CONFIGURAZIONE' , '_src/_config/' );
259  define( 'DIRECTORY_INCLUSIONI' , '_src/_inc/' );
260  define( 'DIRECTORY_CONTROLLER' , '_src/_inc/_controllers/' );
261  define( 'DIRECTORY_LIBRERIE' , '_src/_lib/' );
262  define( 'DIRECTORY_LIBRERIE_EX' , '_src/_lib/_external/' );
263  define( 'DIRECTORY_TEMPORANEA' , 'tmp/' );
264  define( 'DIRECTORY_VAR' , 'var/' );
265  define( 'DIRECTORY_CACHE' , 'var/cache/' );
266  define( 'DIRECTORY_IMMAGINI' , 'var/immagini/' );
267  define( 'DIRECTORY_LOG' , 'var/log/' );
268  define( 'DIRECTORY_LOG_LATEST' , 'var/log/latest/' );
269 
270  // file
271  define( 'FILE_LATEST_RUN' , DIRECTORY_BASE . DIRECTORY_LOG_LATEST . 'run.latest.log');
272  define( 'FILE_LATEST_CRON' , DIRECTORY_BASE . DIRECTORY_LOG_LATEST . 'cron.latest.log');
273 
274  // livelli di controllo
275  define( 'FILTERED_CONTROL' , 'FILTERED' );
276  define( 'FULL_CONTROL' , 'FULL' );
277 
278  // azioni
279  define( 'METHOD_DELETE' , 'DELETE' );
280  define( 'METHOD_GET' , 'GET' );
281  define( 'METHOD_PATCH' , 'PATCH' );
282  define( 'METHOD_POST' , 'POST' );
283  define( 'METHOD_PUT' , 'PUT' );
284  define( 'METHOD_REPLACE' , 'REPLACE' );
285  define( 'METHOD_UPDATE' , 'UPDATE' );
286 
287  // costanti per l'identificazione dei database
288  define( 'DB_MYSQL' , 'MYSQL' );
289  define( 'DB_POSTGRESQL' , 'PGSQL' );
290  define( 'DB_MSSQL' , 'MSSQL' );
291 
292  // costanti che descrivono lo stato dell'output buffering
293  define( 'OB_NON_ATTIVO' , 'NOOB' );
294  define( 'OB_ATTIVO' , 'OB' );
295  define( 'OB_ATTIVO_CON_GZIP' , 'OBGZ' );
296 
297  // costanti che descrivono il backend per le sessioni
298  define( 'SESSION_APACHE' , 'SESS_APACHE' );
299  define( 'SESSION_FILESYSTEM' , 'SESS_FS' );
300  define( 'SESSION_REDIS' , 'SESS_REDIS' );
301  define( 'SESSION_MEMCACHE' , 'SESS_MEMCACHE' );
302 
303  // avvio dell'output buffer con compressione gzip se possibile, senza altrimenti
304  if( ob_start( 'ob_gzhandler' ) ) {
305  $cf['ob']['status'] = OB_ATTIVO_CON_GZIP;
306  } elseif( ob_start() ) {
307  $cf['ob']['status'] = OB_ATTIVO;
308  } else {
309  $cf['ob']['status'] = OB_NON_ATTIVO;
310  }
311 
312  // CHIAVI DI CONFIGURAZIONE
313  // $cf['ob'] contiene le informazioni relative all'output buffering
314  // $cf['ob']['status'] contiene lo stato dell'output buffering
315 
316  // NOTA il file src/config/external/config.yaml è stato posizionato lì in modo che sia possibile
317  // montare la cartella src/config/external/ come ConfigMap in Kubernetes - questo spiega anche
318  // perché src/config/external/config.yaml ha la priorità su src/config/config.yaml
319 
320  // NOTA visto che in caso di configurazione tramite mount di partizione su Kubernetes non dovrebbero
321  // essere presenti altri file di configurazione non si può semplificare src/config/external/ in
322  // src/config/ e montare quella?
323 
324  // NOTA si può usare path2custom() per i nomi dei file da includere
325 
326  // lettura del file di configurazione aggiuntivi YAML o JSON
327  if( file_exists( DIRECTORY_BASE . 'src/config/external/config.yaml' ) ) {
328  $cx = yaml_parse( file_get_contents( DIRECTORY_BASE . 'src/config/external/config.yaml' ) );
329  $cf['config']['file'] = DIRECTORY_BASE . 'src/config/external/config.yaml';
330  } elseif( file_exists( DIRECTORY_BASE . 'src/config.yaml' ) ) {
331  $cx = yaml_parse( file_get_contents( DIRECTORY_BASE . 'src/config.yaml' ) );
332  $cf['config']['file'] = DIRECTORY_BASE . 'src/config.yaml';
333  } elseif( file_exists( DIRECTORY_BASE . 'src/config/external/config.json' ) ) {
334  $cx = json_decode( file_get_contents( DIRECTORY_BASE . 'src/config/external/config.json' ), true );
335  $cf['config']['file'] = DIRECTORY_BASE . 'src/config/external/config.json';
336  } elseif( file_exists( DIRECTORY_BASE . 'src/config.json' ) ) {
337  $cx = json_decode( file_get_contents( DIRECTORY_BASE . 'src/config.json' ), true );
338  $cf['config']['file'] = DIRECTORY_BASE . 'src/config.json';
339  }
340 
341  // CHIAVI DI CONFIGURAZIONE
342  // $cf['config'] contiene informazioni generali sulla configurazione del framework
343  // $cf['config']['file'] contiene il percorso del file di configurazione aggiuntiva corrente
344 
345  // REFACTORING
346  // sarebbe bello poter ricavare implicitamente i moduli attivi dalla struttura dell'array $cx/$cf senza doverli dichiarare
347  // esplicitamente in $cf['mods']['active']['array'] cosa che a volte ci si dimentica di fare causando poi errori piuttosto
348  // antipatici da debuggare
349 
350  // NOTA si potrebbe sfruttare i numeri dei moduli per questo, in maniera simile a quello che già facciamo per i runlevel?
351  // c'è il problema che differentemente dai runlevel qui si tratta di fare dei glob() sul filesystem quindi serve in realtà
352  // il nome completo della cartella
353 
354  // debug
355  // echo $cf['config']['file'] . PHP_EOL;
356  // print_r( $cx );
357  // die( 'EXTERNAL CONFIG DONE' );
358 
359  // array dei moduli attivi
360  if( isset( $cx['mods']['active']['array'] ) ) {
361  $cf['mods']['active']['array'] = $cx['mods']['active']['array'];
362  $cf['mods']['active']['string'] = implode( ',', $cf['mods']['active']['array'] );
363  } elseif( file_exists( str_replace( '_', '', DIRECTORY_BASE . DIRECTORY_MODULI ) ) ) {
364  $cf['mods']['active']['array'] = array_values( array_diff( scandir( str_replace( '_', '', DIRECTORY_BASE . DIRECTORY_MODULI ) ) , array( '..' , '.' ) ) );
365  $cf['mods']['active']['string'] = implode( ',', $cf['mods']['active']['array'] );
366 # } elseif( ! empty( $_ENV['ACTIVE_MODULES'] ) ) {
367 # $cf['mods']['active']['array'] = explode( ',', $_ENV['ACTIVE_MODULES'] );
368 # $cf['mods']['active']['string'] = getenv( 'ACTIVE_MODULES' );
369  } else {
370  $cf['mods']['active']['array'] = array();
371  $cf['mods']['active']['string'] = NULL;
372  }
373 
374  // NOTA fra i tre alberi ci dev'essere corrispondenza completa nella struttura (al netto del fatto che ci sono informazioni
375  // in $cx/$cf che non vanno ribaltate su $ct in modo da evitare confusioni e dubbi sulla posizione dei dati, specialmente in
376  // fase di reperimento delle informazioni dal template manager
377 
378  // CHIAVI DI CONFIGURAZIONE
379  // $cf['mods'] contiene informazioni sui moduli
380  // $cf['mods']['active'] contiene l'elenco dei moduli attivi
381  // $cf['mods']['active']['array'] contiene l'elenco dei moduli attivi in forma di array
382  // $cf['mods']['active']['string'] contiene l'elenco dei moduli attivi in forma di stringa separata da virgole
383 
384  // NOTA la lettura dei moduli attivi dalle variabili d'ambiente è obsoleta
385 
386  // moduli attivi
387  define( 'MODULI_ATTIVI' , $cf['mods']['active']['string'] );
388 
389  // collego $ct
390  $ct['mods'] = &$cf['mods'];
391 
392  // ricerca dei files di libreria
394  $arrayLibrerieModuli = glob( DIRECTORY_BASE . DIRECTORY_MODULI . '_{' . MODULI_ATTIVI . '}/' . DIRECTORY_LIBRERIE . '_*.*.php', GLOB_BRACE );
396 
397  // TODO come è possibile saltare dei runlevel, dovrebbe essere possibile saltare delle librerie, sia con
398  // una specificazione inclusiva (tipo "voglio solo queste librerie") sia esclusiva (tipo "includi tutte le librerie
399  // tranne queste") in modo da alleggerire l'esecuzione del framework in caso non sia necessario includere tutte le
400  // librerie
401 
402  // NOTA la strategia inclusiva andrebbe creata anche per i runlevel, che attualmente hanno solo quella esclusiva
403 
404  // inclusione dei files di libreria
405  foreach( $arrayLibrerie as $libreria ) {
406  $locale = str_replace( '_' , '' , $libreria );
407  if( file_exists( $locale ) ) {
408  require $locale;
409  } else {
410  require $libreria;
411  }
412  }
413 
414  // debug
415  // die( print_r( get_included_files(), true ) );
416  // die( 'LIBRARY CONFIG DONE' );
417 
418  // TODO bloccare l'esecuzione se non esistono le funzioni writeToFile() e logWrite()?
419 
420  // inclusione delle librerie esterne
421  require DIRECTORY_BASE . DIRECTORY_LIBRERIE . '_external/autoload.php';
422 
423  // debug
424  // die( 'EXTERNAL LIBRARY CONFIG DONE' );
425 
426  // ricerca dei files di configurazione standard
428 
429  // ordinamento dei file trovati
430  sort( $arrayConfig );
431 
432  // NOTA in alcuni casi non tutti i runlevel sono necessari, quindi è possibile per uno specifico file richiedere
433  // che alcuni di essi vengano saltati; questo migliora le prestazioni del framework e riduce lo spreco di risorse
434 
435  // CHIAVI DI CONFIGURAZIONE
436  // $cf['runlevels'] contiene informazioni sui runlevel
437  // $cf['runlevels']['skip'] contiene l'array dei runlevel da saltare
438 
439  // REFACTORING $cf['runlevels'] dovrebbe diventare $cf['lvls'] per analogia con $cf['mods']
440 
441  // filtro per runlevels
442  if( ! isset( $cf['runlevels']['skip'] ) ) { $cf['runlevels']['skip'] = array(); }
443 
444  // NOTA le funzioni che hanno "to" nel nome per omogeneità con le altre dovrebbero diventare "2" ad esempio
445  // writeToFile() dovrebbe diventare write2file()
446 
447  // log
448  writeToFile( 'inizio esecuzione runlevels' . PHP_EOL, FILE_LATEST_RUN );
449 
450  // NOTA il framework prevede alcuni file di log speciali, utili soprattutto per il debug; questi file vengono scritti
451  // a parte, direttamente con appendToFile(), senza passare dalla factory di log principale logWrite() per ridurre le
452  // possibilità che un problema di esecuzione ne pregiudichi l'integrità
453  //
454  // FILE_LATEST_RUN contiene il tracciato dell'ultima esecuzione del framework, utile per capire
455  // dove si trova il problema in caso di esecuzione parziale che termina con errore
456  // FILE_LATEST_CRON contiene il tracciato dell'ultima esecuzione dei task e dei job pianificati
457  // con cron, utile per verificare che cron stia girando e per monitorare il suo
458  // output, altrimenti difficile da catturare in altra maniera
459 
460  // debug
461  // die( 'INIZIO ESECUZIONE RUNLEVELS' );
462 
463  // inclusione dei files di configurazione
464  // NOTA questa è l'esecuzione della griglia moduli/livelli
465  foreach( $arrayConfig as $configFile ) {
466 
467  // debug
468  // echo $configFile . PHP_EOL;
469 
470  // controparte locale
471  $configFileLocale = str_replace( '_', '', $configFile );
472 
473  // calcolo runlevel
474  $runLvlArray = explode( '.', basename( $configFileLocale ) );
475  $runLvlString = array_shift( $runLvlArray );
476 
477  // salto i runlevel specificati
478  if( ! in_array( $runLvlString, $cf['runlevels']['skip'] ) ) {
479 
480  // inclusione file standard
481  require $configFile;
482  timerCheck( $cf['speed'], $configFile );
483  appendToFile( 'esecuzione runlevel -> ' . $configFile . PHP_EOL, FILE_LATEST_RUN );
484 
485  // inclusione file locale
486  if( file_exists( $configFileLocale ) ) {
487  require $configFileLocale;
488  timerCheck( $cf['speed'], $configFileLocale );
489  appendToFile( 'esecuzione runlevel -> ' . $configFileLocale . PHP_EOL, FILE_LATEST_RUN );
490  }
491 
492  // controparte moduli
493  $arrayConfigModuli = glob( str_replace( DIRECTORY_BASE, DIRECTORY_BASE . DIRECTORY_MODULI . '_{' . MODULI_ATTIVI . '}/', $configFile ), GLOB_BRACE );
494  foreach( $arrayConfigModuli as $configFileModuli ) {
495 
496  // debug
497  // echo $configFileModuli . PHP_EOL;
498 
499  // inclusione file di modulo
500  require $configFileModuli;
501  timerCheck( $cf['speed'], $configFileModuli );
502  appendToFile( 'esecuzione runlevel -> ' . $configFileModuli . PHP_EOL, FILE_LATEST_RUN );
503 
504  // controparte modulo locale
505  $configFileModuliLocale = str_replace( '_', '', $configFileModuli );
506  if( file_exists( $configFileModuliLocale ) ) {
507  require $configFileModuliLocale;
508  timerCheck( $cf['speed'], $configFileModuliLocale );
509  appendToFile( 'esecuzione runlevel -> ' . $configFileModuliLocale . PHP_EOL, FILE_LATEST_RUN );
510  }
511 
512  }
513 
514  } else {
515 
516  logWrite( 'saltato runlevel: ' . $runLvlString, 'speed', LOG_DEBUG );
517 
518  }
519 
520  }
521 
522  // CHIAVI DI CONFIGURAZIONE
523  // $cf['speed'] contiene informazioni sulla velocità e sulle performance del framework
524 
525  // debug
526  // die( 'CONFIG END' );
527 
528  // NOTA le costanti e gli array $cx/$cf/$ct dovrebbero essere gli unici ad avere visibilità su file diversi; per evitare
529  // confusioni e collisioni le variabili dovrebbero sempre avere il loro ciclo di vita limitato al file in cui vengono
530  // dichiarate
531 
532  // debug
533  // print_r( get_included_files() );
534  // print_r( $cf );
535  // print_r( $ct );
536  // print_r( $cx );
537 
538 ?>
appendToFile( $t, $f, &$e=NULL)
aggiunge una stringa a un file
const FILE_LATEST_RUN
Definition: _config.php:271
$arrayLibrerie
Definition: _config.php:395
path2custom( $p)
Definition: _config.php:231
logWrite( $m, $f='site', $l=LOG_NOTICE, $d=DIRECTORY_LOG, $t=CURRENT_LOG_LEVEL, $s=SITE_STATUS)
scrive un messaggio nei log del sito
Definition: _log.utils.php:48
$p['ricerca']
writeToFile( $t, $f, &$e=NULL)
scrive una stringa su un file
$cf['mods']['active']['string']
Definition: _config.php:371
const OB_ATTIVO_CON_GZIP
Definition: _config.php:295
$arrayConfig
Definition: _config.php:427
const DIRECTORY_BASE
Definition: _config.php:251
$ct['mods']
Definition: _config.php:390
$arrayLibrerieBase
Definition: _config.php:393
const MODULI_ATTIVI
Definition: _config.php:387
const DIRECTORY_MODULI
Definition: _config.php:256
if(! isset( $_REQUEST['__view__'][ $ct['view']['id']]['__extra__']['assegnato'])|| $_REQUEST['__view__'][ $ct['view']['id']]['__extra__']['assegnato']=='__me__') elseif($_REQUEST[ '__view__'][$ct[ 'view'][ 'id']][ '__extra__'][ 'assegnato']=='__nessuno__')
timerCheck(&$a, $c)
const DIRECTORY_LOG_LATEST
Definition: _config.php:268
const DIRECTORY_LIBRERIE
Definition: _config.php:261
$arrayLibrerieModuli
Definition: _config.php:394
const DIRECTORY_CONFIGURAZIONE
Definition: _config.php:258
const OB_NON_ATTIVO
Definition: _config.php:293
const OB_ATTIVO
Definition: _config.php:294