array( 'timeout' => 300,//toysforyou impiega 120/140 al 3/2021 - ATTENZIONE PHP7 https://bugs.php.net/bug.php?id=76342 ), 'ssl'=>array( "verify_peer"=>TNX_SECURE_CURL, ), )); foreach($bus as $k=>$h){ $url = $h."?tabellaSitemapAggiorna=1&from=tSA".(count($bus) > 1 ? "&multiHost=".($k+1)."/".count($bus) : ""); foreach($haps as $parametroUrl){ // mailtnx("carlo@tnx.it", "Debug ".microtime(true), __FILE__.":".__LINE__."\n".print_r(array($url."&$parametroUrl", $_REQUEST, $_SERVER), true)); $u = $url."&$parametroUrl"; if($background) background_curl($u); else $res = file_get_contents($u, false, $ctx); } if(!$background && $res != 'ok') return $res; } return $res; } if($CONF["tabellaSitemap"]){ //operazioni da fare prima della cache o che servono per skippare la cache in caso di tabellaSitemapAggiorna if($_GET['tSA']){ die(tabellaSitemapAggiornaMultiHost($_GET['background']));//"ok" se tutto è andato bene } //faccio show tables per essere sicuri che mysql è operativo (non posso distinguere altrimenti quando manca la tabella da quando mysql è down) //cecca 06/2023, se si deve fare solo per verificare mysql sarebbe meglio fare "select 1" if(db_q("show tables") === false){ indiManutenzione("tabellaSitemap, show tables === false (".mysql_tnx_error()."), controllare se presente db"); } if($_GET['tabellaSitemapImportTest'] && $_GET['tabellaSitemapTruncate']) @db_q("truncate sitemap;"); $recordsTabellaSitemap = @db_qrs("select count(*) from sitemap where host = '".$_SERVER['SERVER_NAME']."'");//false in caso di errore di connessione al db //deve essere settata e popolata per i vecchi siti $CONF["tabellaSitemapPronta"] = $CONF["tabellaSitemap"] === true || ($CONF["tabellaSitemap"] == 'import' && $recordsTabellaSitemap); // if($CONF["tabellaSitemapPronta"]) $CONF['rew_alias_solo_alfanumerici'] = true; $CONF['tabellaSitemapPrimaImportazione'] = $CONF["tabellaSitemap"] === 'import' && !$recordsTabellaSitemap; //i GET qui devono essere passati in maniera standard, non c'è ancora il parsing di indi //tabellaSitemapAggiorna lo metto in una variabile perchè qui leggo solo i paramentri ?tabellaSitemapAggiorna=1 //e dove chiamo la funzione tabellaSitemapAggiorna riceverei anche /tabellaSitemapAggiorna:1/ //quindi se lo passo nel formato sbagliato succede un casino perchè qui non scatta l'if e di là sì (rew_alias del menu avvalorato...) //visto che ci sono controllo anche tabellaSitemapPronta (potrei fare un salva da admin senza aver fatto il primo import) //lo metto in una variabile anche perchè mi serve per attivare subito tabellaSitemapAggiornaSetPID, centralizzando le 3 casistiche che lo fanno partire (richiesta via get, tabellaSitemapPrimaImportazione, tabellaSitemapForzaAggiornamentoLive) $CONF['tabellaSitemapAggiorna'] = ($_GET['tabellaSitemapAggiorna'] && $CONF["tabellaSitemapPronta"]) || $CONF['tabellaSitemapPrimaImportazione']; } //banchmark qui: https://www.demo.tnx.it/carlo/serialize_json_encode_gzcompress/ $usaJson = false;//json era più veloce di unserialize solo su php 5.x https://stackoverflow.com/questions/804045/preferred-method-to-store-php-arrays-json-encode-vs-serialize $comprimiGz = false;//su menu grossi (campingfreedom), si possono perdere anche 100ms, se non ci sono problemi di memoria, meglio evitare $menuLettoDaCache = false;//sotto non posso controllare if($MENU) perchè sempre parzialmente avvalorato $leggiESalvaMenuInCache = false; $CONF["indiMenuCacheKey"] = ''; if( !$_GET['no_cache'] && ( $_GET['indi_apc'] == 1 || ($CONF['indi_apc_indice_menu'] == "AUTO" and $CONF['indi_menu_tot_pagine'] >= 1000) || $CONF['indi_apc_indice_menu'] == "SI" ) ){ d_info("APC","Abilito cache APC x funzione (main_link_globale) >= 1000 pagine"); $CONF["indiMenuCacheKey"] = "MENU_".md5(json_encode($MENU)).($usaJson?"j":"s").($comprimiGz?"Z":"P"); $leggiESalvaMenuInCache = !$CONF['tabellaSitemapAggiorna'];//se sto aggiornando tabella tabellaSitemapAggiorna non devo salavare il menu perchè non completo in quanto non mi serve (ma mi serve indiMenuCacheKey a fine processo) if($leggiESalvaMenuInCache){ d_info($CONF["indiMenuCacheKey"], "chiave lettura menu da cache", "INDI"); $stored = indiSiteCacheGet($CONF["indiMenuCacheKey"]); if($stored){ if($comprimiGz) $stored = gzuncompress($stored); if($usaJson) $stored = json_decode($stored, true); else $stored = unserialize($stored); $menuLettoDaCache = true; $MENU = $stored['MENU']; $MENU_REF = $stored['MENU_REF']; if($CONF["REW"] != "NO") { $REW_ALIAS = $stored['REW_ALIAS']; $REW_ALIAS_INV = $stored['REW_ALIAS_INV']; } d_info("cache OK, after fetch","main_link_globale","INDI"); } unset($stored); } } if($menuLettoDaCache){ if($CONF["tabellaSitemap"]){ $CONF["tabellaSitemapPronta"] = true; $CONF["tabellaSitemapLetta"] = true; } } else{ if($CONF["tabellaSitemap"]){ $CONF['tabellaSitemapLetta'] = false;//senza averla letta non funziona il genera_link $cacheKey = "menuHash2"; if($CONF['tabellaSitemapRigeneraAutomaticamenteDaMenuDebug']) $debugFile = $CONF['dir_indi']."tabellaSitemapRigeneraAutomaticamenteDaMenuDebug"; if($CONF['tabellaSitemapRigeneraAutomaticamenteDaMenu'] && $recordsTabellaSitemap !== false){//se c'è un errore db non lo rigenero, lo faccio solo in locale perchè nei siti molto frequentati potrebbe generare disservizi (utente visita il sito dopo che ho salvato l'etichetta titolo di una pagina, ma non ancora la pagina) //si basa sulla cache, non è perfetto $cachedVal = indiSiteCacheGet($cacheKey); $data = array('pagina_def'=>$CONF['pagina_def'], 'MENU'=>$MENU);//se cambia modificare $cacheKey in modo da non ricevere segnalazioni inutili $dataSerialized = serialize($data); $newVal = md5($dataSerialized); if($debugFile){ $cachedData = unserialize(file_get_contents($debugFile)); file_put_contents($debugFile, serialize($data)); } indiSiteCacheSet($cacheKey, $newVal, 86400);//andrebbe salvata solo se va a buon fine, ma così faccio in modo che sia fatta una sola volta per cambiamento, anche perchè nel caso ci fosse un fail la rigenererebbe a diritto } if( !$CONF['tabellaSitemapAggiorna']//se sto richiedendo io l'aggiornamento non è necessario controllare i casi "live" /*&& $recordsTabellaSitemap !== false//in caso di errore di connessione al database non faccio niente tolto perchè se la tabella non c'è voglio comunque l'aggiornamento live, per gli errori db adesso c'è indiManutenzione */ ){ $motivo = ""; if(!$recordsTabellaSitemap && $CONF["tabellaSitemap"] === true){ $motivo = "nessun record nella tabella"; } if($cachedVal != $newVal){ if($cachedVal) $motivo = "rilevato un cambiamento di \$MENU / pagina_def"; else if($CONF['dove_sono'] == 'loc') $motivo = "sono in locale e non ho una versione cached di \$MENU"; //else sono online e probabilmente c'è stato un riavvio di apache quindi non ho la versione cached } if($motivo){ if($CONF['tabellaSitemapIntervalloRigenerazione'] || $CONF['tabellaSitemapIntervalloRigenerazione'] === 0){ $e = "Necessario aggiornamento tabellaSitemap ($motivo), "; if($CONF['tabellaSitemapIntervalloRigenerazione'] === 'background'){ tabellaSitemapRichiediAggiornamentoInBackground(); $e .= "ho richiesto un processo in background"; } else if($CONF['tabellaSitemapIntervalloRigenerazione'] === 0){ $e .= "va fatto manualmente perchè non c'è un cron"; } else{ $e .= "è previsto un cron ogni $CONF[tabellaSitemapIntervalloRigenerazione] minuti"; } if($cachedVal && $CONF['dove_sono'] == 'loc'){//in locale rimetto in cache i vecchi dati per continuo a segnalare la necessita di aggiornare indiSiteCacheSet($cacheKey, $cachedVal, 86400);//non posso mettere un valore vuoto } else $e .= " (questa operazione online viene fatta una volta al giorno per ogni cambiamento rilevato, puoi usare tabellaSitemapRigeneraAutomaticamenteDaMenuDebug per avere dettagli)"; if($debugFile){ indi_dev_email("tabellaSitemapRigeneraAutomaticamenteDaMenuDebug", print_r(array_diff_assoc_recursive($cachedData, $data), true)); } if($CONF['dove_sono'] != 'loc' || $CONF['chi_sono'] == 'noi'){//in locale li mostro solo a video, non mando la mail in caso di cron esterni ad esempio if(time() > mktime(0 /*hours*/, 0 /*minutes*/, 0 /*seconds*/, 5 /*month*/, 29 /*day*/, 2025)) trigger_error($e); } } else{ trigger_error("Forzato aggiornamento tabellaSitemap live ($motivo)"); $CONF['tabellaSitemapAggiorna'] = true; $CONF['tabellaSitemapForzaAggiornamentoLive'] = true; } } } if($CONF['tabellaSitemapAggiorna']){ //segnalo alle altre eventuali sessioni precendenti che sono in attesa di partire //lo faccio qui perchè gli include potrebbero richiedere qualche secondo e dall'admin darebbe errore di url non trovati dopo la creazione di qualche dato tabellaSitemapAggiornaSetPID(); } d_info("pre tabellaSitemapPronta","--------- INIT MENU","INDI"); //avevo provato if($CONF["tabellaSitemap"]) per entrare qui anche se il db ed evitare errori "genera_link a pagina inesistente..." //ma non funzionava più l'import //ho messo invece if($CONF["tabellaSitemapPronta"]) prima della segnalazione errore "genera_link a pagina inesistente..." if($CONF["tabellaSitemapPronta"]){ d_info("pre indiMenuMerge","--------- INIT MENU","INDI"); indiMenuMerge();//prima era dentro main_link_globale d_info("post indiMenuMerge","--------- INIT MENU","INDI"); if($CONF['tabellaSitemapAggiorna'] || $CONF['tabellaSitemapForzaAggiornamentoLive']){ //se sto aggiornando la tabella non devo aggiungere le informazioni rew_alias a $MENU, altrimenti non so se è un rew_alias forzato da noi (che quindi gli viene preposta la lingua) o autogenerato $_GET['p'] = $CONF['pagina_def']; $_GET['l'] = $CONF['lingua_def']; } else{ // $GLOBALS['indiLeggiTabellaSitemapTime'] -= microtime(true); d_info("pre indiLeggiTabellaSitemap","--------- INIT MENU","INDI"); if(!indiLeggiTabellaSitemap() && !$CONF['tabellaSitemapForzaAggiornamentoLive']){ indiManutenzione("!indiLeggiTabellaSitemap() && !CONF['tabellaSitemapForzaAggiornamentoLive']"); } d_info("post indiLeggiTabellaSitemap","--------- INIT MENU","INDI"); // if($_SERVER['REMOTE_ADDR'] == '192.168.0.177') die($GLOBALS['indiLeggiTabellaSitemapTime']+microtime(true)); } } else { d_info("pre main_link_globale","--------- INIT MENU","INDI"); main_link_globale(); d_info("post main_link_globale","--------- INIT MENU","INDI"); }; } else { main_link_globale(); } if($leggiESalvaMenuInCache) { $storeMe = array( "MENU"=> $MENU, "MENU_REF"=> $MENU_REF ); if($CONF["REW"] != "NO") { $storeMe['REW_ALIAS'] = $REW_ALIAS; $storeMe['REW_ALIAS_INV'] = $REW_ALIAS_INV; } if($usaJson) $storeMe = json_encode($storeMe, JSON_UNESCAPED_UNICODE); else $storeMe = serialize($storeMe); if($comprimiGz) $storeMe = gzcompress($storeMe, 1); indiSiteCacheSet($CONF["indiMenuCacheKey"], $storeMe, $CONF['indi_apc_menu_time']); unset($storeMe); } } $CONF['paginaDefUrl'] = genera_link($CONF['pagina_def']);//la variabile viene utilizzata nei moduli inclusi prima della generazione del menu (mod_form) //stat finali //d_info(strlen(serialize($MENU)),"Dimensione MENU","INDI"); //d_info(strlen(serialize($REW_ALIAS)),"Dimensione REW_ALIAS","INDI"); //d_info(strlen(serialize($REW_ALIAS_INV)),"Dimensione REW_ALIAS_INV","INDI"); d_info("pre post_menu","--------- INIT MENU","INDI"); indi_do_action('post_menu'); d_info("Fine","--------- INIT MENU","INDI"); ?>