skrypt PHP uruchomiony przez CRON nie zapisuje danych do pliku

0

Na netmark.pl mam prościutki skrypt:

<?php
$epokau  = date("U");
$data    = date("Y.m.d");
$godzina = date("H:i:s");

$logi = fopen("logi_cron.txt","a");
  flock($logi, 2);
  fputs($logi,"$data - $godzina\n");
  flock($logi, 3);
fclose($logi);

echo("$data - $godzina");
?>

Skrypt jest wywoływany co minutę przez CRON. Na maila dostaję raport, z tego, co skrypt by wyświetlił, np:
2021.01.15 - 19:41:01
ale w pliku logów nic nie jest zapisywane.

Ten sam skrypt wywołany przez:
mojadomena.pl/mójskrypt.php
działa prawidłowo i dopisuje, co trzeba.

logi_cron.txt mają ustawione w atrybutach prawo zapisu dla: właściciela, świata i grupy.


Wyguglałam dwa opisy tożsamego problemu, ale bez rozwiązań.
Wysłałam też zgłoszenie, ale może tutaj mnie ktoś szybciej oświeci :/

2

Widocznie z poziomu crona skrypt jest wywoływany na innych prawach niż z poziomu przeglądarki i nie może zapisać do pliku. Zrób try / catch i wyślij sobie komunikat błędu.

0

Doczytałam, że trzeba inaczej określić ścieżkę zapisu i zrobiłam coś takiego:


<?php
$epokau  = date("U");
$data    = date("Y.m.d");
$godzina = date("H:i:s");

$sc_plik = $_SERVER['DOCUMENT_ROOT'] . "/logi_cron.txt";
$logi = fopen($sc_plik, "a");
  flock($logi, 2);
  fputs($logi,"$data - $godzina\n");
  flock($logi, 3);
fclose($logi);

echo("$sc_plik<br><br>");
echo("$data - $godzina");
?>

Wywołane z przeglądarki wyświetla:
/home2/domdomns/mojadomena.pl/logi_cron.txt

wywołane z CRON przesyła mailem raport:
/logi_cron.txt<br><br>2021.01.15 - 20:20:01

Ech... idę dalej walczyć :)

0

@TomRZ:

Zrobiłam:

<?php
$epokau  = date("U");
$data    = date("Y.m.d");
$godzina = date("H:i:s");


try {
  $sc_plik = $_SERVER['DOCUMENT_ROOT'] . "/logi_cron.txt";
  $logi = fopen($sc_plik, "a");
    flock($logi, 2);
    $wynik = fputs($logi,"$data - $godzina\n");
    flock($logi, 3);
  fclose($logi);
} catch (Exception $e) {
    echo 'exception: ',  $e->getMessage(), "\n";
}


echo("-$wynik-<br>");
echo("$sc_plik<br><br>");
echo("$data - $godzina");
?>

Wynik wywołania w przeglądarce:

-22-
/home2/domdomns/mojadomena.pl/logi_cron.txt
2021.01.15 - 20:28:53

Mailowy raport z CRON-a:

--
/logi_cron.txt

2021.01.15 - 20:29:01

Czyli nic się nie zapisało i nie ma błędu :|

1

@AnyKtokolwiek: Polecenie w CRON wygląda tak: /usr/local/bin/php /home2/domdomns/mojadomema.p./test_cron.php — Freja Draco 4 minuty temu

aha, czyli standalone, temat praw itd... jak @TomRZ wskazuje

to drugie by było czymś w rodzaju wget http://localhost/something/test_cron.php (nie jestem pewien czy wget jest najbardziej właściwą komendą). Wtedy całe zasady są takie same, jak "webowych" skryptów PHP

Dawniej na biednych wirtualkach tak się robiło powszechnie

0
AnyKtokolwiek napisał(a):

to by było czymś w rodzaju wget http://localhost/something/test_cron.php (nie jestem pewien czy wget jest najbardziej właściwą komendą). Wtedy całe zasady są takie same, jak "webowych" skryptów PHP

Poszukałam trochę, zrobiłam:

wget -q --spider http://mojadomena.pl/test_cron.php

i działa idealnie. Serdeczne dziękuję :)

Tylko nie wiem po grzyba w panelu administracyjnym konta sugerują składnię, która skutkuje kulawą funkcjonalnością :p

0

Rozumiem, że to co skrypt wyrzuca na wyjście dostajesz mailem? No bo inaczej tego exception nie zobaczysz.

Jeżeli tak to bardzo dziwne - powinien zgłosić błąd, że się nie udało zapisać do pliku.

2

Udało mi się znaleźć rozwiązanie nie na około :)

Problem wynikał z piętrowego upakowania domen przez serwer:

/home2/domena-domyślna/domena-właściwa/test_cron.php

gdzie katalogiem roboczym skryptów PHP uruchomionych przez CRON-a był ten nadrzędny. W efekcie logi lądowały w:

/home2/domena-domyślna/log.txt

Po zmianie parametru otwieranego pliku na:

$logi = fopen("domena-właściwa/logi_cron.txt", "a");

zaczęło działać tak, jak chciałam.


A jeszcze lepiej jest wywoływać CRON-em skrypt PHP, przekazując jako parametr jego katalog roboczy:

cd /home2/domena-domyślna/domena-właściwa/ && /usr/bin/php test_cron.php

I wtedy w PHP wywołujemy już normalnie:

$logi = fopen("logi_cron.txt", "a");

I działa :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1