PHP fgetcsv возвращает false в начале файла

Это скрипт PHP, работающий под Windows. Это работало, но недавно прекратилось.

Файл открывается и возвращается правильный дескриптор файла: $fh = fopen($filename, 'r');

Тем не менее, самый первый раз, когда я звоню fgetcsv это возвращается false:

$headers = fgetcsv($fh, 6000, ',');
$line_no++;
if($headers === FALSE){
echo 'Error parsing file headers';
}

Это происходит сейчас на всех CSV-файлах, которые я пробую. Другие изменения, которые я пытался безрезультатно:

  • ini_set('auto_detect_line_endings', true); Прямо перед открытием файла
  • rewind($fh); Сразу после открытия файла
  • Используя оба 0 или число, подобное 6000 для второго параметра длина.
  • Изменение стиля окончания строки файла с unix на Windows и Mac

Кажется, что-то с Windows заставляет этот файл не анализировать.

Есть ли способ вернуть фактическую ошибку из fgetcsv? Документация не говорит, что есть, просто она возвращается false на любую ошибку. Существуют ли другие настройки Windows, которые могут вызывать проблемы? Настройки безопасности Windows дают всем полный контроль над файлами.

1

Решение

Каноническим способом отладки этого будет «print_r ($ headers)».

Так как fgetcsv возвращает массив, он должен быть пустым или не массивом. Если вы можете настроить (или настроить) PHP для регистрации ошибок в известном месте (Windows с IIS будет «syslog» и будет отображаться в окне просмотра событий), вы сможете выяснить, в чем дело.

0

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

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

Решением, которое я использовал, было создание временного файла блокировки на основе имени файла вместо использования реального файла. Например: $filename.'.lock'

Это была глупая ошибка с моей стороны, однако было бы гораздо полезнее, если бы PHP возвратил или написал ошибку / предупреждение в какой-то момент.

0

По вопросам рекламы [email protected]