2016-02-08 6 views
1

Наш сайт имеет CSV-файл, отправленный каждый день, который мы импортируем из другой системы. Иногда импорт работает правильно, но я столкнулся с проблемой, когда скрипт импортирует повторяющиеся данные вместо использования нового файла.PHP rename() дублирует файл вместо новой версии

Система будет продолжать импортировать старый файл до тех пор, пока я не заберусь через SFTP, чтобы просмотреть файл, а затем он захватит новый файл. Кажется, скрипт загружает старый файл в память, а затем не очищает его.

, например:

  • Файл загружен на 1 января
  • Этот файл правильно импортируется.
  • 2 января тот же файл снова импортируется.
  • 3 января тот же файл снова импортируется.
  • 4 января я просматриваю файл через SFTP.
  • 4 января новый файл будет импортирован.

Система продолжит импортировать старую версию файла до тех пор, пока не войду через SFTP.

Мой код для импорта ниже. Что-нибудь здесь объясняет, что может произойти?

function energyuportal_cron() { 

    if (($handle = fopen($CFG->dirroot.'/'."report.csv", "r")) !== FALSE) { 

     while (($data = fgetcsv($handle, 0, ",")) !== FALSE) { 
      if (energyuportal_check_data($data[1], $data[4])) { 
      // This imports the data   
      energyuportal_manage_completions($data[1], $data[4], $data[5], $data[7]); 
      } 

     } 
     fclose($handle); 

     rename($CFG->dirroot.'/'.$CFG->energyuportal_filelocation.'/'."report.csv", 
       $CFG->dirroot.'/'.'/old/'."report".date("Y-m-d-H-ia").".csv"); 


    } else { 
     // Error 
    } 

return true; 
} 
+0

проверка статуса завершения работы переименовывать! карп, если не удалось. Вы можете попробовать «переименовать» в исходную папку, а затем скопировать в dest и отсоединить исходный код после завершения копирования. – YvesLeBorg

+0

- это правильно? вы открываете '$ CFG-> dirroot. '/'." report.csv "', но вам нужно переименовать '$ CFG-> dirroot. '/'. $ CFG-> energyuportal_filelocation. '/'." report.csv "' и здесь '$ CFG-> dirroot. '/'. '/ old /'." report ".date (" YmdH-ia ").". csv "' у вас есть двойные слэбы, например '// old/report .csv'. – Wizard

+1

И я хотел бы рекомендовать использовать одинарные кавычки вместо двойных, потому что двойные кавычки заставляют php-интерпретатор оценивать контент, даже если строка не удовлетворяет анализируемым выражениям. – Wizard

ответ

0

Запишите результат stat() в файл перед выполнением fopen(). Также попробуйте добавить clearstatcache().

Если вы делали include(), я бы посмотрел настройки кэширования любого байтового кода, но вы этого не сделали. Поэтому я начал бы подвергать сомнению среду хостинга и слой fs.

http://php.net/stat

http://php.net/manual/en/function.clearstatcache.php