Что может привести к сбою Class :: Loader там, где «use» и «new» не работают? - PullRequest
3 голосов
/ 14 января 2009

Я работаю над очень большим CGI-приложением, которое использует Crypt :: RSA , которое правильно установлено. Я получаю ошибку типа «попытка вызвать нулевую ссылку как функцию» (я не могу вернуться, чтобы получить точную ошибку прямо сейчас, потому что нам пришлось откатиться на дату выпуска), когда я пытаюсь запустить любую встроенную библиотеку , Я прослеживаю нулевую ссылку на конструктор Crypt :: RSA, который использует Class :: Loader для включения Crypt :: RSA :: ES :: OAEP.

Я заменил загрузчик классов на «use» и «new», и эта часть работает нормально, хотя во многих случаях библиотека все еще дает сбой. Очевидно, что-то не так с моей средой. Я просто не уверен, что. Кто-нибудь может дать мне какие-либо выводы?

1 Ответ

2 голосов
/ 14 января 2009

Ладно, после 12 часов копания я получил это на работу.

Вот что происходит (но не почему). Всякий раз, когда я вызывал eval() в цитируемом операторе use или require (как это происходит в Class :: Loader, но также и в других местах в Crypt :: framwork), он не видел пути, которые в противном случае были включены в Perl пути к классам. Поскольку большинство цитируемых объектов use / require просто предполагают, что класс будет там, на меня было брошено очень мало полезных ошибок. Я бы сбросил @INC в файл, вне блока eval, и все было бы там.

По иронии судьбы, я использовал ту же настройку в dev против staging, и она работала в dev, но не в staging. Я также должен отметить, что FindBin (я не должен использовать его в CGI, я знаю, но Crypt использует его) колебался вверх / вниз около / dev / null в стадии подготовки, но не в разработке.

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

Как я решил эту проблему для себя в Crypt :: RSA, было отключить все команды, связанные с FindBin, и жестко кодировать requir e ссылки на все, что мой код когда-либо получит. Я сделал запрос в Crypt :: RSA для Crypt :: RSA :: ES :: OAEP и один в Crypt :: Random :: Генератор для Crypt :: Random :: Provider :: rand

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

...