He PHP guru's,

Ik zit weer met een nieuw probleem...

Ik heb een (webshop)systeem gemaakt waarbij leden bestellingen kunnen posten.
- Men krijgt tijdens het plaatsen (net voor de betaling) een bevestigingsmail waarin staat dat de bestelling is opgeslagen in de database. (De bestelling heeft op dit moment de status 'in behandeling')
- Vervolgens dient men via Paypal of iDeal de betaling af te ronden en wordt men terug naar de website gestuurd.

Het kan nu dus zijn dat een klant een bestelling plaatst maar (met opzet of per ongeluk) nooit zal betalen. Het lijkt mij daarom ideaal om periodiek de database door te lopen op bestellingen die niets anders doen dan stof vangen (bij wijze van spreken) en om deze uit het systeem te gooien.

Voor het bewerken van de database (en het eventueel versturen van een notificatie email) heb ik geen hulp nodig, ik vroeg mij alleen af of het mogelijk is om dit proces puur automatisch te laten lopen.

Ik heb gelezen dat cronjob periodiek scripts kan uitvoeren, maar aangezien ik hier nog nooit mee heb gewerkt wil ik eerst naar mijn mogelijkheden binnen de PHP omgeving zoeken. Daarbij maak ik geen gebruik van cPanel, dus ik hoop dat er ook een open-source oplossing voor dit probleem is.

In het kort ziet het scenario er dus zo uit:

1. Klant plaatst bestelling [database wordt geüpdate met een bestelling]
2. Klant 'vergeet' te betalen.
(2 weken gaan voorbij)
3. Script loopt automatisch na welke bestellingen ouder of even oud als 2 weken zijn en verwijderd deze.

Optioneel ben ik van plan om de webadmin en de klant een mail te sturen na 1 week om ze nogmaals op de hoogte te stellen van de onbetaalde bestelling.

====
Mijn deskresearch:

Ik ben ervan op de hoogte hoe ik moet 'rekenen met datums', maar ik weet niet of ik een functie kan maken waarbij ik zeg:

<?
///in UNIX
	$nu = time ();
	$deadline = strtotime ("+7 weeks", $nu);

	// Dit zou ik automatisch op de deadline willen laten lopen.
	/* Alternatief zou ik een maandelijkse check kunnen houden
	   om de database op te schonen. Maar dan wel automatisch
	   zodat er geen administrator hoeft te zijn om deze check
	   zelf uit te voeren. */
	if($record['datum_geplaatst'] >= $deadline)
	{
		// Delete record uit SQL database
	}
?>


Weer iemand hoe ik een dergelijke functie zonder (directe) interactie van de gebruiker kan laten lopen?

Of moet dit met cronjob? Zo ja, heeft iemand een bron voor mij waarmee ik kan leren hoe cronjob werkt (zonder cPanel, als dat bestaat)? http://www.cronjob.nl/ ken ik (dit gaat over cPanel, voor de rest: tl;dr), maar het liefst heb ik een bron met voorbeelden of oefeningen.


================
EDIT: tl;dr was een domme keuze. Ik zie dat DirectAdmin ook wordt behandeld. Ik weet niet of alle web panelen cronjob wizards hebben, maar als dat wel zo is dan is dit appeltje eitje!
Als je ervoor zorgt dat je het eerst als PHP Command line script maakt, kun je het daarna als cronjob laten runnen.

Ik zet zo elke 15 minuten een voorbeeld database terug, die gebruikers hebben mogen testen.

Je php mag wel echo's gebruiken om dingen te laten zien tijdens het debuggen, maar geen html sturen.
Wat je met cronjob kunt doen is het aanroepen van een (php)bestand om dat uit te voeren. Je kunt er ook voor kiezen om, zodra bv je index-pagina wordt aangeroepen een scriptje te starten wat de database opschoont.

In je query kun je rekenen met interval.
John Berg op 29/08/2012 22:03:24

Je php mag wel echo's gebruiken om dingen te laten zien tijdens het debuggen, maar geen html sturen.


Bedankt voor de tip! Dat wist ik nog niet. Het is de bedoeling dat het script alleen mails verzend en de database bijwerkt zonder echo's oid.

Obelix en Idefix op 29/08/2012 22:05:57

Wat je met cronjob kunt doen is het aanroepen van een (php)bestand om dat uit te voeren. Je kunt er ook voor kiezen om, zodra bv je index-pagina wordt aangeroepen een scriptje te starten wat de database opschoont.


Ik ben er bang voor dat wanneer ik het script telkens via de index pagina aanroep mijn admin en/of de klant(en) vol worden gespamt met mails wanneer er bestellingen binnen de uitzondering vallen.
Christopher A op 29/08/2012 22:12:09

[quote="Obelix en Idefix op 29/08/2012 22:05:57"]
Wat je met cronjob kunt doen is het aanroepen van een (php)bestand om dat uit te voeren. Je kunt er ook voor kiezen om, zodra bv je index-pagina wordt aangeroepen een scriptje te starten wat de database opschoont.


Ik ben er bang voor dat wanneer ik het script telkens via de index pagina aanroep mijn admin en/of de klant(en) vol worden gespamt met mails wanneer er bestellingen binnen de uitzondering vallen.
[/quote]

