Это скрипт 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
для второго параметра длина.Кажется, что-то с Windows заставляет этот файл не анализировать.
Есть ли способ вернуть фактическую ошибку из fgetcsv
? Документация не говорит, что есть, просто она возвращается false
на любую ошибку. Существуют ли другие настройки Windows, которые могут вызывать проблемы? Настройки безопасности Windows дают всем полный контроль над файлами.
Каноническим способом отладки этого будет «print_r ($ headers)».
Так как fgetcsv возвращает массив, он должен быть пустым или не массивом. Если вы можете настроить (или настроить) PHP для регистрации ошибок в известном месте (Windows с IIS будет «syslog» и будет отображаться в окне просмотра событий), вы сможете выяснить, в чем дело.
Проблема оказалась в том, что изменение в начале скрипта использовало тот же файл, что и файл блокировки, чтобы скрипт не запускался на одном и том же файле дважды в одно и то же время. Затем, позже в сценарии, когда я действительно хотел проанализировать файл, я снова открыл его (что было успешно), но потом я не смог прочитать содержимое.
Решением, которое я использовал, было создание временного файла блокировки на основе имени файла вместо использования реального файла. Например: $filename.'.lock'
Это была глупая ошибка с моей стороны, однако было бы гораздо полезнее, если бы PHP возвратил или написал ошибку / предупреждение в какой-то момент.