PHP-скрипт не работает с www-data cron

после недели попыток я не знаю, что еще делать.
У меня есть простой скрипт PHP, который находится на моем веб-сервере, называется getpoem.php
Сценарий открывает веб-сайт, извлекает его содержимое и сохраняет его в файле poem.txt на сервере.

<?php
//File to extract the Poem of the day
$homepage = file_get_contents('http://SomeWebsite.com/today.php');
$poemALL = substr($homepage,strpos($homepage,"<p>"),strlen($homepage));
.
.  // extracting the poem and saving it to $poemFinish
.
file_put_contents("poem.txt", $poemFinish); ?>

так что это довольно простой скрипт (он отлично работает, если я выполню его вручную). Этот скрипт должен быть выполнен с пользователем www-data с его cron, поэтому я открою cron этой командой и ввел команду, которую должен выполнить

sudo crontab -u www-data -e

0 3 * * * php /var/www/html/getpoem.php

чтобы избежать каких-либо проблем с разрешениями, я дал права getpoem.php и poem.txt rwx следующим образом (я знаю, что должен изменить его, когда он будет работать, но это только для проверки)

-rwxrwxrwx 1 www-data www-data 1189 Aug 17 15:07 getpoem.php
-rwxrwxrwx 1 www-data www-data 1335 Aug 17 15:07 poem.txt

Так что это настройка, но она не будет выполнена.

Что я сделал до сих пор, изменив «php» на / usr / bin / php, чтобы cron знал, что такое php.
Следующее, что я сделал — убедился, что cron запущен, поэтому я изменил cronjob на

2 * * * */usr/bin/php /var/www/html/getpoem.php | > /var/www/html/test.txt

который снова ничего не сделал …. так что я изменил его

2 * * * */usr/bin/php /var/www/html/getpoem.php | > /tmp/test.txt

который не запустил php-файл, но создал пустой (-.- «) файл с именем test.txt в моем каталоге tmp.

Поэтому я думаю, что проблема заключается в правах доступа моего пользователя www-data. Это просто очень странно, потому что весь мой веб-контент (php-файлы, webapp usw.) также принадлежит пользователю www-data и работает без сбоев.

Нужно ли мне предоставлять дополнительные привилегии для cron www-data?

0

Решение

При запуске php из cron ваш рабочий каталог обычно не является каталогом, в котором находится файл. При записи файла он может попытаться записать файл poem.txt относительно / который обычно не доступен для записи.

Таким образом, вы либо устанавливаете рабочий каталог, либо должны использовать «абсолютные» пути. Так, например:

file_put_contents(__DIR__.'/poem.txt');

где __DIR__ магическая константа, которая содержит каталог, в котором находится текущий файл

2

Другие решения

Других решений пока нет …