Je hoeft ook niet telkens alle code uit te voeren. Je kan bijvoorbeeld ergens bijhouden in de database wanneer de schoonmaak het laatst is uitgevoerd. Als je dan ziet, hé, het is al 24 uur geleden, dan mag de schoonmaak weer beginnen.

Persoonlijk zou ik echter wel voor een CronJob gaan in dit geval.
Christopher A op 29/08/2012 22:12:09

[quote="John Berg op 29/08/2012 22:03:24"]
Je php mag wel echo's gebruiken om dingen te laten zien tijdens het debuggen, maar geen html sturen.


Bedankt voor de tip! Dat wist ik nog niet. Het is de bedoeling dat het script alleen mails verzend en de database bijwerkt zonder echo's oid.

Obelix en Idefix op 29/08/2012 22:05:57

Wat je met cronjob kunt doen is het aanroepen van een (php)bestand om dat uit te voeren. Je kunt er ook voor kiezen om, zodra bv je index-pagina wordt aangeroepen een scriptje te starten wat de database opschoont.


Ik ben er bang voor dat wanneer ik het script telkens via de index pagina aanroep mijn admin en/of de klant(en) vol worden gespamt met mails wanneer er bestellingen binnen de uitzondering vallen.
[/quote]

Dat hangt geheel van je script af, echter zou ik toch gaan voor de cronjob anders ben je namelijk afhankelijk van wanneer en hoevaak de website bezocht wordt. Wat bijvoorbeeld snachts minder vaak zal zijn. Zo zou je hier dus geen invloed meer op hebben.
Stefan van den Broek op 30/08/2012 08:52:13

[quote="Christopher A op 29/08/2012 22:12:09"]
...


Dat hangt geheel van je script af, echter zou ik toch gaan voor de cronjob anders ben je namelijk afhankelijk van wanneer en hoevaak de website bezocht wordt. Wat bijvoorbeeld snachts minder vaak zal zijn. Zo zou je hier dus geen invloed meer op hebben.

[/quote]

Dat klopt, ik denk dat achteraf gezien cronjob betrouwbaarder is, met de gedachte dat de taak wordt uitgevoerd ondanks het aantal bezoekers.

Om de spam tegen te gaan had ik al bedacht om een bestelling waarop een mail is gestuurd bijvoorbeeld de waarde '1' te geven in de database in het veld 'checked'. Als dit veld op 0 staat is er nog geen mail gestuurd, maar wanneer dit een 1 is wel. Op die manier voorkom ik die redundante berichten. (Vergelijkbaar met een account-verificatie wanneer gebruikers via hun mail op een link moeten klikken om het te activeren.)

Desalniettemin zal ik via DirectAdmin de cronjob uitvoeren. Bedankt voor de tips iedereen!
Uiteraard moet je ergens bijhouden of het record al verwerkt is of niet. Wat je eventueel ook kan doen, beetje afhankelijk van wat je precies wilt doen... Alle records verwijderen na het versturen.
Ja uiteraard. Ik ben van plan om de records na 2 weken te verwijderen, maar ik wilde 1 week daar voorafgaand de gebruiker en de admin laten weten dat dit gaat gebeuren. Dan wordt er niet per ongeluk een record verwijderd, omdat een admin vergeet de status te veranderen of omdat deze op vakantie is.

Ik maak dus een script dat elke week wordt nagelopen:


if ((record >= 1 week oud) && status == '1' && delete_mail == '0')
{
	stuur mail;
}
elseif ((record >= 2 weken oud) && status == '1' && delete_mail == '1')
{
	verwijder gegevens/records;
}
elseif (status != '1' && delete_mail == '1')
{
	Verander delete_mail terug naar '0';
}


In het kort ziet het er zo uit. Ik zal er uiteindelijk nog wat aan toevoegen om ervoor te zorgen dat er geen mails worden gestuurd of records worden verwijderd wanneer dat niet hoort.
Elke week??

ik neem aan dat je 24/7 kan bestellen? dus de weken lopen verschillend van elke klant zeker? ik zal zeggen doe elke uur een controle pas natuurlijk wel op dat de script niet de server over belast wat ik dus had met een check voor mensen die hun email nog niet hadden bevestigt!

Maar cronjob met directadmin gaat vrij wel simpel hou wel deze code er voor:
/usr/local/bin/php -q -f
want daar had ik een fout waardoor de script niet werd uitgevoerd XD
Als het om grote hoeveelheden mails zou gaan, kan het interessant zijn een batch oplossing uit te werken / te gebruiken. Maar al moet ik zegen dat een beetje host tegenwoordig toch veel kan verwerken.

Ik ben zelf reseller, en de mailserver die komt echt niet klagen over 1000 mails meer of minder hoor :-)

[size=xsmall]Toevoeging op 30/08/2012 21:29:18:[/size]

Als het om grote hoeveelheden mails zou gaan, kan het interessant zijn een batch oplossing uit te werken / te gebruiken. Maar al moet ik zegen dat een beetje host tegenwoordig toch veel kan verwerken.

Ik ben zelf reseller, en de mailserver die komt echt niet klagen over 1000 mails meer of minder hoor :-)

Reageren