Programmer des scripts sans utiliser CRON

je sais qu'il y a beaucoup de messages sur L'utilisation de CRON pour exécuter un fichier php. Mais, dans le monde de l'hébergement mutualisé, et la facilité d'installation pour un utilisateur, je ne veux pas avoir à jouer avec.

j'ai trouvé une autre solution en ligne qui concerne les sockets. Je voulais juste que tout le monde s'en occupe, et me dire si c'est une bonne ou une mauvaise idée. Sonne comme il fonctionne bien.

?

//Open socket connection to cron.php
$socketcon = fsockopen($_SERVER['HTTP_HOST'],80,$errorno,$errorstr,10);
if($socketcon) {
$socketdata = "GET /cron.php HTTP 1.1rnHost: ".$_SERVER['HTTP_HOST']."rnConnection: Closernrn";
fwrite($socketcon,$socketdata);
//Normally you would get all the data back with fgets and wait until $socketcon reaches feof.
//In this case, we just do this:
fclose($socketcon);
} else {
//something went wrong. Put your error handler here.
}

cron.php:

//This script does all the work.
sleep(200);
//To prove that this works we will create an empty file here, after the sleep is done.
//Make sure that the webserver can write in the directory you're testing this file in.
$handle = fopen('test.txt','w');
fclose($handle);

a trouvé le script d'un billet de blog: http://syn.ac/tech/13/creating-php-cronjobs-without-cron-and-php-cli /

14
demandé sur Nic Hubbard 2010-01-27 03:31:11

7 réponses

ce n'est pas une mauvaise méthode, mais vous devez vous assurer qu'en fermant la prise, il ne suffit pas de terminer le script avant qu'il ne soit terminé. Vous pouvez régler les sockets à non-blocage.

j'ai toujours utiliser un cron job, même si c'est un peu de douleur.

3
répondu Xorlev 2010-01-27 00:41:32

un travail cron est essentiellement un travail cron. vous l'avez installé, et L'OS gère le travail pour vous. Je ne suis pas sûr comment le script PHP que vous avez obtenu du site fonctionne, mais s'il nécessite une intervention humaine, alors il n'est pas vraiment appelé un travail cron. Si vous ne souhaitez pas utiliser cron, vous pouvez utiliser une boucle, puis utilisez les fonctions de date de PHP pour définir une date et une heure. Pseudo-code

while (1) {
    $d=date("d");
    if ( $d == "01" ){
        //run every 1st of month
        //code to run here
    }
}
4
répondu ghostdog74 2010-01-27 00:42:48

cela produit un effet différent du cron.

un travail cron s'exécute à certaines heures que vous avez programmées à l'avance.

votre méthode est essentiellement une sorte de" fourche "ou" appel asynchrone " à un script PHP. Faire cela via HTTP comme vous le faites ici est une technique facile et bon marché. J'utilise moi-même. Il est différent de cron en ce qu'il lance le "processus de fond" immédiatement.

quelques commentaires, cependant:

  1. tout d'abord, vous devez appeler ignore_user_abort() dans le script" background". Sinon, dans de nombreux environnements, votre script sera interrompu lorsque le script" calling " ferme la socket.

  2. Deuxièmement, vous pouvez effectivement vérifier la variable $_SERVER['HOST'] dans le script "background", et de cette façon vous pouvez avoir des scripts qui ne sont pas exposés à l'internet (essentiellement des requêtes de localhost et vérifiez cela dans le script d'arrière-plan). Vous pouvez alors probablement faire confiance aux requêtes venant de votre propre machine, et sauter toutes les vérifications de sécurité, sessions, et ainsi de suite.

  3. Troisièmement, qui dit que le script" background " doit être exécuté avec PHP? PHP a beaucoup de faiblesses si vous allez l'utiliser comme un "arrière-plan". La principale faiblesse est qu'il bloque sur I/O. donc, si vous allez envoyer des e-mails, mettre à jour les lignes de base de données, ou quoi qu'il en soit, vous interrompez votre script à chaque fois que vous envoyez une demande. Alors qu'avec un Nœud.js, par exemple, vous pouvez désactiver les commandes D'entrée/sortie de façon asynchrone et continuer. Si vous allez utiliser PHP, au moins assurez-vous d'envoyer 10 emails à la fois, ou mettre à jour 10 lignes à la fois, ou quelque chose.

  4. enfin, vous pourriez vouloir afficher une barre de progression sur le navigateur si un script d'arrière-plan fait quelque chose. Donc vous allez avoir besoin d'utiliser un commun banque de données (base de données) pour enregistrer la progression de la tâche.

