Открыть функцию не удалось с ошибкой Нет такого файла или каталога

Обновлено: 21.11.2024

Вывод: в этом руководстве вы узнаете, как открыть файл в Perl с помощью функции open(). Мы собираемся показать вам, как открыть файл для чтения и записи с обработкой ошибок.

Описатель файла Perl

Файловый дескриптор — это переменная, связанная с файлом. Через переменную дескриптора файла вы можете читать из файла или записывать в файл в зависимости от того, как вы открываете файл.

Perl-функция открытия файла

Вы используете функцию open() для открытия файлов. Функция open() имеет три аргумента:

  • Файловый дескриптор, связанный с файлом
  • Режим: вы можете открыть файл для чтения, записи или добавления.
  • Имя файла: путь к открываемому файлу.

Чтобы открыть файл в определенном режиме, необходимо передать соответствующий операнд в функцию open().

режимоперанд
чтение
добавить>>

Режимы открытия файлов подробно объясняются следующим образом:

  • Режим чтения ( ): если файл не существует, создается новый файл. Если файл уже существует, содержимое файла стирается, поэтому режим записи следует использовать с особой осторожностью.
  • Режим добавления (>>): как следует из названия, вы можете открыть файл для добавления нового содержимого к существующему содержимому файла. Однако вы не можете изменить существующее содержимое в файле.

В следующем примере показано, как открыть файл c:\temp\test.txt для чтения с помощью функции open().

Открытый файл возвращает true в случае успеха и false в случае неудачи. Вы можете использовать функцию die() для обработки ошибки открытия файла. См. пример ниже:

$! — это специальная переменная, которая передает сообщение об ошибке, объясняющее, почему функция open() не удалась. Это может быть что-то вроде «Нет такого файла или каталога» или «Отказано в доступе». Если файл c:\temp\test.txt не существует, вы получите сообщение об ошибке «Нет такого файла или каталога».

Закрытие файлов

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

Давайте рассмотрим следующий пример:

Если у вас есть файл с именем test.txt, который находится в папке c:\temp , вы получите следующий вывод:

Perl открыть файл

В этом руководстве вы узнали, как открыть файл, закрыть файл и обработать ошибку.

Когда вы обновляете свою функцию, Lambda развертывает изменение, запуская новые экземпляры функции с обновленным кодом или настройками. Ошибки развертывания препятствуют использованию новой версии и могут возникать из-за проблем с пакетом развертывания, кодом, разрешениями или инструментами.

При развертывании обновлений функции непосредственно с помощью Lambda API или клиента, такого как интерфейс командной строки AWS, вы можете видеть ошибки из Lambda непосредственно в выходных данных. Если вы используете такие сервисы, как AWS CloudFormation, AWS CodeDeploy или AWS CodePipeline, найдите ответ от Lambda в журналах или потоке событий для этого сервиса.

Общие: Отказано в доступе / Невозможно загрузить такой файл

Ошибка: EACCES: разрешение отклонено, откройте '/var/task/index.js'

Ошибка: не удается загрузить такой файл -- функция

Ошибка: [Errno 13] Отказано в доступе: '/var/task/function.py'

Среде выполнения Lambda требуется разрешение на чтение файлов в вашем пакете развертывания. Вы можете использовать команду chmod для изменения режима файла. Следующие примеры команд делают все файлы и папки в текущем каталоге доступными для чтения любому пользователю.

Общие: ошибка возникает при вызове UpdateFunctionCode

Ошибка: Произошла ошибка (RequestEntityTooLargeException) при вызове операции UpdateFunctionCode

При загрузке пакета развертывания или архива слоев непосредственно в Lambda размер ZIP-файла ограничен 50 МБ. Чтобы загрузить файл большего размера, сохраните его в Amazon S3 и используйте параметры S3Bucket и S3Key.

Когда вы загружаете файл напрямую с помощью AWS CLI, AWS SDK или иным образом, двоичный ZIP-файл преобразуется в base64, что увеличивает его размер примерно на 30 %. Чтобы учесть это и размер других параметров в запросе, фактический предел размера запроса, применяемый Lambda, больше. В связи с этим ограничение в 50 МБ является приблизительным.

Amazon S3: код ошибки постоянного перенаправления.

Ошибка: Произошла ошибка при выполнении GetObject. Код ошибки S3: постоянный перенаправление. Сообщение об ошибке S3: Ведро находится в этом регионе: us-east-2. Пожалуйста, используйте этот регион, чтобы повторить запрос

При загрузке пакета развертывания функции из корзины Amazon S3 корзина должна находиться в том же регионе, что и функция. Эта проблема может возникнуть, если вы указываете объект Amazon S3 в вызове UpdateFunctionCode или используете команды package и deploy в интерфейсе командной строки AWS или AWS SAM CLI. Создайте корзину артефактов развертывания для каждого региона, в котором вы разрабатываете приложения.

