Spip, cron unix et calcul des stats

Bonjour,

Quand on a accès aux taches planifiées unix, comment faire pour lancer le cron spip en batch ?
(en particulier forcer le lancement de toutes les tâches et le calcul des stats).

Merci
Renaud

Renaud a écrit :

Bonjour,

Quand on a accès aux taches planifiées unix, comment faire pour lancer le cron spip en batch ?
(en particulier forcer le lancement de toutes les tâches et le calcul des stats).

Merci
Renaud

en rajoutant cet appel php dans les taches cron :

/usr/bin/php /home/spip/spip.php?action=cron

avec le répertoire complet de ton binaire php , et l'appel (pas en http mais avec les répertoires) de ton fichier spip.php

mais il est tout aussi bien de le laisser faire par tes visiteurs sur le site
le principe est simple regarde le code html produit quand tu a rajouté la balise #SPIP_CRON ca rajoute un appel a ce script via une image de fond en css ...
du coup complétement transparent pour les utilisateurs ( ou presque vu que ca n'envoi une requete http et que ca rajoute quelques octets de code html )

rien de bien méchant quoi :slight_smile:

Yoann NOGUES a écrit :

Renaud a écrit :

Bonjour,

Quand on a accès aux taches planifiées unix, comment faire pour lancer le cron spip en batch ?
(en particulier forcer le lancement de toutes les tâches et le calcul des stats).

Merci
Renaud

en rajoutant cet appel php dans les taches cron :

/usr/bin/php /home/spip/spip.php?action=cron

avec le répertoire complet de ton binaire php , et l'appel (pas en http mais avec les répertoires) de ton fichier spip.php

mais il est tout aussi bien de le laisser faire par tes visiteurs sur le site
le principe est simple regarde le code html produit quand tu a rajouté la balise #SPIP_CRON ca rajoute un appel a ce script via une image de fond en css ...
du coup complétement transparent pour les utilisateurs ( ou presque vu que ca n'envoi une requete http et que ca rajoute quelques octets de code html )

rien de bien méchant quoi :slight_smile:

D'accord sur le principe, sauf que sur des site à très faible fréquentation (<30 visiteurs/jours), les cron fonctionnent moyen je trouve.

De plus je voudrai forcer certains calculs de nuits (optimisation de la base, etc..) plutot que cela se lance quand les visiteurs sont là.

Tel que c'est parti je suis bon pour coder un plugin qui modifie le fonctionnement du cron (désactive certaines taches en journée et permet le lancement en force de nuit de celles-ci). Si quelqu'un a de la doc là-dessus, je suis preneur.

Merci pour ta réponse

Renaud <ml <at> ascii-fr.com> writes:

> en rajoutant cet appel php dans les taches cron :
>
> /usr/bin/php /home/spip/spip.php?action=cron
>

Je ne sais pas s'il y a certaines versions de php qui le gèrent, mais là,
tel quel, on demande à php d'aller chercher le fichier :
   spip.php?action=cron
Et forcément, il ne le trouve pas !

Il faut :
- soit le faire en wget
wget http://mon-site/spip.php?action=cron
- soit (*!) passer le paramètre dans l'environnement (*!) :
(*!) QUERY_STRING="action=cron" spip.php
- soit utiliser un script php qui fait le wrapping (cf. ci-dessous)
php /home/spip/cli_wrapper.php spip.php action=cron

(*!) c'est l'idée de base; je n'ai pas testé cette méthode, car j'utilise la
3e. Il est possible que ça ne marche pas : php -i ne montre pas
$_SERVER['QUERY_STRING'], et je ne sais connais pas assez la structure de
PHP pour savoir à partir de quoi il remplit $_GET.

Le wrapper que j'utilise (cli_wrapper.php)
//*****************************************
// wrapper for php-cli calls.
// should maybe done by passing a vhost name in parameter, and parsing it ?
define('DOCROOT', dirname(__FILE__));
define('SERVER_NAME', getenv('SERVER_NAME'));

//---------------------------------------------
function decode_key_path($key) {
  $result = array();
  $r1 = '([^]*)';
  $regexp = $r1.'['.$r1.'](.*)';
  while (preg_match('/^'.$regexp.'/', $key, $matches)) {
    array_push($result, $matches[1]);
    $key = $matches[2].$matches[3];
  }
  array_push($result, $key);
  return $result;
}

//---------------------------------------------
function array_set_value(&$array, $keyPath, $value) {
  assert(count($keyPath) > 0);
  $values =& $array;
  while (count($keyPath) > 1) {
    $key = array_shift($keyPath);
    if (!isset($values[$key])) {
      $values[$key] = array();
    }
    $values =& $values[$key];
  }
  $key = array_shift($keyPath);
  $values[$key] = $value;
}

//---------------------------------------------
// use a function to avoid creating globals variables
function explodeRequestVars($args) {
  $result = array();
  foreach ($args as $arg) {
    $p = explode('=', $arg, 2);
    if (count($p) > 1) {
      list($k, $v) = $p;
    }
    else {
      $k = $arg;
      $v = '';
    }

    $keyPath = decode_key_path($k);
    array_set_value($result, $keyPath, $v);
  }
  return $result;
}

//---------------------------------------------
function get_syntax() {
  return 'Syntaxe : php cli_wrapper.php [--method=POST] <file> [<arg>...]';
}

//---------------------------------------------
function setSuperGlobals() {
  global $script_options;
  $command_line = implode(' ', $_SERVER['argv']);
  $args = $_SERVER['argv'];
  array_shift($args);
  $args = array_map('trim', $args);

  if (!count($args)) {
    phpinfo();
    echo "\n========================================================\n";
    echo get_syntax();
    echo "\n";
    exit;
  }

  $method = 'GET';
  $lock = null;
  $unique = null;
  $retryafter = null;
  $opt = array_shift($args);
  while (substr($opt, 0,1) == '-' && $opt != '--') {
    $value = '1';
    if (strpos($opt, '=') !== false) {
      list($opt, $value) = explode('=', $opt, 2);
    }

    switch ($opt) {
      case '--method' : $method = $value; break;
      default:
        throw new Exception ('Option inconnue : '.$opt.'. '.get_syntax());
    }
    $opt = array_shift($args);
  }

  $file = $opt;

  // si le premier paramètre contient ?, c'est que les arguments sont fournis
sous la forme HTTP
  $file = ltrim($file, '/');

  $p = explode('?', $file, 2);
  if (count($p) > 1) {
    list($file, $args_str) = $p;
    $args_str = str_replace('-AND-', '&', $args_str);
    $_GET = array_merge($_GET, explodeRequestVars(explode('&', $args_str)));
  }

  $root = DOCROOT;
  if (substr(PHP_OS, 0 ,3) == 'WIN') {
    $file = $root.DIRECTORY_SEPARATOR.$file;
  }
  else {
    chdir($root);
    $ofile = $file;
    $file = realpath($file);
  }
  if (substr($file, 0, strlen($root)) != $root) {
    throw new Exception('Fichier '.$ofile.' en dehors de la racine : '.$root);
  }

  // TOUJOURS /, que ce soit sous windows ou sous Unix
  $script_name = '/'.ltrim(substr($file, strlen($root)), '/\\');

  $args = explodeRequestVars($args);
  if ($method == 'POST') {
    $_POST = array_merge($_POST, $args);
  }
  else {
    $_GET = array_merge($_GET, $args);
  }
  $_REQUEST = array_merge($_GET, $_POST, $_COOKIE);

  $request_time = $_SERVER['REQUEST_TIME'];
  $_SERVER = array();
  $_SERVER['COMMAND_LINE'] = $command_line;

  // $_SERVER['SERVER_PROTOCOL'] = 'HTTP/1.1';
  $_SERVER['REQUEST_METHOD'] = 'GET';
  $_SERVER['REQUEST_TIME'] = $request_time;
  $_SERVER['SCRIPT_NAME'] = $script_name;
  $_SERVER['SCRIPT_FILENAME'] = $file;
  $_SERVER['PHP_SELF'] = $script_name;
  $_SERVER['REQUEST_URI'] = $script_name;

  // simulation protocole HTTP
  $_SERVER['HTTP_USER_AGENT'] = 'PHP Command Line Interface';
  $_SERVER['HTTP_ACCEPT'] =
'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
  $_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'fr-fr,fr;q=0.8,en-us;q=0.5,en;q=0.3';
  $_SERVER['HTTP_ACCEPT_CHARSET'] = 'utf-8';
  $_SERVER['REMOTE_ADDR'] = '127.0.0.1';

  // spécifique au vhost
  $_SERVER['SERVER_NAME'] = SERVER_NAME;
  if (!$_SERVER['SERVER_NAME']) {
    $_SERVER['SERVER_NAME'] = 'no.server.name';
  }
  $_SERVER['HTTP_HOST'] = $_SERVER['SERVER_NAME'];
  $_SERVER['SITE_STATUS'] = 'prod';
  $_SERVER['DOCUMENT_ROOT'] = $root;
  $_SERVER['SERVER_ADMIN'] = 'webmaster@localhost';
  $_SERVER['SERVER_PORT'] = 80;
  ini_set('include_path', implode(PATH_SEPARATOR,
array($_SERVER['DOCUMENT_ROOT'])));
  ini_set('upload_tmp_dir', realpath($root.'/../tmp/'));
  ini_set('safe_mode', false);

  // valeurs non significatives
  $_SERVER['SERVER_SIGNATURE'] = 'bash';
  $_SERVER['SERVER_SOFTWARE'] = 'unix';
  $_SERVER['SERVER_ADDR'] = '127.0.0.1';
  $_SERVER['REMOTE_PORT'] = 0;

  chdir(dirname($_SERVER['SCRIPT_FILENAME']));

  $_ENV = array();
}
setSuperGlobals();

//*******************************************
require $_SERVER['SCRIPT_FILENAME'];
//*******************************************

Le wrapper que j'utilise (cli_wrapper.php)
//*****************************************

Petit ajout :
Si j'ai bien compris, spip.php?action=cron n'exécute qu'une seule tâche
planifiée à la fois.
Il vaut donc mieux faire exécuter (via une boucle) plusieurs fois le script,
pour être capable de dépiler rapidement les tâches dans le cas où elles
viendraient à s'empiler.

Le 30/05/2014 10:00, Pierre-Olivier Vares a écrit :

Renaud <ml <at> ascii-fr.com> writes:

en rajoutant cet appel php dans les taches cron :

/usr/bin/php /home/spip/spip.php?action=cron

Je ne sais pas s'il y a certaines versions de php qui le gèrent, mais là,
tel quel, on demande à php d'aller chercher le fichier :
   spip.php?action=cron
Et forcément, il ne le trouve pas !

Bonjour,

Normalement, tel que c'est écrit, on demande à php d'aller chercher
le fichier spip.php avec pour paramètre action=cron.

Par contre, je confirme avoir eu des 404 sur des requêtes de ce
type, sans comprendre pourquoi puisque le fichier spip.php existe.

Bonne journée
Grégoire

--
http://guolang.gites-voyages.com