OVH Community, votre nouvel espace communautaire.

Tache cron correctement exécutée mais erreur dans le log


Jikoo
14/01/2016, 16h29
Ok Jean-Michel !

jmgrange
13/01/2016, 08h48
A la racine de mon hébergement j'ai un fichier ovhconfig, c'est le fichier standard d'origine. A la racine de l'hébergement je n'ai pas de fichier htacces mais un dans chaque répertoire accessible via internet www, et autres domaines et sous domaines..
Je rouvre mon ticket incident et vous tiendrai au courant de la suite.
Cordialement
Jean-Michel Grange

Jikoo
12/01/2016, 22h58
Hello jmgrange,
Si vous avez testé mon petit script sans le modifier, et que le cronjob s'éxecute bien mais retourne des erreurs , c'est qu'il y a peut être un problème sur votre cluster.
Ca me rappelle ce post:
(22)Invalid argument: Cannot fix environment variables for container, continue anyway.
https://forum.ovh.com/showthread.php...-for-container


1) Vérifiez votre config concernant les crons, dans le manager
2) Vérifiez vos fichiers .htaccess et .ovhconfig
et si tout va bien de ce côté alors:
3) Ouvrez un ticket (déclarer un ticket incident chez OVH).

Rappel du script:
Code PHP:

/* Cron Test */

$file 'log.txt';

if(isset(
$_SERVER['REMOTE_ADDR'])){
    
$mode 'Manuel';
} else {
    
$mode 'CRON';
}

$line date('Y-m-d H:i:s').' '.$mode."\n";

file_put_contents($file,$line,FILE_APPEND);

?>

jmgrange
12/01/2016, 07h45
J'ai installé le script donné en exemple par Jikoo et je l'ai fait exécuté 4 fois hier soir.
Résultat : error reading the headers à chaque exécution et 2 fois le warning cannot fix environnement variable. Dans le log du cron à chauqe fois exit code 0.

[Mon Jan 11 19:38:01 2016] [error] [client 10.0.55.31] [host nicogholwp.cluster011.ovh.net] request failed: error reading the headers
[Mon Jan 11 19:38:02 2016] [warn] [client 127.0.0.1] [host nicogholwp.cluster011.ovh.net] (22)Invalid argument: Cannot fix environment variables for container, continue anyway.
[Mon Jan 11 20:38:01 2016] [error] [client 10.0.55.31] [host nicogholwp.cluster011.ovh.net] request failed: error reading the headers
[Mon Jan 11 21:54:02 2016] [error] [client 10.0.55.31] [host nicogholwp.cluster011.ovh.net] request failed: error reading the headers
[Mon Jan 11 22:54:02 2016] [error] [client 10.0.55.31] [host nicogholwp.cluster011.ovh.net] request failed: error reading the headers
[Mon Jan 11 22:54:03 2016] [warn] [client 127.0.0.1] [host nicogholwp.cluster011.ovh.net] (22)Invalid argument: Cannot fix environment variables for container, continue anyway.

Jikoo
11/01/2016, 18h35
Citation Envoyé par Abazada
Ce n'est pas 100% vrai
Ok chef, je m'incline !
http://stackoverflow.com/questions/1...php-cli-script
Cependant, la doc n'est pas très explicite: http://php.net/manual/fr/reserved.variables.server.php concernant les résultats avec un script PHP CLI !!!

Merci pour l'info.

jmgrange
11/01/2016, 07h55
On progresse.
A l'exécution de cette nuit, le warning "(22)Invalid argument: Cannot fix environment variables for container, continue anyway." a disparu. Parfait. (Peut-être avais je fait une erreur dans mon FTP samedi lors de la mise à jour)
Mais l'erreur request failed: error reading the headers est toujours présente dans mon log error
Cordialement
Jean-Michel Grange

Abazada
11/01/2016, 06h09
Petite parenthèse :

Citation Envoyé par Jikoo
Je le répète: $_SERVER, $_GET, $_POST... ne fonctionnent pas dans l'environnement CRON (PHP CLI).
Ce n'est pas 100% vrai , (mais vrai pour $_GET et $_POST en ce qui concerne cette discussion)

Code:
$ php -r 'echo $_SERVER["HOME"];'
/homez.514/tartempion

