Browse Source

#4107 : gerer proprement les cas ou opcache_invalidate() ne peut pas invalider un cache opcode et dans ce cas uniquement temporiser les hits via spip_attend_invalidation_opcode_cache avant installation des plugins, en lui passant toutefois la date du fichier php compile le plus recent pour limiter au maximum les risques d'attente

pull/1/head
Cerdic 3 years ago
parent
commit
17759d839e
  1. 4
      ecrire/exec/admin_plugin.php
  2. 22
      ecrire/inc/flock.php
  3. 13
      ecrire/inc/plugin.php

4
ecrire/exec/admin_plugin.php

@ -48,6 +48,10 @@ function exec_admin_plugin_dist($retour = '') {
$new = actualise_plugins_actifs();
if ($new and _request('actualise') < 2) {
include_spip('inc/headers');
if (isset($GLOBALS['fichier_php_compile_recent'])) {
// attendre eventuellement l'invalidation du cache opcode
spip_attend_invalidation_opcode_cache($GLOBALS['fichier_php_compile_recent']);
}
redirige_par_entete(parametre_url(self(), 'actualise', _request('actualise') + 1, '&'));
} else {
admin_plug_args(_request('voir'), _request('erreur'), _request('format'));

22
ecrire/inc/flock.php

@ -465,7 +465,11 @@ function spip_clear_opcode_cache($filepath) {
// Zend OPcache
if (function_exists('opcache_invalidate')) {
opcache_invalidate($filepath, true);
$invalidate = @opcache_invalidate($filepath, true);
// si l'invalidation a echoue lever un flag
if (!$invalidate and !defined('_spip_attend_invalidation_opcode_cache')) {
define('_spip_attend_invalidation_opcode_cache',true);
}
}
// APC.
if (function_exists('apc_delete_file')) {
@ -495,14 +499,24 @@ function spip_clear_opcode_cache($filepath) {
* @link http://wiki.mikejung.biz/PHP_OPcache
*
*/
function spip_attend_invalidation_opcode_cache() {
function spip_attend_invalidation_opcode_cache($timestamp = null) {
if (function_exists('opcache_get_configuration')
and @ini_get('opcache.enable')
and @ini_get('opcache.validate_timestamps')
and $duree = @ini_get('opcache.revalidate_freq')
and defined('_spip_attend_invalidation_opcode_cache') // des invalidations ont echouees
) {
spip_log('Probleme de configuration opcache.revalidate_freq '. $duree .'s', _LOG_INFO_IMPORTANTE);
sleep($duree + 1);
$wait = $duree + 1;
if ($timestamp) {
$wait -= (time() - $timestamp);
if ($wait<0) {
$wait = 0;
}
}
spip_log('Probleme de configuration opcache.revalidate_freq '. $duree .'s : on attend '.$wait.'s', _LOG_INFO_IMPORTANTE);
if ($wait) {
sleep($duree + 1);
}
}
}

13
ecrire/inc/plugin.php

@ -863,9 +863,6 @@ function ecrire_plugin_actifs($plugin, $pipe_recherche = false, $operation = 'ra
// generer le fichier _CACHE_PIPELINE
pipeline_precompile($prepend_code);
// attendre eventuellement l'invalidation du cache opcode
#spip_attend_invalidation_opcode_cache();
if (spip_connect()) {
// lancer et initialiser les nouveaux crons !
include_spip('inc/genie');
@ -1322,6 +1319,11 @@ function plugin_est_installe($plug_path) {
* @uses plugins_installer_dist()
**/
function plugin_installes_meta() {
if (isset($GLOBALS['fichier_php_compile_recent'])) {
// attendre eventuellement l'invalidation du cache opcode
spip_attend_invalidation_opcode_cache($GLOBALS['fichier_php_compile_recent']);
}
$installer_plugins = charger_fonction('installer', 'plugins');
$meta_plug_installes = array();
foreach (unserialize($GLOBALS['meta']['plugin']) as $prefix => $resume) {
@ -1361,6 +1363,9 @@ function plugin_installes_meta() {
* Commentaire : code écrit en tout début de fichier, après la balise PHP ouvrante
**/
function ecrire_fichier_php($nom, $contenu, $comment = '') {
if (!isset($GLOBALS['fichier_php_compile_recent'])) {
$GLOBALS['fichier_php_compile_recent'] = 0;
}
$contenu = '<' . '?php' . "\n" . $comment . "\nif (defined('_ECRIRE_INC_VERSION')) {\n" . $contenu . "}\n?" . '>';
// si un fichier existe deja on verifie que son contenu change avant de l'ecraser
@ -1374,11 +1379,13 @@ function ecrire_fichier_php($nom, $contenu, $comment = '') {
}
file_put_contents($fichier_tmp, $contenu);
if(md5_file($nom) == md5_file($fichier_tmp)) {
$GLOBALS['fichier_php_compile_recent'] = max($GLOBALS['fichier_php_compile_recent'], filemtime($nom));
@unlink($fichier_tmp);
return;
}
@unlink($fichier_tmp);
}
ecrire_fichier($nom, $contenu);
$GLOBALS['fichier_php_compile_recent'] = max($GLOBALS['fichier_php_compile_recent'], filemtime($nom));
spip_clear_opcode_cache(realpath($nom));
}
Loading…
Cancel
Save