Задание cron cPanel создает псевдонимы PHP-файла по неизвестной причине ...? - PullRequest
1 голос
/ 04 сентября 2011

У меня есть настройка заданий cron, которая часто запускает несколько сценариев PHP. Проблема в том, что каждый раз, когда он запускает скрипт, он создает его псевдоним или пустой файл с тем же именем файла и номером, добавляемым в конце.

Например, один из файлов activesessions_update.cron.php, вот скрипт внутри него:

<?php
  $memcache = new Memcache; 
  $memcache->connect('127.0.0.1', 11211);
  $activeSessions = $memcache->getStats(); 

  // using heredoc
$file_content = <<<TEXT
<?php

\$activeSessions = {$activeSessions['curr_items']};

?>
TEXT;

// this would be a user-defined function
file_put_contents("activesessions.php", $file_content);
?>

В моей папке маршрутов это выглядит так: http://i.imgur.com/kS1JY.png

В cPanel задание cron запускает команду:

/usr/bin/wget http://domain.com/x/activesessions_update.cron.php

Понятия не имею, в чем проблема. Я вынужден удалять 10000 из этих пустых файлов каждую неделю. Обратите внимание, что У меня нет опыта программирования на PHP , так как я сам не кодировал его, поэтому любые ответы будут оценены с большой детализацией. Кто может помочь мне решить эту загадку?

РЕДАКТИРОВАТЬ: Получил решение от технической поддержки моего хоста:

Запись не велась, по умолчанию для загрузки файлов используется wget. Поэтому, когда вы запускаете wget для этого URL, он выходит, запрашивает файл, и загружает вывод запроса, по существу сохраняя копию что бы вы получили в своем браузере, если вы подняли его. Добавляя -O / dev / null команде, которую вы говорите, что вместо сохранения этот вывод в местоположение по умолчанию (как правило, там, где это было вызывается из), чтобы сохранить его в / dev / null, который на самом деле просто никуда (в основном просто выбрасывает)

Ответы [ 2 ]

1 голос
/ 04 сентября 2011

Поскольку мы установили, что это файлы журналов, созданные cron, обходной путь - заставить скрипт PHP удалять файлы журналов во время работы. Измените activesessions_update.cron.php на это - сначала создайте резервную копию оригинальной версии в другом каталоге!

Я предполагаю, что файлы созданы таким образом, чтобы пользователь, которого вы запускаете, выполнял сценарий, поскольку у него есть права на удаление файлов. Если это не так, это не сработает.

<?php

  $memcache = new Memcache; 
  $memcache->connect('127.0.0.1', 11211);
  $activeSessions = $memcache->getStats(); 

  // Removed slightly pointless heredoc
  $file_content = "<?php\n\n\  $activeSessions = {$activeSessions['curr_items']};\n\n?>";

  // this would be a user-defined function
  // What does the above comment mean? Are you supposed
  // to replace this with some of your own code?
  file_put_contents("activesessions.php", $file_content);


  // ========================================================
  //     Everything below here is to delete old log files


  // Change this to the directory where the log files end up
  $logsdir = "/home/USER/";

  // Get the name of this file and length of the name
  $filename = basename($_SERVER['PHP_SELF']);
  $namelength = strlen($filename);

  // Strip any trailing slashes from $logsdir
  $logsdir = rtrim($logsdir,'/\\');

  // Open the logs directory
  if (!$dp = opendir($logsdir)) {
    trigger_error("Could not open logs directory '$logsdir' for reading, exiting...");
    exit;
  }

  // Loop through the files in the directory
  while ($file = readdir($dp)) {
    if (!in_array($file,array('.','..',$filename)) && strlen($file) > $namelength && substr($file,0,$namelength) == $filename) {
      // If the start of the file name is the same as this file,
      // and the file name length is longer than the length of the
      // name of this file, delete it.
      @unlink("$logsdir/$file");
    }
  }

  // Close the directory pointer
  @closedir($dp);

?>

Полагаю, демон cron на вашем сервере настроен на перенаправление STDOUT и STDERR всех заданий cron, которые он запускает, в файл. Кажется странным, что он настроен так, как это может вызвать проблемы, как у вас. Кроме того, кажется очень странным, что он должен перенаправлять их в файлы, которые по сути имеют одно и то же имя вашего скрипта с номером в конце. Вы бы, хотя они были бы *.log или что-то.

Это решение все равно оставит хотя бы один файл журнала одновременно, потому что вы определенно не сможете удалить файл, в который в данный момент выполняется запись.

Если это работает, вы можете безопасно скопировать / вставить тот же код (из строки комментария =====) в любые другие файлы, которые вызываются заданиями cron и вызывают ту же проблему, если они:

  • создание файлов журнала в том же каталоге, в котором находится скрипт
  • единственный файл в каталоге (который вам действительно нужен), где имя файла начинается с полного имени файла скрипта
0 голосов
/ 04 сентября 2011

Могу поспорить, что это файлы журнала, содержащие выходные данные скрипта, созданные cPanel's cron .Проверьте конфигурацию cPanel и отключите ведение журнала, если вам это не нужно.

...