Jikoo
10/01/2016, 19h29
Citation Envoyé par jmgrange
Pour moi il n'y a pas de superglobales dans le code. Je en trouve rien qui commence par $_
Cordialement
Jean-Michel Grange
Merci pour le code.
Avez vous fait un grep sur tous les fichiers rattachés au cron pour voir s'il y a une superglobale ?
En d'autres termes, êtes vous bien sûr qu'il n'a pas de superglobale dans vos includes (config.php, cls_video.php, video_1.php, msglist' . $this->langaff . '.php')?

A part ça, avez vous testez mon petit script tout simple?
https://forum.ovh.com/showthread.php...540#post619540
Avec ce script il ne doit y avoir aucune erreur renvoyée.
Cela permet de vous assurer que ce n'est pas un problème du côté d'OVH (ce qui pourrait être possible ^^)

jmgrange
10/01/2016, 16h43
Ci dessous le code de trtvideos.php la tâche Cron
$pathdir = dirname(__FILE__);
if( substr($pathdir, -1) !== "/" )
$pathdir .= "/";
$brline = "\n";
require $pathdir . "config.php";
require $pathdir . $pathtoclass . 'cls_video.php';
echo 'Début ' . $pathdir . $brline;
$m_video = new cls_videos(NULL, 1, 1, 'init', $pathdir);
include $pathdir . $pathtoroot.'video_1.php';
$datej = new DateTime('now');
$datej->modify('-1 month');
$datep = $datej->format('Ymd');
$icam = 3;
while( $icam > 0 ) {
unset($m_video);
$dir = $pathdir . "webcam/CAM" . $icam;
$directory = new DirectoryIterator($dir);
$dir = $directory->getPath();
foreach ($directory as $fileinfo) {
if ($fileinfo->isDir()) {
$dirname = $fileinfo->getFileName();
if( strlen($dirname) === 8 ) {
echo "webcam/CAM" . $icam . "/" . $dirname . $brline;
if( $dirname < $datep ) {
deleteDir($fileinfo->getPathname());
echo "Delete webcam/CAM" . $icam . "/" . $dirname . $brline;
}
}
}
}
$m_video = new cls_videos(NULL, 1, 1, 'init', $pathdir);
$m_video->init($icam);
foreach( $m_video->video->dates as $date ) {
$dir = $pathdir . "webcam/CAM" . $icam . "/" . $date;
if( !is_dir($dir) ) {
mkdir($dir);
echo "Create webcam/CAM" . $icam . "/" . $date . $brline;
}
}
echo "Copy webcam/CAM" . $icam . $brline;
$nbfile = 0;
foreach( $m_video->video->files as $file ) {
$dateimg = substr($file, 0, 8 );
if ( is_file($pathdir . "webcam/CAM" . $icam . "/" . $dateimg . "/" . $file) ) {
unlink($pathdir . "webcam/CAM" . $icam . "/" . $file );
} else {
rename($pathdir . "webcam/CAM" . $icam . "/" . $file, $pathdir . "webcam/CAM" . $icam . "/" . $dateimg . "/" . $file );
$nbfile++;
}
}
$now = new DateTime();
echo $now->format('Y-m-d H:i:s') . " Copy webcam/CAM" . $icam . " nb images " . $nbfile . $brline;
$icam--;
}
function deleteDir($dirPath) {
if (! is_dir($dirPath)) {
throw new InvalidArgumentException("$dirPath must be a directory");
}
if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
$dirPath .= '/';
}
$files = glob($dirPath . '*', GLOB_MARK);
foreach ($files as $file) {
if (is_dir($file)) {
deleteDir($file);
} else {
unlink($file);
}
}
rmdir($dirPath);
}
?>
ci dessous le code de la class cls_videos
class cls_video {
public $date;
public $path;
public $dates;
public $files;
function __construct()
{
$this->date = '20010101';
$this->path = '';
$this->dates = array();
$this->files = array();
}
}
class cls_videos {
private $langaff;
private $id;
private $lstmode;
public $timevideo;
public $affmode;
public $basepath;
public $video;
public $msgAno;
private $msg;
function __construct($db, $lang, $user, $mode, $path = '') {
/* $this->connect_db(); */
$this->id = $user;
$this->timevideo = new DateTime('2001-01-01 00:00:00');
$this->basepath = $path;
$this->video = new cls_video();
$this->msgAno = '';
$this->lstmode = $mode;
$this->msg = array(1 => '',2 => '',3 => '',4 => '',5 => '',6 => '',7 => '',8 => '');
if( !is_null($db) ) {
$this->setLang($lang);
$this->setMode($db);
}
}
function setLang($lang) {
$this->langaff = $lang;
require $this->basepath.'config.php';
require $this->basepath.$pathtoclass.'msglist'.$this->langaff.'.php';
}
function getLang() {
return $this->langaff;
}
function setMode($db)
{
$sql = sprintf("select fm.typefonction, fl.libcourt, fl.libelle from fonctionmaj as fm
inner join fonctionmajlibelle as fl on fm.idfonction = fl.idfonction_fk
where fm.typefonction = '%s' and fl.idlang_fk = %s",$this->lstmode, $this->langaff);
foreach ($db->query($sql) as $row) {
$this->affmode = $row["libelle"];
}
}
function init($icam, $date = '') {
$dir = $this->basepath."webcam/CAM" . $icam;
$this->timevideo = new DateTime('now');
unset($this->video);
$this->video = new cls_video();
$this->video->date = $date;
$this->video->path = $dir;
$directory = new DirectoryIterator($dir);
$dir = $directory->getPath();
$cdateimg = '';
if( $date === '' ) {
foreach ($directory as $fileinfo) {
if ($fileinfo->isFile()) {
$filename = $fileinfo->getFileName();
if (strpos($filename, '.jpg') !== false )
array_push( $this->video->files, $filename );
}
}
sort($this->video->files);
foreach( $this->video->files as $filename ) {
$dateimg = substr($filename, 0, 8 );
if( $dateimg !== $cdateimg ) {
$cdateimg = $dateimg;
array_push( $this->video->dates, $cdateimg );
}
if( $date === '' ) {
$date = $cdateimg;
$this->video->date = $date;
}
}
} else {
foreach ($directory as $fileinfo) {
if ($fileinfo->isFile()) {
$filename = $fileinfo->getFileName();
if (strpos($filename, '.jpg') !== false ) {
$dateimg = substr($filename, 0, 8 );
if( $dateimg == $date ) {
if( $dateimg !== $cdateimg ) {
$cdateimg = $dateimg;
array_push( $this->video->dates, $cdateimg );
}
array_push( $this->video->files, $filename );
}
}
}
}
sort($this->video->files);
}
}
function initimg($icam, $date = '') {
$dir = $this->basepath."webcam/CAM" . $icam;
if( strlen($date) === 8 ) {
$dir .= "/" . $date;
} else {
unset($this->video);
$this->video = new cls_video();
}
$this->timevideo = new DateTime('now');
$this->video->date = $date;
$directory = new DirectoryIterator($dir);
$dir = $directory->getPath();
$cdateimg = '';
if( $date === '' ) {
foreach ($directory as $fileinfo) {
if ($fileinfo->isDir()) {
$filename = $fileinfo->getFileName();
if( strlen($filename) === 8 ) {
array_push( $this->video->dates, $filename );
}
}
}
if( count($this->video->dates) > 0 ) {
sort($this->video->dates);
$this->video->date = $this->video->dates[0];
$dir = $this->basepath."webcam/CAM" . $icam;
$dir .= "/" . $this->video->date;
$this->video->path = $dir;
$directory = new DirectoryIterator($dir);
foreach ($directory as $fileinfo) {
if ($fileinfo->isFile()) {
$filename = $fileinfo->getFileName();
if (strpos($filename, '.jpg') !== false ) {
array_push( $this->video->files, $filename );
}
}
}
}
sort($this->video->files);
} else {
$this->video->path = $dir;
unset($this->video->files);
$this->video->files = array();
foreach ($directory as $fileinfo) {
if ($fileinfo->isFile()) {
$filename = $fileinfo->getFileName();
if (strpos($filename, '.jpg') !== false ) {
$dateimg = substr($filename, 0, 8 );
if( $dateimg == $date ) {
array_push( $this->video->files, $filename );
}
}
}
}
sort($this->video->files);
}
}
function purge($icam, $date = '') {
$dir = $this->basepath."webcam/CAM" . $icam;
$directory = new DirectoryIterator($dir);
$dir = $directory->getPath();
foreach ($directory as $fileinfo) {
if ($fileinfo->isFile()) {
$filename = $fileinfo->getFileName();
$dateimg = substr($filename, 0, 8 );
if( $dateimg == $date )
unlink( $fileinfo->getPathName() );
}
}
$this->init($icam);
}
/* function get_submenu($id_level,$curlibel) {
$idtab = '';
$idtabl = '';
$laff = 25;
$lmax = 45;
$lcourt = 0;
$upper = 0; ?>

function get_video($mode, $date, $idcam = 1, $idimg = 0, $inc = 1) {
if( $date !== '' ) {
if( $this->video->date !== $date ) {
$this->init($idcam, $date);
}
}
$suiimg = $idimg + $inc;
if( $idimg > count($this->video->files) ) {
$idimg = 0;
$suiimg = 0;
}
if( $idimg < 0 ) {
$idimg = 0;
$suiimg = 0;
}
?>



if( count($this->video->files) === 0 ) {
?>

Pas d'images pour cette caméra


} else {
?>

}
?>

if( $mode === 'camview' ) {
?>


$idate = 0;
foreach( $this->video->dates as $date ) {
$idate++;
?>
>
}
?>


>
>
>









}
}
} ?>

Pour moi il n'y a pas de superglobales dans le code. Je en trouve rien qui commence par $_
Cordialement
Jean-Michel Grange

Jikoo
10/01/2016, 16h17
"Cannot fix environment variables for container"
Utilisez vous toujours la superglobale $_SERVER ?
Je le répète: $_SERVER, $_GET, $_POST... ne fonctionnent pas dans l'environnement CRON (PHP CLI).
http://php.net/manual/fr/language.va...perglobals.php

jmgrange
10/01/2016, 14h57
Je viens de vérifier mon exécution de cette nuit après modification de mon code.
J'ai toujours les 2 mêmes erreurs
A l'exécution tout fonctionner bien juste une petite différence
Mon chemin qui était /homez.551/nicogholwp/gestcloture/ est devenu /home/nicogholwp/gestcloture/ mais le résultat de la tâche est le même.

Mon log error
request failed: error reading the headers
(22)Invalid argument: Cannot fix environment variables for container, continue anyway.

jmgrange
09/01/2016, 19h37
Merci pour l'info. Je modifie mon code.
Je vais lire attentivment vos différents posts sur le sujet.

Jikoo
09/01/2016, 18h09
Hello,
Vous avez la réponse dans le warning "Cannot fix environment variables for container''.
$_SERVER['PHP_SELF'] est une constante qui n'est pas viable en PHP CLI. Bref, ça ne fonctionne pas dans l'environnement CRON. Il ne faut donc pas l'utiliser.

Mes posts concernant les tâches CRON:
https://forum.ovh.com/showthread.php...514#post644514
https://forum.ovh.com/showthread.php...540#post619540

jmgrange
09/01/2016, 13h42
Bonjour,
J'ai créé une tâche cron en php qui s’exécute tous les jours pour purger des fichiers et réorganiser des répertoires. Cette tâche s'exécute sans problème j'ai un exit 0 dans le log du cron.
J'écris des traces dans le log avec la fonction echo et tout est OK.
[2016-01-09 01:57:02] ## OVH ## START - 2016-01-09 01:57:02.866549 executing: /usr/local/php5.4/bin/php /homez.551/n.......wp/gxxxxxxe/trtvideos.php
[2016-01-09 01:57:02] Début /homez.551/n........wp/gxxxxxxxxe/
....
[2016-01-09 01:57:02]
[2016-01-09 01:57:02] ## OVH ## END - 2016-01-09 01:57:18.398221 exitcode: 0
(J'ai masqué les identifiants)

Par contre quand le regarde dans le log des erreurs j'ai une erreur
request failed: error reading the headers
et un warning
(22)Invalid argument: Cannot fix environment variables for container, continue anyway.

Mon code commence comme ci dessous
#!/usr/local/php5.4/bin/php
$pathdir = $_SERVER['PHP_SELF'];
$pathdir = dirname($pathdir);
$brline = "
";
if( $pathdir === "/" )
$pathdir = '';
else {
if( substr($pathdir, -1) !== "/" )
$pathdir .= "/";
$brline = "\n";
}
require $pathdir . "config.php";
require $pathdir . $pathtoclass . 'cls_video.php';
echo 'Début ' . $pathdir . $brline;
.....

En cherchant sur internet ou les forums je ne trouve rien qui ne me donne une piste.
Quelqu'un a-t-il une piste ou un exemple simple de cron sans erreur ou warning.
Cordialement
Jean-Michel Grange