Общие: не удается найти, невозможно загрузить, невозможно импортировать, класс не найден, нет такого файла или каталога

Ошибка: Не удается найти 'функцию' модуля

Ошибка: не удается загрузить такой файл -- функция

Ошибка: Невозможно импортировать "функцию" модуля

Ошибка: Класс не найден: function.Handler

Ошибка: fork/exec /var/task/function: нет такого файла или каталога

Ошибка: Невозможно загрузить тип «Function.Handler» из сборки «Function».

Имя файла или класса в конфигурации обработчика вашей функции не соответствует вашему коду. Дополнительную информацию см. в следующей записи.

Общие: обработчик неопределенного метода

Ошибка: index.handler не определен или не экспортирован

Ошибка: обработчик 'handler' отсутствует в модуле 'function'

Ошибка: В классе function.Handler не найден общедоступный метод с именем handleRequest с соответствующей сигнатурой метода

Ошибка: Не удалось найти метод "handleRequest" в типе "Function.Handler" из сборки "Function"

Имя метода обработчика в конфигурации обработчика вашей функции не соответствует вашему коду. Каждая среда выполнения определяет соглашение об именовании обработчиков, например имя файла. имя метода . Обработчик — это метод в коде вашей функции, который запускается средой выполнения при вызове вашей функции.

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

Лямбда: InvalidParameterValueException или RequestEntityTooLargeException

Ошибка: InvalidParameterValueException: Lambda не удалось настроить ваши переменные среды, поскольку указанные вами переменные среды превышают ограничение в 4 КБ. Измеренная строка: < "A1":"uSFeY5cyPiPn7AtnX5BsM.

Ошибка: RequestEntityTooLargeException: запрос должен быть меньше 5120 байт для операции UpdateFunctionConfiguration

В этом примере объект состоит из 39 символов и занимает 39 байт при сохранении (без пробелов) в виде строки < "BUCKET":"my-bucket","KEY":"file.txt">. Стандартные символы ASCII в значениях переменных среды используют один байт каждый. Расширенные символы ASCII и Unicode могут занимать от 2 до 4 байтов на символ.

Лямбда: InvalidParameterValueException

Ошибка: InvalidParameterValueException: Lambda не удалось настроить ваши переменные среды, поскольку указанные вами переменные среды содержат зарезервированные ключи, изменение которых в настоящее время не поддерживается.

Lambda резервирует некоторые ключи переменных среды для внутреннего использования. Например, AWS_REGION используется средой выполнения для определения текущего региона и не может быть переопределено. Другие переменные, такие как PATH, используются средой выполнения, но могут быть расширены в конфигурации вашей функции. Полный список см. в разделе Определенные переменные среды выполнения.

В сценариях PHP при вызове include() , require() , fopen() или их производных, таких как include_once , require_once или даже move_uploaded_file() , часто возникает ошибка или предупреждение:

Не удалось открыть поток: нет такого файла или каталога.

Как быстро найти основную причину проблемы?

Я убрал комментарии не по теме к этому сообщению. Пожалуйста, держите мета-обсуждения в мета. Однако обратите внимание, что обсуждение жизнеспособности канонических вопросов проводилось снова и снова. См. пример здесь.

У меня та же проблема, единственное решение, которое всегда работало, это: -1 Перейдите к файлу для включения, правой кнопкой, свойствами, скопируйте полный путь. Например: C:/. /file.php 2- включить его. На самом деле я видел, что на этот вопрос дан ответ, и ответ подтвержден, но для меня в некоторых случаях это не сработало, пока я не нашел способ, описанный выше.

@Rash, спасибо за участие. К сожалению, ваше решение неверно, потому что в нем будет указан абсолютный путь, а это неправильно. Причина, по которой это неправильно, заключается в том, что в тот момент, когда вы скопируете свой проект в другое место или переместите его внутрь своего компьютера, все сломается.

9 ответов 9

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

Предположим, что мы устраняем неполадки в следующей строке:

1. Проверьте путь к файлу на наличие опечаток

    либо проверить вручную (визуально проверив путь)

или переместите все, что вызывается require* или include*, в отдельную переменную, выведите его, скопируйте и попробуйте получить к нему доступ из терминала:

Затем в терминале:

