IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Gérer crontab ROOT via PHP


Sujet :

Langage PHP

  1. #21
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 704
    Points : 43 781
    Points
    43 781
    Par défaut
    crontab est une commande système qu'on appelle normalement depuis un terminal. Si elle n'était pas scriptable (càd utilisable avec des paramètres comme -l, -e, -r), tu ne pourrais pas l'utiliser avec php. Après sur le principe, il est tout à fait possible de modifier directement les fichiers en les ouvrant depuis php via fopen si tu sais ce que tu fais.

    Mais c'est déjà pas top niveau sécurité. Imagines un pirate arrivant à prendre la main sur ton site et pouvant créer une tache cron pour faire des dégâts ....

    Je sais que tu as dis que tu fais des tests sur ta machine, mais si tu le met en prod sur un serveur mutualisé, ça ne marchera pas. Tu pourras créer des tâches cron, mais depuis l'interface d'administration de ton hébergement, tu n'auras pas un accès direct au cron.

  2. #22
    Futur Membre du Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Juin 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Juin 2018
    Messages : 26
    Points : 5
    Points
    5
    Par défaut
    Dans ce cas, comment fonctionnent les autres sites ?
    Comment fonctionnent les rapports de stats que l'on reçoit tous les jours par mail ? Ce n'est pas un admin qui rajoute un cron à la mano...
    Par exemple, dans mon compte, "je choisis de recevoir les récap de mes revenus Adsense" : il y a donc une tâche automatique qui s'enclenche.
    Peut-être pas via cron ? Il y a peut-être une autre manière ?

  3. #23
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 704
    Points : 43 781
    Points
    43 781
    Par défaut
    Si tu es sur un serveur mutualisé, tu as les résultat dans ton interface. Ils peuvent utiliser un produit maison ou du commerce ou faire un cron en admin que tu ne verras donc pas.

    Si tu es sur un serveur dédié, tu as une console ssh et tu fais ce que tu veux sous ta responsabilité, c'est toi qui gères ton serveur comme chez toi. Si tu fais des choses qui provoquent des problèmes tels que spams massifs, saturation de bande passante (à ton insu à cause d'une mauvaise config, ou de ton propre chef), leur outils de monitoring vont bloquer automatiquement ton serveur.

  4. #24
    Futur Membre du Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Juin 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Juin 2018
    Messages : 26
    Points : 5
    Points
    5
    Par défaut
    Ou alors une solution, je fais uniquement un CRON, qui plusieurs fois par heure, va checker quelles sont les URL à checker/curler par site, quelles sont les adresse à jour dans la base... bref c'est très lourd comme process.
    Je trouvais bien plus simple de gérer un cron par site.
    J'ajoute un site : je rajoute un cron
    Je supprimer un site : je supprimer un cron
    Là ce qui est bien, c'est que j'ai plusieurs cron qui se lancent en parallèle, et donc plusieurs listes d'URL qui sont traitées en //
    Avec un seul cron, je devrais boucler sur toutes les URL de ma base à curler, ça serait beaucoup trop long

  5. #25
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 704
    Points : 43 781
    Points
    43 781
    Par défaut
    Avoir trop de cron est pas forcément bon.

    Avec tes éléments dans tes bases, tu devrais pouvoir ressortir la liste des URL à traiter. donc un seul cron devrait suffire. Et ce que tu fais avec curl, tu peux pas le faire en PHP ? Tu aurais comme ça qu'un script PHP plutôt qu'un script lançant un shell pour lancer une commande curl.

    Là ce qui est bien, c'est que j'ai plusieurs cron qui se lancent en parallèle, et donc plusieurs listes d'URL qui sont traitées en //
    Avec un seul cron, je devrais boucler sur toutes les URL de ma base à curler, ça serait beaucoup trop long
    edit :
    L'idée du parallélisme est bonne. Moi ce que je vois comme problème là, c'est d'avoir un cron propre.
    Donc il te faut peut-être une tache cron qui crée un fichier cron propre en temporaire plutôt que d'ajouter une tache cron à la fin de la crontab.
    si ta commande curl fonctionne, c'est pas forcément pertinent de reprendre en PHP, le mieux est l'ennemi du bien.

  6. #26
    Futur Membre du Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Juin 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Juin 2018
    Messages : 26
    Points : 5
    Points
    5
    Par défaut
    Oui bien sûr le curl est en php, mais i faut bien le déclencher, plusieurs fois par jour... et ce pour plusieurs groupes d'URL

  7. #27
    Futur Membre du Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Juin 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Juin 2018
    Messages : 26
    Points : 5
    Points
    5
    Par défaut
    Si par exemple j'ai 100 URL dans ma base à curler tous les 15 minutes, et que je fais qu'une seule tâche cron, les 100 URL ne seront pas toutes curlées que le 15 d'heure sera passé, et donc nouvelle tâche. Il faudrait à minima que je puisse lancer les curl en parallèle.
    Sauf qu'en explorant les URL de la base avec un select, je les traite une par une, et c'est trop long.
    Avec un groupement par URL et donc par cron, je peux paralléliser mes curl.

  8. #28
    Futur Membre du Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Juin 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Juin 2018
    Messages : 26
    Points : 5
    Points
    5
    Par défaut
    Du coup peut-être que mon besoin n'est pas de lancer plusieurs cron, mais d'en lancer qu'un, et de trouver comment paralléliser des CURL alors que j'utilise un "while", donc url par url.
    Apparemment le sujet a déjà été traité dans des forums, je vais investiguer là dessus

  9. #29
    Futur Membre du Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Juin 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Juin 2018
    Messages : 26
    Points : 5
    Points
    5
    Par défaut
    Voici mes pistes de réflexion :

    Solution 1 : pouvoir utiliser un wildcard dans ma tâche cron. Par exemple, celle-ci serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    */15 * * * * /usr/bin/php -f /var/www/xxx/cron/*.php
    Ainsi, une seule cron lancerait obligatoirement mes scripts. Pas besoin de créer une tâche cron par fichier. Chaque fichier ajouté serait donc lancé selon le cron.
    -> J'ai testé, le wildcard n'a pas été accepté : existe t-il un autre moyen ? Regex ?

    Solution 2 : curl_multi_init
    J'ai vu qu'on pouvait lancer plusieurs curls d'un coup. Mais ça ne répond pas tout à fait à mon besoin.
    Le voici :
    Curler plusieurs listes d'URL en même temps (liste n° en même temps que la liste n°2 etc). J'ai trouvé comme meilleur solution de faire ça site par site, dans un fichier séparé. 1 site = 1 fichier = extraction des URL à curler = curl des urls les unes à la suite de l'autre.
    Curl de 10 URL pour le site 1 : une URL après l'autre
    Curl de 8 URL pour le site 2 : une URL après l'autre
    Le curl_multi_init me lancerait tout en même temps, et ça ferait beaucoup trop de requêtes. Il faudrait effectivement lancer en parallèle non pas des curl uniques, mais les curls sur les listes d'URL (tâche 1 = curl 10 url les unes à la suite des autres etc). Je ne sais pas si c'est très clair...

    Je ne vois pas comment utiliser curl_multi_init pour lancer plusieurs "groupes" de CURL en même temps.

  10. #30
    Futur Membre du Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Juin 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Juin 2018
    Messages : 26
    Points : 5
    Points
    5
    Par défaut
    Solution 3:

    Le cron va lancer un fichier PHP, qui lui même va exécuter chaque fichier de mon répertoire avec un foreach
    Ainsi, chaque fichier à faire tourner régulièrement sera ou non présent dans le dossier, et le script php va tous les faire tourner (avec un include par exemple, si ça marche)

  11. #31
    Futur Membre du Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Juin 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Juin 2018
    Messages : 26
    Points : 5
    Points
    5
    Par défaut
    Solution 3
    Mon cron (unique du coup), lance un fichier, qui lui-même lance tous mes scripts. Je souhaite que tous ces scripts soient lancés en //

    $reponse = $bdd->query('SELECT slug_client FROM clients');
    while ($donnees = $reponse->fetch())
    {
    exec("php ".$donnees["slug_client"].".php");
    }
    $reponse->closeCursor();

    Souhait : lancer les exec en même temps, car ils se lancent les uns après les autres (j'y suis presque...)

  12. #32
    Futur Membre du Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Juin 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Juin 2018
    Messages : 26
    Points : 5
    Points
    5
    Par défaut
    Last news, j'en suis à ce code, mais qui malgré la liste, fait exécuter chaque commande l'une après l'autre, et non toutes les commandes en même temps... Je sèche un peu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?php
     
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
     
    // Connexion
     
    $commandes = "";
     
    $reponse = $bdd->query('SELECT slug_client FROM clients');
    while ($donnees = $reponse->fetch())
    {
    		$commandes .= "php  ".$donnees["slug_client"].".php;";
    }
    $reponse->closeCursor();
     
    //echo substr($commandes, 0, -1);
     
    		exec(substr($commandes, 0, -1));
     
    //command1 ; command2     (run both uncondtionally)
    //command1 && command2     (run command2 only if command1 succeeds)
     
    ?>

  13. #33
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 393
    Points : 15 754
    Points
    15 754
    Par défaut
    la dernière fois que j'ai vu un script PHP lancer des tâches asynchrones c'est dans le système de cron de WordPress :
    https://core.trac.wordpress.org/brow.../cron.php#L350
    cela se fait en lançant une requête HTTP asynchrone avec un timeout minimum pour reprendre la main rapidement.

    mais dans votre cas, vous n'avez peut-être pas besoin de faire aussi compliqué. essayez avec un système de queue qui va contenir la liste des URL à tester avec la date de prochain test par exemple :
    https://php.developpez.com/ 20 h 59
    https://www.developpez.com/ 21 h 10
    ensuite dans le crontab, vous lancez le script à chaque minutes et vous cherchez quelle est le prochain test.
    si on reprend l'exemple de 100 sites à tester toutes les 15 minutes, ça veut dire que chaque lancement testera 7 sites à chaque fois.

  14. #34
    Futur Membre du Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Juin 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Juin 2018
    Messages : 26
    Points : 5
    Points
    5
    Par défaut
    J'avoue que je ne connais pas le système de queue.
    Je ferais tout de même un système de cron par site ? Je n'ai pas très bien saisi

  15. #35
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 393
    Points : 15 754
    Points
    15 754
    Par défaut
    la queue serait par exemple une table d'une base de données avec un colonne contenant la date du prochain traitement.
    et le cron lance toute les minutes un script PHP qui va lire ces dates et chercher choisir la prochaine tâche à faire.

  16. #36
    Futur Membre du Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Juin 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Juin 2018
    Messages : 26
    Points : 5
    Points
    5
    Par défaut
    Sinon, vu que exec fonctionne, possible de lancer des exec en simultané ? J'ai vu sur un forum que c'était possible, via les commandes suivantes :
    //command1 ; command2 (run both uncondtionally)
    //command1 && command2 (run command2 only if command1 succeeds)

    Mais ça ne fonctionne pas chez moi

    exec(php script1.php;php script2.php;php script3.php;php script4.php;php script5.php;php script6.php);

  17. #37
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 704
    Points : 43 781
    Points
    43 781
    Par défaut
    exec n'est pas fait pour lancer plusieurs processus. En gros exec va interrompre le script en cours pour exécuter la commande, puis reprend après l'exec.

    Regardes du coté de pcntl_fork();

  18. #38
    Futur Membre du Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Juin 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Juin 2018
    Messages : 26
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    J'ai testé exec(php script1.php & php script2.php & php script3.php & php script4.php);

    Ils se lancent tous en même temps et ça fonctionne si j'exécute le fichier PHP dans mon navigateur.
    Par contre, en exécutant le fichier avec un cron, ça ne fonctionne pas, c'est à n'y rien comprendre.

  19. #39
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 704
    Points : 43 781
    Points
    43 781
    Par défaut
    L'entrée cron ne doit pas être bonne, ou pas sur le bon utilisateur comme déjà évoqué.

  20. #40
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    rm -f cron.txt
    touch  cron.txt
    echo "* * * * * /usr/bin/php -f /home/user_name/chron.php  > /dev/null 2>&1" >> cron.txt
    crontab -u user_name -r
    crontab -u user_name cron.txt
    rm cron.txt
    crontab -u user_name -l

    user_name doit être un user unix

    dans mon exemple comme user_name est un user unix avec un dossier /home/user_name et un fichier dedans "chron.php" ca fonctionne tout seul

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. [AC-2003] Gérer une BDD access via PHP
    Par Domi974 dans le forum Access
    Réponses: 1
    Dernier message: 31/05/2011, 14h02
  2. Gérer les accès à la BD : contrôle via php
    Par amarcil dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 15/04/2008, 21h12
  3. Réponses: 2
    Dernier message: 27/05/2004, 00h40
  4. [ODBC][WINDOWS] gérer une base via ODBC
    Par narmataru dans le forum Windows
    Réponses: 2
    Dernier message: 19/12/2003, 13h36
  5. Transformation xml + xsl -> HTML via PHP
    Par petit-ourson dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 19/10/2003, 22h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo