Anomalie #1384
ferméproblèmes de lancement de cron/reminder.php en ligne de commande
100%
Description
Bonjour,
je fais partie d'une association qui utilise Galette depuis plusieurs années, en étant hébergé chez Tuxfamily.
De mémoire je n'ai jamais vu la fonction de rappel automatique des échéances de cotisation fonctionner. Comme je viens de faire une mise à jour vers la 0.9.3, je me suis dit que c'était le moment de regarder comment faire fonctionner tout ça.
Dans la documentation de galette, l'activation de la fonction fait référence à la mise en place d'une tâche cron, ce qui est un premier point bloquant : notre hébergeur utilise une autre méthode que passer par une crontab : les cron jobs (https://faq.tuxfamily.org/Cron/Fr)
Donc avant de soumettre une demande de cron job, que j'envisage de faire sous forme de script bash, je tente, dans une session en ssh, l'exécution de la commande donnée dans la doc de galette.
Or j'obtiens des messages d'erreur :
- si je tente la commande en entrant le chemin absolu, dans mon cas : /usr/bin/php -f /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php
j'obtiens :
PHP Warning: require_once(../includes/galette.inc.php): failed to open stream: No such file or directory in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 44 PHP Fatal error: require_once(): Failed opening required '../includes/galette.inc.php' (include_path='.:/usr/share/php') in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 44
- si je me place dans le répertoire cron et que je lance :
/usr/bin/php -f reminder.php
j'obtiens :
PHP Notice: Undefined variable: login in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php on line 257 PHP Fatal error: Uncaught Error: Call to a member function logCron() on null in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php:257 Stack trace: #0 /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php(44): require_once() #1 {main} thrown in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php on line 257
Est-ce un bug ?
Est-ce que je n'utilise pas la bonne méthode ?
Existe-t-il un moyen de contourner cela ?
Merci d'avance pour toute aide.
Mis à jour par Johan Cwiklinski il y a presque 5 ans
- Catégorie mis à Core
- Assigné à mis à Johan Cwiklinski
- Version cible mis à 0.9.3.1
Matthieu Coudert a écrit :
Dans la documentation de galette, l'activation de la fonction fait référence à la mise en place d'une tâche cron, ce qui est un premier point bloquant : notre hébergeur utilise une autre méthode que passer par une crontab : les cron jobs (https://faq.tuxfamily.org/Cron/Fr)
L'appellation « tâche cron » est à prendre dans un sens générique ; il s'agit "juste" d'un script qui peut être exécuté en ligne de commande, et par extension depuis n'importe quel système qui comme celui de TF (le comportement est le même que cron : s'il y a une sortie, la tâche est en échec, le script respecte cette logique).
Donc avant de soumettre une demande de cron job, que j'envisage de faire sous forme de script bash, je tente, dans une session en ssh, l'exécution de la commande donnée dans la doc de galette.
Or j'obtiens des messages d'erreur :
- si je tente la commande en entrant le chemin absolu, dans mon cas : /usr/bin/php -f /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php
j'obtiens :
PHP Warning: require_once(../includes/galette.inc.php): failed to open stream: No such file or directory in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 44
PHP Fatal error: require_once(): Failed opening required '../includes/galette.inc.php' (include_path='.:/usr/share/php') in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 44
OK, il faudrait que je corrige le chemin vers ce fichier.
- si je me place dans le répertoire cron et que je lance : /usr/bin/php -f reminder.php
j'obtiens :
PHP Notice: Undefined variable: login in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php on line 257
PHP Fatal error: Uncaught Error: Call to a member function logCron() on null in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php:257
Stack trace:
#0 /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php(44): require_once()
#1 {main}
thrown in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php on line 257Est-ce un bug ?
Est-ce que je n'utilise pas la bonne méthode ?
Existe-t-il un moyen de contourner cela ?
C'est un bug, oui ; je vais regarder. Sinon, oui, ce sont les bonnes méthodes (la première aussi est un bug).
Mis à jour par Johan Cwiklinski il y a presque 5 ans
- Statut changé de Nouveau à In Progress
Voici le correctif à appliquer : https://github.com/galette/galette/pull/44/commits/414b8541807719e7c75e2649043dbad158c4dad4
J'ai également lancé l'appel de ce script dans les tests ; je ne peux pas tester l'envoi en lui-même ; mais ça évitera au moins ce genre de désagréments ;)
Mis à jour par Matthieu Coudert il y a presque 5 ans
Bonjour,
la correction sur le chemin de fichier a bien fonctionné, maintenant les deux méthodes renvoient la même erreur :
PHP Notice: Undefined variable: container in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php on line 257
PHP Fatal error: Uncaught Error: Call to a member function get() on null in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php:257
Stack trace:
#0 /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php(44): require_once()
#1 {main}
thrown in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php on line 257
Merci aussi pour la précision sur les cron jobs (en lisant mieux la doc de tuxfamily je comprend qu'il s'agit juste de la restriction de cron pour ne proposer que la possibilité d'exécuter des fichiers).
Mis à jour par Johan Cwiklinski il y a presque 5 ans
En effet, voilà un second correctif :
https://github.com/galette/galette/pull/44/commits/7695512980402f0d469dc6ca61ad8d15807599e3
Mis à jour par Matthieu Coudert il y a presque 5 ans
Ça ne fonctionne pas encore :
PHP Notice: Undefined variable: container in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php on line 257 PHP Fatal error: Uncaught Error: Call to a member function get() on null in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php:257 Stack trace: #0 /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php(44): require_once() #1 {main} thrown in /home/gullarverne/galette.linuxarverne.org-web/htdocs/includes/galette.inc.php on line 257
Mis à jour par Johan Cwiklinski il y a presque 5 ans
La ligne qui inclut le fichier dependencies.php est elle bien présente ?
Je ne reproduit pas du tout ; je penche pour un match non appliqué. Le mieux, c'est de récupérer le fichier complet ici https://raw.githubusercontent.com/galette/galette/7695512980402f0d469dc6ca61ad8d15807599e3/galette/cron/reminder.php
Mis à jour par Matthieu Coudert il y a presque 5 ans
le problème n'a pas l'air de se trouver dans ce fichier, car même avec le fichier donné en lien, le même message d'erreur persiste.
Mis à jour par Johan Cwiklinski il y a presque 5 ans
Vérifie que tu as bien appliqué les deux patchs dans leur intégralité, et qu'il n'y a pas d'erreur de syntaxe dans les fichiers modifiés, ces erreurs sont fréquentes lors de modifications à la main de fichiers.
Mis à jour par Matthieu Coudert il y a presque 5 ans
J'ai vérifié, je ne vois pas quelle erreur dans les copier-coller j'aurai pu faire.
Est-il possible de me donner les liens vers les fichiers complets includes/dependencies.php includes/main.inc.php et includes/galette.inc.php comme ça a été fait avec cron/reminder.php pour être sûr ?
Mis à jour par Johan Cwiklinski il y a presque 5 ans
Les fichiers sont tous sur cette branche :
https://github.com/galette/galette/tree/hotfix/0.9.3.1/galette
Puis tu vas sur le fichier voulu, et tu utilises le bouton "raw" Pour avoir le code source.
Mis à jour par Matthieu Coudert il y a presque 5 ans
Après avoir remplacé les quatre fichiers par ceux de la branche ça avait changé de message :
localhost - 2020-01-26 20:14:44 - 4 - Lang fr_FR does not exist, switching to default. PHP Notice: Undefined index: fr_FR in /home/gullarverne/galette.linuxarverne.org-web/htdocs/lib/Galette/Core/I18n.php on line 151
mais c'était une erreur due au fait que les versions GALETTE_VERSION et GALETTE_DB_VERSION étaient différents, et rendaient l'accès à notre galette impossible.
En remettant les versions respectivement à v0.9.3 et 0.930 le message de mon commentaire #6 contenant "Undefined variable: container" revient à l'identique.
Mis à jour par Johan Cwiklinski il y a presque 5 ans
Ha OK ! En effet, la vérification de la version n'est pas effectuée correctement, et le script ne renvoie rien dans ce cas là (entre autres)...
J'en suis rendu de mon côté à des problèmes de requêtes SQL (instance sous PostgreSQL) pour le moment :/
Dans le fichier galette.inc.php
, les lignes suivantes sont à déplacer :
if ($cron) { $container->get('login')->logCron(basename($argv[0], '.php')); }
Il faut les remettre dans cron/reminder.php
avant le if (!$container->get('login')->isCron())
.
Mis à jour par Matthieu Coudert il y a presque 5 ans
Avec la modification, c'est toujours en erreur, mais avec un message différent (toutefois les premières lignes sont celles de mon commentaire #12) :
localhost - 2020-01-27 07:44:44 - 4 - Lang fr_FR does not exist, switching to default. PHP Notice: Undefined index: fr_FR in /home/gullarverne/galette.linuxarverne.org-web/htdocs/lib/Galette/Core/I18n.php on line 151 PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function Galette\Repository\Reminders::__construct(), 0 passed in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 68 and exactly 1 expected in /home/gullarverne/galette.linuxarverne.org-web/htdocs/lib/Galette/Repository/Reminders.php:73 Stack trace: #0 /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php(68): Galette\Repository\Reminders->__construct() #1 {main} thrown in /home/gullarverne/galette.linuxarverne.org-web/htdocs/lib/Galette/Repository/Reminders.php on line 73
Mis à jour par Johan Cwiklinski il y a presque 5 ans
Matthieu Coudert a écrit :
Avec la modification, c'est toujours en erreur, mais avec un message différent (toutefois les premières lignes sont celles de mon commentaire #12) :
[...]
En effet, j'avais corrigé cette erreur fatale en local :
diff --git a/galette/lib/Galette/Repository/Reminders.php b/galette/lib/Galette/Repository/Reminders.php
index 4024c092..20cda164 100644
--- a/galette/lib/Galette/Repository/Reminders.php
+++ b/galette/lib/Galette/Repository/Reminders.php
@@ -70,7 +70,7 @@ class Reminders
*
* @param array $selected Selected types for sending
*/
- public function __construct($selected)
+ public function __construct($selected = null)
{
if (isset($selected) && is_array($selected)) {
$this->selected = array_map('intval', $selected);
Mis à jour par Matthieu Coudert il y a presque 5 ans
Nouvelle erreur :
localhost - 2020-01-27 13:00:53 - 4 - Lang fr_FR does not exist, switching to default. PHP Notice: Undefined index: fr_FR in /home/gullarverne/galette.linuxarverne.org-web/htdocs/lib/Galette/Core/I18n.php on line 151 PHP Fatal error: Uncaught Slim\Exception\ContainerValueNotFoundException: Identifier "hist" is not defined. in /home/gullarverne/galette.linuxarverne.org-web/htdocs/vendor/slim/slim/Slim/Container.php:105 Stack trace: #0 /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php(75): Slim\Container->get('hist') #1 {main} thrown in /home/gullarverne/galette.linuxarverne.org-web/htdocs/vendor/slim/slim/Slim/Container.php on line 105
Mis à jour par Johan Cwiklinski il y a presque 5 ans
Un autre correctif :
https://github.com/galette/galette/commit/b404c7b9aba9905bd8cdfc4f98bf7cd94cf14e12
Le correctif en commentaire 15 est inclus.
Je n'ai pas encore trouvé pour la notice (mais ce ne devrait pas être bloquant).
Mis à jour par Johan Cwiklinski il y a presque 5 ans
Je n'ai pas d'environnement de test en mesure d'envoyer des courriels (j'ai même du ajouter une notion de timeout pour ne pas glander 5 minutes à chaque test :D) ; et sur le branche hotfix/0.9.3.1, l'envoi des reminders semble fonctionner en ligne de commande (PHP 7.3, comme chez TF).
Mis à jour par Johan Cwiklinski il y a presque 5 ans
Quant à au problème « Undefined index: fr_FR » ; je ne comprends pas trop qui se passe, et je ne l'ai pas en local. Mais j'ai aussi d'autres correctifs (tout ceux de la branche hotfix/0.9.3.1).
Pas de soucis sur la version web (il faut certainement passer en mode debug et consulter les logs pour en être sûr) ?
Mis à jour par Matthieu Coudert il y a presque 5 ans
On en voit la fin !
Ça affichait encore des messages d'erreur :
PHP Notice: Undefined variable: error_detected in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 90 PHP Warning: count(): Parameter must be an array or an object that implements Countable in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 90 PHP Notice: Undefined variable: error_detected in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 107 PHP Warning: count(): Parameter must be an array or an object that implements Countable in /home/gullarverne/galette.linuxarverne.org-web/htdocs/cron/reminder.php on line 107
J'ai tenté un ajout :
$error_detected = array();
à la ligne 76 de cron/reminder.phpJe viens de recevoir un mail "Votre adhésion arrive à terme" sur l'adhérent fictif que j'avais créé pour tester, donc ça a fonctionné \o/
Reste à voir pourquoi cette variable n'était pas définie.
Est-ce que la notice « Undefined index: fr_FR » est considérée comme une erreur par les cron jobs de tuxfamilly ? Si oui, dois-je rediriger vers /dev/null pour ne pas recevoir de mail à chaque exécution ?
Mis à jour par Johan Cwiklinski il y a presque 5 ans
Matthieu Coudert a écrit :
On en voit la fin !
Oui :D
Ça affichait encore des messages d'erreur :
[...]
J'ai tenté un ajout : [...] à la ligne 76 de cron/reminder.php
Bien vu.
Je viens de recevoir un mail "Votre adhésion arrive à terme" sur l'adhérent fictif que j'avais créé pour tester, donc ça a fonctionné \o/
Reste à voir pourquoi cette variable n'était pas définie.
Elles l'étaient dans une version précédente ; ça a été supprimé, mais pas remis d'équerre à cet endroit :/
Est-ce que la notice « Undefined index: fr_FR » est considérée comme une erreur par les cron jobs de tuxfamilly ? Si oui, dois-je rediriger vers /dev/null pour ne pas recevoir de mail à chaque exécution ?
Toute sortie du script cron enverra un mail. Pour contrer ce problème, oui, rediriger la sortie standdard sur /dev/null sera une solution. Le risque, c'est de louper de vraies qui seraient affichées en sortie standard (et non comme elles le devraient en sortie erreur) ; ça peut malheureusement arriver (j'en ai corrigé 2 pour le script des reminders :D).
Aurais-tu la possibilité de mener quelques tests sur cette notice ? Il faudrait voir si tu as ce problème en ayant configuré Galette et l'adhérent en anglais et en français ? (genre galette fr, adh : fr => KO - galette en, adh fr => OK, ...).
Je suppose que les fichiers de langue sont bien présents, et que ton interface est bien traduite lorsque tu changes ? Est-ce que tu peux vérifier que les droits semblent cohérents sur ces derniers.
Mis à jour par Johan Cwiklinski il y a presque 5 ans
- Statut changé de In Progress à Résolu
- % réalisé changé de 0 à 100
Appliqué par commit 414b8541807719e7c75e2649043dbad158c4dad4.