Выполнять скрипт через консоль, а не через веб-сервер.
Cron может выглядеть так:
*/5 * * * * php -f /path/to/cron.php
Тогда файл может сделать это:
cron.php:
<?php
if ( array_key_exists('REMOTE_ADDR', $_SERVER) )
die("Can only be run from the command line!");
Это гарантирует, что он будет запущен только сервером.
Редактировать в ответ на комментарии
Обычно вы не можете получить доступ к общей папке внутри личной папки, и если вы не можете добавить новые каталоги вне корневого веб-каталога, каталог кэша должен быть защищен другим способом.
Я предполагаю, что все ваши файлы находятся в корне сети, то есть: /home/site/publichtml
. Замените его тем, что у вас в каталоге.
Создать новый каталог /home/site/publichtml/.cache
. Добавьте в качестве файла .htaccess следующее:
Deny from all
Теперь ваши сценарии должны иметь возможность доступа к папке из файловой системы, но она недоступна через веб-сервер.
Если вы можете настроить задачу cron на сервере (через веб-администратора или другим способом, похоже, что вы можете), сделайте это, как указано выше, то есть: используйте php -f /home/site/publichtml/cron.php
в качестве команды и включите проверку для ключ массива.
В качестве альтернативы вы можете проверить так:
if ( !isset($_SERVER['argc']) )
die("Must be run from the command line!\n");
$_SERVER['argc']
устанавливается только при выполнении сценария из командной строки.
Если вы можете сохранить скрипт cron вне корневого каталога, хорошо. Если нет, то это должно быть безопасно.
Наконец, чтобы избавиться от E_NOTICES, добавьте это в начало cron.php:
error_reporting(E_ALL ^ E_NOTICE); // Turn off notices
или
error_reporting(0); // Hide all error reporting