2. Убедитесь, что путь к файлу указан правильно относительно относительного или абсолютного пути

  • если он начинается с косой черты "/", то он относится не к корню папки вашего веб-сайта (корню документа), а к корню вашего сервера.
    • например, каталог вашего веб-сайта может быть /users/tony/htdocs
    • таким образом, не относительно пути к корню вашего веб-сайта или к файлу, в который вы вводите
    • по этой причине всегда используйте абсолютные пути к файлам

    Чтобы сделать ваш скрипт надежным на случай, если вы будете что-то перемещать, при этом генерируя абсолютный путь во время выполнения, у вас есть 2 варианта:

      использовать требуют __DIR__ . "/относительный/путь/из/текущего/файла" . Магическая константа __DIR__ возвращает каталог текущего файла.

    определить константу SITE_ROOT самостоятельно:

      в корне каталога вашего веб-сайта создайте файл, например. config.php

    в config.php напишите

    в каждом файле, где вы хотите сослаться на корневую папку сайта, включите config.php , а затем используйте константу SITE_ROOT везде, где хотите:

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

    3. Проверьте путь включения

    Еще один способ включения файлов, ни относительный, ни абсолютно абсолютный, — это использование пути включения. Это часто имеет место для библиотек или фреймворков, таких как Zend framework.

    Такое включение будет выглядеть следующим образом:

    В этом случае вам нужно убедиться, что папка, в которой находится «Zend», является частью пути включения.

    Вы можете проверить путь включения с помощью:

    Вы можете добавить к нему папку с помощью:

    4. Убедитесь, что ваш сервер имеет доступ к этому файлу

    Может случиться так, что у пользователя, запустившего серверный процесс (Apache или PHP), просто нет прав на чтение или запись в этот файл.

    Чтобы проверить, под каким пользователем работает сервер, вы можете использовать posix_getpwuid :

    Чтобы узнать права доступа к файлу, введите в терминале следующую команду:

    5. Проверьте настройки PHP

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

    Три параметра могут иметь значение:

      • Если этот параметр установлен, PHP не сможет получить доступ ни к одному файлу за пределами указанного каталога (даже через символическую ссылку).
      • Однако по умолчанию он не устанавливается, и в этом случае ограничений нет.
      • Это можно проверить, вызвав phpinfo() или используя ini_get("open_basedir")
      • Вы можете изменить этот параметр, отредактировав файл php.ini или файл httpd.conf
      • если эта функция включена, могут применяться ограничения. Однако это было удалено в PHP 5.4. Если вы все еще используете версию, поддерживающую безопасный режим, обновите ее до версии PHP, которая все еще поддерживается.
      • это относится только к включению или открытию файлов через сетевой процесс, такой как http://, но не при попытке включения файлов в локальную файловую систему
      • это можно проверить с помощью ini_get("allow_url_include") и установить с помощью ini_set("allow_url_include", "1")

    Если ни одно из перечисленных выше действий не помогло диагностировать проблему, могут возникнуть следующие особые ситуации:

    1. Включение библиотеки на основе пути включения

    Может случиться так, что вы включите библиотеку, например, платформу Zend, используя относительный или абсолютный путь. Например:

    Но тогда вы все равно получите ту же ошибку.

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

    Например, упомянутый выше файл Zend framework может включать следующее:

    который не является включением ни по относительному, ни по абсолютному пути. Предполагается, что каталог Zend framework был добавлен в путь включения.

    В таком случае единственным практическим решением будет добавление каталога в путь включения.

    2. SELinux

    Если вы используете Linux с усиленной безопасностью, причиной проблемы может быть отказ в доступе к файлу с сервера.

    Чтобы проверить, включен ли SELinux в вашей системе, запустите команду sestatus в терминале. Если команда не существует, значит SELinux не установлен в вашей системе. Если он существует, он должен сообщить вам, применяется ли он принудительно или нет.

    Чтобы проверить, не являются ли причиной проблемы политики SELinux, попробуйте временно отключить ее.Однако будьте ОСТОРОЖНЫ, так как это полностью отключит защиту. Не делайте этого на рабочем сервере.

    Если у вас больше нет проблемы с отключенным SELinux, значит, это основная причина.

    Чтобы решить эту проблему, вам необходимо соответствующим образом настроить SELinux.

    Необходимы следующие типы контекста:

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

    3. Симфони

    Если вы используете Symfony и сталкиваетесь с этой ошибкой при загрузке на сервер, возможно, кеш приложения не был сброшен, либо потому, что приложение/кэш было загружено, либо кеш не был очищен. .

    Вы можете проверить и исправить это, выполнив следующую консольную команду:

    4. Символы, отличные от ACSII, внутри Zip-файла

    Очевидно, что эта ошибка может возникнуть также при вызове zip->close(), когда некоторые файлы внутри zip содержат символы, отличные от ASCII, в имени файла, например "é".

    Возможное решение – обернуть имя файла в utf8_decode() перед созданием целевого файла.

    Спасибо Фрэн Кано за выявление и предложение решения этой проблемы

    Большое спасибо за предложение. Поскольку я не знаком с SELinux, я немного почитал и попытался ответить на этот случай. Пожалуйста, не стесняйтесь оставлять отзывы или предлагать некоторые изменения, если они неверны. Еще раз спасибо за комментарий!

    chcon является временным и не переживет восстановления или перезагрузки. вам может понадобиться использовать semanage для изменения контекста файла. Вот хороший простой учебник для веб-сайта

    @chrishiestand большое спасибо! Статья действительно интересная! Вы помните, какой ход событий привел к этой ошибке? Было ли это, что изначально у пользователя не было доступа для чтения к файлу, затем он был изменен, но кеш по-прежнему считал его недоступным для чтения, поэтому он выдавал эту ошибку при открытии файла?

    Чтобы добавить к (действительно хорошему) существующему ответу

    Попросите администратора вашего сервера ознакомиться с руководством по программному обеспечению хостинга и веб-сервера, которое они используют.

    Часто люди решают проблему с разрешениями, выполнив следующие действия (пример Linux)

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

    Что вам нужно сделать, так это определить пользователей, которым нужен доступ, и предоставить доступ только им. Как только вы узнаете, каким пользователям нужен доступ, убедитесь, что

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

    Пользователь и только он имеет доступ. В Linux рекомендуется использовать chmod 600 (только владелец может читать и писать) или chmod 644 (владелец может писать, но все могут читать)

    Это происходит, когда я обновляюсь с версии 7.5.1 до этой версии 7.5.4. Хотя переход на более раннюю версию кажется альтернативой, я также понимаю, что управление данными на консоли Amplify дает сбой с ошибкой: файл '/. когда я пытаюсь обновить схему, и журнал показывает ту же ошибку, что и в моей локальной сети при использовании 7.5.4 CLI

    В локальном режиме с CLI 7.5.4 я не могу нажать. При переходе на более раннюю версию я могу нажать, но не могу с ошибкой создать модели в облаке: создание задания Modelgen не удалось, в то время как консоль Amplify в разделе «Главная» говорит: «Ошибка: файл» / если я пытаюсь выполнить развертывание данных с помощью консоли, я перехожу та же ошибка Ошибка: файл '/, но с дополнительным контекстом (сбой, поскольку overrides-resource/tsconfig.json не найден)

    Ожидаемое поведение

    Я должен иметь возможность выполнять любую команду amplify и создавать новые среды или обновлять схему с помощью CLI 7.5.4

    Этапы воспроизведения

    Я почти уверен, что это должно быть что-то с моим проектом, но я нигде не нахожу никаких указаний. В моем контексте я делаю:

    1. усилить -v с помощью v7.5.4
    2. amplify push получает ошибку
    3. npm i -g @aws-amplify/cli@7.5.1
    4. amplify push без ошибок, но в конце завершается ошибкой "Не удалось создать модели в облаке: не удалось создать задание Modelgen"

    Схемы GraphQL

    Вывод журнала

    Дополнительная информация

    Я постоянно сталкиваюсь с проблемами при создании новых сред. Мы ожидаем, что у каждого разработчика будет среда для работы с функциями, а затем мы объединимся для разработки. Как только мы пытаемся создать новые окружения, мы сталкиваемся с постоянными проблемами с несколькими вещами, возможно, из-за того, что мы пытаемся выполнить миграцию на преобразователь GraphQL v2 и обновление до CLI 7+

    Текст был успешно обновлен, но возникли следующие ошибки:

    akshbhu прокомментировал 30 ноября 2021 г.

    Могу ли я узнать шаги (команды расширения) и какие категории вы добавили, когда получили эту ошибку?

    Вы пробовали переопределить команду amplify, когда возникла эта ошибка?

    duranmla прокомментировал 1 декабря 2021 г. •

    Чтобы воспроизвести ошибку, я упомянул в описании этой проблемы:

    • npm i -g @aws-amplify/cli для установки последней версии cli
    • попробуйте обновить мою схему и сделайте amplify api gql-compile, чтобы убедиться, что все правильно
    • усилить push-уведомление об ошибке

    Даже если я удалю изменение в своей схеме и попытаюсь отправить, я все равно получаю сообщение об ошибке, как только пытаюсь отправить версию 7.5.4, более того, я даже не могу усилить проверку env, поскольку она произойдет сбой с той же ошибкой.

    Категории, которые я добавил: Auth , Api , Storage , Function
    Скриншот из статуса amplify

    duranmla прокомментировала 1 декабря 2021 г.

    Раньше я переносил все после того, как нашел это, но это не предполагает, что amplify override API является альтернативой, так как вы спрашиваете меня обо всех ресурсах, и я решил попробовать Amplify Override API со всеми моими ресурсами API.< /p>

    В конце концов, кажется, что переопределение всех ваших ресурсов — это способ избежать этой ошибки.

    Большое спасибо за ваш ответ, @akshbhu, поскольку он дал мне представление о том, что делать. Интересно, есть ли документ, который мне не хватает с точки зрения понимания роли этих файлов переопределения и того, как они, даже если они пусты, влияют на сборку приложения.

    Читайте также: