[PHP/Cronjobs] Cronjobs werken niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Hey,

Allereerst excuses voor de onduidelijke topictitel, maar aangezien ik totaal niet weet waar ik de oplossing moet zoeken is voor mij onmogelijk om een duidelijkere titel te verzinnen.

Het probleem is als volgt:
Op een VPS server draait DirectAdmin, hier heb ik enkele Cronjobs ingesteld, te weten:

*/20 * * * * /usr/local/bin/php -q -f /home/[gebruikersnaam]/domains/[domeinnaam]/cronjobs/cronjob1.php
0 18 * * * /usr/local/bin/php -q -f /home/[gebruikersnaam]/domains/[domeinnaam]/cronjobs/cronjob2.php

De php bestanden staan één map hoger dan de root (public_html), maar de php bestanden worden niet uitgevoerd op de aangegeven tijdstippen.

Nu heb ik (via root toegang, d.m.v. Putty) gekeken of de cron service draait en daar ontdek ik geen oneffenheden (ik heb deze stappen gevolgd: http://help.directadmin.com/item.php?id=107).

Ik zie in de log wel dat de php bestanden worden aangeroepen:

Jul 21 22:00:01 hosted-by crond[30314]: (admin) CMD (/usr/local/bin/php -q -f /home/[gebruikersnaam]/domains/[domeinnaam]/cronjobs/cronjob1.php)

Eén van de php bestanden (cronjob1.php) ziet er als volgt uit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php

require_once($_SERVER['DOCUMENT_ROOT'].'/inc/config.class.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/inc/sql.class.php');

require_once($_SERVER['DOCUMENT_ROOT'].'/inc/newsletter.class.php');

$oNewsletter = new newsletter(0);

$oNewsletter->sendNewsletter();

?>


Wanneer ik handmatig dit bestand aanroep werkt het wel, dus lijkt het mij dat in bovenstaande code geen fouten zitten.

Kan iemand mij helpen om dit (toch wel) grote probleem op te lossen?

Bedankt!

[ Voor 8% gewijzigd door radem205 op 22-07-2010 11:11 ]


Acties:
  • 0 Henk 'm!

  • Priet
  • Registratie: Januari 2001
  • Laatst online: 01-06 18:30

Priet

To boldly do what no one has..

Wordt die DOCUMENT_ROOT wel gevuld met de juiste waarde?

"If you see a light at the end of a wormhole, it's probably a photon torpedo!"


Acties:
  • 0 Henk 'm!

  • TJVB
  • Registratie: Januari 2008
  • Laatst online: 28-05 09:52
Run je hem dan handmatig op dezelfde manier? En draait de cronjob onder dezelfde user als dat je het zelf test?
Wat zijn de errors die je krijgt?
Wat voor waarde heeft je DOCUMENT_ROOT? Vaak is het handiger om 1 config file te hebben waarin je de base path bepaald, daarmee kun je de rest includen.

Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Het probleem is dat ik niet kan zien (althans niet weet hoe) welke waarde DOCUMENT_ROOT heeft buiten de webroot. Is hier een manier voor om dit te achterhalen?
Wanneer ik in de webroot zit dan heeft de DOCUMENT_ROOT wel de juiste waarde.
En ik doe alles met dezelfde gebruiker.

Edit: Ik zal de DOCUMENT_ROOT eens vervangen door een handmatig pad naar de cronjob.

[ Voor 13% gewijzigd door radem205 op 22-07-2010 11:14 ]


Acties:
  • 0 Henk 'm!

  • MrHarry
  • Registratie: Oktober 2006
  • Laatst online: 30-05 14:03
staan de rechten wel goed voor cronjob1.php etc.. heb dit ook keer gehad dat het handmatig wel werkte maar via cron niet toen een chmod 777 gedaan en chmod a+x en toen werkte dit wel.

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 23:44

MueR

Admin Tweakers Discord

is niet lief

radem205 schreef op donderdag 22 juli 2010 @ 11:13:
Het probleem is dat ik niet kan zien (althans niet weet hoe) welke waarde DOCUMENT_ROOT heeft buiten de webroot. Is hier een manier voor om dit te achterhalen?
Erhm, hoe doe jij normaal je debugging? Je bent bekend met de fenomenen 'echo' of 'email'?

Verder wat bovenstaande heren zeggen. Zorg dat je ergens op een centraal punt bijvoorbeeld in je domain root (dus NIET je public html) een file cron-init.php (ofzo) hebt, met daarin het absolute pad waar je zit, bijvoorbeeld:
PHP:
1
2
define('ROOT_PATH', dirname(__FILE__).'/');
// ROOT_PATH: /home/[gebruikersnaam]/domains/[domeinnaam]/

Zorg dat je hiermee al je includes e.d. aanroept, zit je altijd veilig

[edit]
MrHarry schreef op donderdag 22 juli 2010 @ 11:13:
staan de rechten wel goed voor cronjob1.php etc.. heb dit ook keer gehad dat het handmatig wel werkte maar via cron niet toen een chmod 777 gedaan en chmod a+x en toen werkte dit wel.
777 op cronjobs? Ben jij mal, dat is niet nodig. 644 is meer dan genoeg. DirectAdmin draait cronjobs altijd onder de eigen user via commandline, dus met 644 zit je echt 100% safe.

[ Voor 54% gewijzigd door MueR op 22-07-2010 11:19 ]

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 20-04 16:44

Ram0n

Bierbrouwende nerd

De $_SERVER variabele bevat niet de informatie die je wilt hebben als het script wordt aangeroepen vanaf de client, zoals bij een cron job. Je moet ofwel het volledige pad opgeven, of werken met relatieve paden.

Eigenaar/brouwer Milky Road Brewery


Acties:
  • 0 Henk 'm!

  • TJVB
  • Registratie: Januari 2008
  • Laatst online: 28-05 09:52
MrHarry schreef op donderdag 22 juli 2010 @ 11:13:
staan de rechten wel goed voor cronjob1.php etc.. heb dit ook keer gehad dat het handmatig wel werkte maar via cron niet toen een chmod 777 gedaan en chmod a+x en toen werkte dit wel.
Waarom altijd die lelijk chmod 777, zorg gewoon dat je cron onder de juiste user draait. Als die handmatig wel toegang heeft moet de cron dat ook hebben.

Acties:
  • 0 Henk 'm!

  • TheJTE
  • Registratie: April 2007
  • Laatst online: 30-09-2022
De inhoud van $_SERVER (waaronder dus ook die DOCUMENT_ROOT) wordt grotendeels gedefinieerd door de webserver. Op het moment dat je een PHP-script direct uit laat voeren (zonder tussenkomst van Apache of whatever, zoals je nu dus doet) zal $_SERVER dus ook bijzonder weinig nuttige informatie bevatten.

Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Bedankt voor jullie reacties, maar het werkt nog steeds niet. Volgens mij zie ik een heel klein ding over het hoofd, maar ik zie het gewoon niet. Is er een manier om te achterhalen of er foutmeldingen in het script ontstaan bij het aanroepen van het script (cronjob).

In de log van de cronjobs lijkt alles goed te gaan:

Jul 22 11:36:01 hosted-by crond[20309]: ([gebruikersnaam]) CMD (/usr/local/bin/php -q -f /home/[gebruikersnaam]/domains/[domeinnaam]/cronjob_newsletter.php)

(hier komen de gebruikersnamen met elkaar overeen)

In cronjob_newsletter.php heb ik het volgende staan:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
require_once('cron_init.php');

require_once(ROOT_PATH.'inc/config.class.php');
require_once(ROOT_PATH.'inc/sql.class.php');

require_once(ROOT_PATH.'newsletter.class.php');

$oNewsletter = new newsletter(0);

$oNewsletter->sendNewsletter();

?>


En in cron_init.php het volgende:

PHP:
1
2
3
<?php 
define('ROOT_PATH', dirname(__FILE__).'/public_html/'); 
?>


De bestanden staan dus één map hoger dan de public_html map, dus de ROOT_PATH is juist lijkt mij....

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 23:44

MueR

Admin Tweakers Discord

is niet lief

Output emailen of loggen. Dat heb ik al gezegd. Je gaat bij sites toch ook debuggen? Bij onverwachtte resultaten output naar je browser sturen om te kijken wat er gaande is? Lees Programming FAQ - Debuggen: hoe doe ik dat? eens door.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Ja dat begrijp ik, maar als het gaat om een syntax fout of verkeerde include dan kan ik die foutmelding moeilijk mailen. Wanneer de cronjob in de root staat kan ik simpel het script aanroepen en kijken welke foutmeldingen worden gegeven.

Ik had al een simpele mail() onderaan het script gezet om te kijken of er wel een mail wordt verstuurd, maar als daar boven al een fout ontstaat heb ik niets aan die mail functie.

Maar hoe log ik de output van cronjob_newsletter.php?

[ Voor 6% gewijzigd door radem205 op 22-07-2010 11:46 ]


Acties:
  • 0 Henk 'm!

  • TJVB
  • Registratie: Januari 2008
  • Laatst online: 28-05 09:52
Je definieer nu public_html als ROOT_PATH. Terwijl je zegt dat je bestanden daar boven staan.
Betekent dit dat ik bijvoorbeeld je config bestand via : jouwwebsite.nl/inc/config.class.php aan kan roepen?

En wat zijn je foutmeldingen? ( error_reporting(E_ALL); ini_set('display_errors',1); )

Acties:
  • 0 Henk 'm!

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Ja klopt de include bestanden staan in de webroot, dus die kan je via de browser opvragen. Dus volgens mij zijn de absolute paden correct.

Ik ga even spelen met het loggen van de output.

Edit: Met behulp van het loggen is het opgelost. Dat loggen is best handig :). Het was toch een pad wat verkeerd stond. Bedankt allemaal voor jullie hulp!

[ Voor 29% gewijzigd door radem205 op 22-07-2010 11:58 ]

Pagina: 1