2
répondu Gregory Magarshak 2012-07-28 16:28:14

d'après ce que j'ai compris en lisant ce billet de blog et en regardant le code, ce n'est pas vraiment un moyen de ne pas avoir accès à cron, c'est un moyen d'éviter que quelqu'un n'attende que le serveur réponde à une longue requête. Si vous devez absolument avoir un certain script exécuté dire toutes les 10 minutes, alors vous aurez besoin d'utiliser cron . Si vous voulez juste éviter que les utilisateurs attendent une longue requête pour finir alors ce hack pourrait fonctionner. Même avec cette méthode, je pense toujours que vous allez frapper limites de temps si votre script prend plus de temps que ce que PHP permet de terminer.

Review wp-cron.php (mentionné dans le lien du blog), il semble qu'il s'appuie entièrement sur les utilisateurs qui visitent le site pour déclencher des vérifications par rapport à un ensemble d'emplois horodatés.

ces techniques ne vont pas être très fiables à moins que vous ayez un autre serveur ping à intervalles spécifiques. Le but principal de la technique est d'éviter un utilisateur qui attend dire comme 15 secondes pour des scripts de nettoyage ou de maintenance à exécuter de temps en temps, plutôt qu'un vrai remplacement pour toutes les utilisations de cron.

1
répondu Klinky 2010-01-27 01:53:57

c'est une solution fonctionnelle mais bizarre qui assure que vous avez besoin d'avoir votre machine connectée toute la journée à exécuter le premier script. Si vous voulez, je vous recommande d'utiliser un script shell à l'aide de wget ou curl.

par exemple:

#!/bin/sh

curl -O http://www.myserver.com/cron.php 2>&1 > /var/log/remote.cron.log

mais je pense que la solution que vous aimeriez mettre en œuvre si vous n'avez pas à exécuter de façon très synchrone est un check in à la fin de votre index.php pour voir quand il a lancé le script le dernier heure, si c'était il y a plus de deux heures, alors include('cron.php') . Vous pouvez également stocker le timestamp de when ran le script dans une variable d'environnement, pour éviter la pénalité de performance.

1
répondu Pablo López Torres 2012-07-28 16:27:21

si je comprends bien, vous exécuteriez le premier script à partir d'une machine distante, faisant un hit sur le second script qui serait hébergé sur votre hôte cron-disabled ? Ensuite, grâce à un bug ou à une fonctionnalité étrange de l'interaction php/webserver lorsque vous fermez la connexion immédiatement, le script ne veut pas de temps mort ?

la première partie est une pratique assez courante, il y a même des entreprises qui fournissent ce même service ( http://www.webcron.org/index.php?lang=english par exemple va automatiquement poke n'importe quel script que vous voulez à peu près n'importe quand vous le demandez, pour un supplément).

la seconde partie m'est inconnue. Cela ressemble à un bug dans l'interaction php/webserver pour moi, mais je pourrais me tromper. Quoi qu'il en soit, je vérifierais si c'est un bug ou pas (attendez, c'est ce que vous faites en ce moment Non ?) et si elle s'avère être légitime comportement, puis aller pour elle. Si cela semble être un bug, alors ne vous fiez pas à cela car cela pourrait être fixe n'importe quand.

0
répondu Geoffrey Bachelet 2010-01-27 00:45:23

il m'a fallu plusieurs jours pour trouver une solution de travail sans conditions de course et/ou l'inondation de mon propre serveur, mais enfin je pense que cela devrait fonctionner:

http://www.programmierer-forum.de/phpcron-cronjobs-ohne-crontab-t348377.htm

0
répondu mgutt 2015-02-12 09:33:51