Используйте хранилище данных Google AppEngine за пределами проекта AppEngine

ПОЧЕМУ ЭТО ПРОИСХОДИТ?

Со временем PHP стал более ориентированным на безопасность языком. Настройки, которые раньше были отключены по умолчанию, теперь включены по умолчанию. Прекрасным примером этого является E_STRICT, который стал включенным по умолчанию с PHP 5.4.0 .

Кроме того, согласно документации PHP, по умолчанию, E_NOTICE отключен в php.ini. Документы PHP рекомендуют включать его в целях отладки . Однако когда я загружаю PHP из репозитория Ubuntu - и из стека Windows BitNami - я вижу что-то еще.

; Common Values:
;   E_ALL (Show all errors, warnings and notices including coding standards.)
;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

Обратите внимание, что по умолчанию error_reporting установлено на производственное значение, а не на значение «по умолчанию» по умолчанию. Это несколько сбивает с толку и не документировано за пределами php.ini, поэтому я не проверял это в других дистрибутивах.

Однако, чтобы ответить на ваш вопрос, эта ошибка появляется сейчас, когда она не появлялась раньше, потому что:

  1. Вы установили PHP, и новые настройки по умолчанию несколько плохо документированы, но делают не исключают E_NOTICE.

  2. E_NOTICE предупреждения, такие как неопределенные переменные и неопределенные индексы, на самом деле помогают сделать ваш код чище и безопаснее. Я могу вам сказать, что несколько лет назад включение E_NOTICE включило меня и объявило мои переменные. Это значительно облегчило изучение языка C, если не объявлять переменные, это намного больше неприятностей.

ЧТО МОЖНО СДЕЛАТЬ ОБ ЭТОМ?

  1. Выключите E_NOTICE, скопировав «Значение по умолчанию» E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED и заменив его на что в настоящее время не комментируется после знака равенства в error_reporting =. Перезапустите Apache или PHP, если используете CGI или FPM. Убедитесь, что вы редактируете «правильный» php.ini. Правильный вариант будет Apache, если вы используете PHP с Apache, fpm или php-fpm, если вы используете PHP-FPM, cgi, если вы используете PHP-CGI и т. Д. Это не рекомендуемый метод, но если у вас есть устаревший код, который собирается быть чрезвычайно трудным для редактирования, тогда это может быть вашим лучшим выбором.

  2. Отключите E_NOTICE на уровне файла или папки. Это может быть предпочтительнее, если у вас есть какой-то устаревший код, но в противном случае вы хотите сделать все «правильно». Для этого вам следует проконсультироваться с Apache2, Nginx или любым другим вашим сервером. В Apache вы должны использовать php_value внутри .

  3. Перепиши свой код, чтобы он стал чище. Если вам нужно сделать это при переходе в производственную среду или вы не хотите, чтобы кто-то видел ваши ошибки, убедитесь, что вы отключили отображение ошибок, и только регистрируете ваши ошибки (см. display_errors и log_errors в php.ini и настройках вашего сервера).

Расширить вариант 3: Это идеальный вариант. Если вы можете пойти по этому пути, вы должны. Если вы изначально не идете по этому пути, рассмотрите возможность его перемещения в конечном итоге, протестировав свой код в среде разработки. Пока вы в этом, избавьтесь от ~E_STRICT и ~E_DEPRECATED, чтобы увидеть, что может пойти не так в будущем. Вы увидите много незнакомых ошибок, но это предотвратит возникновение неприятных проблем при необходимости обновления PHP в будущем.

ЧТО ОЗНАЧАЮТ ОШИБКИ?

Undefined variable: my_variable_name - Это происходит, когда переменная не была определена перед использованием. Когда скрипт PHP выполняется, он просто принимает нулевое значение. Однако в каком сценарии вам нужно проверить переменную, прежде чем она будет определена? В конечном счете, это аргумент в пользу «небрежного кода». Как разработчик, я могу сказать, что мне нравится, когда я вижу проект с открытым исходным кодом, в котором переменные определены настолько высоко, насколько это возможно. Это упрощает определение переменных, которые появятся в будущем, и облегчает чтение / изучение кода.

function foo()
{
    $my_variable_name = '';

    //....

    if ($my_variable_name) {
        // perform some logic
    }
}

Undefined index: my_index - это происходит, когда вы пытаетесь получить доступ к значению в массиве, а оно не существует. Чтобы предотвратить эту ошибку, выполните условную проверку.

// verbose way - generally better
if (isset($my_array['my_index'])) {
    echo "My index value is: " . $my_array['my_index'];
}

// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;   

Другой вариант - объявить пустой массив в верхней части вашей функции. Это не всегда возможно.

$my_array = array(
    'my_index' => ''
);

//...

$my_array['my_index'] = 'new string';

(дополнительный совет)

  • Когда я столкнулся с этими и другими проблемами, я использовал NetBeans IDE (бесплатно), и он дал мне множество предупреждений и уведомления. Некоторые из них предлагают очень полезные советы. Это не является обязательным требованием, и я больше не использую интегрированные среды разработки, за исключением крупных проектов. Я больше человек vim в эти дни :).
  • [Одна тысяча сто пятьдесят четыре]
5
задан Holtwick 19 July 2009 в 10:48
поделиться

3 ответа

Ниже приведен вывод компилятора. Странно, что второй раз запустить сборку удается. Однако я подозреваю, что проблема может быть связана с этой ошибкой при запуске mt.exe, который отвечает за встраивание информации из манифеста в исполняемый файл ...

Generating Code...
link /LIBPATH:"c:\Qt\4.5.2-vc\lib" /NOLOGO /DEBUG /MANIFEST /MANIFESTFILE:"debug\formExtractor.intermediate.manifest" /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /OUT:debug\formExtractor.exe @.\nmD932.tmp
mt.exe -nologo -manifest "debug\formExtractor.intermediate.manifest" -outputresource:debug\formExtractor.exe;1
'mt.exe' is not recognized as an internal or external command,
operable program or batch file.
NMAKE : fatal error U1077: 'mt.exe' : return code '0x1'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe"' : return code '0x2'
Stop.
Exited with code 2.

ОБНОВЛЕНИЕ

Причиной действительно была ошибка при запуске mt.exe во время процесса связывания. проблемы. Я добавил путь к Windows SDK ( C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ bin ) в переменную среды PATH, и теперь я могу запустить исполняемый файл.

Комментарии к различные ответы;


@Shay

Выходной текстовый файл из sxstrace пуст. Понятия не имею, почему. Однако в журнале приложения есть следующая информация:

Faulting application formExtractor.exe, version 0.0.0.0, time stamp 0x4a638ee1, faulting module MSVCR90D.dll, version 6.0.6002.18005, time stamp 0x49e03824, exception code 0xc0000135, fault offset 0x0006f04e, process id 0xf68, application start time 0x01ca08ba801ac5cf.

Версия 6.0.6002.18005?


@ Кирилл В. Лядвинский

Зависимость Уокер находит msvcr90d.dll , используемый файлом qtwebkit4.dll в
c: \ windows \ winsxs \ x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb \ MSVCR90D.DLL

, но не находит (другая версия?) файла msvcr400 ]d.dll, связанного напрямую. Однако DW, похоже, нигде не показывает свою версию, не так ли?

Конкурс файла formExtractor.intermediate.manifest

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*' />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.DebugCRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

Из файла манифеста похоже, что исполняемый файл связывается с другой версией msvcr90d .dll , чем qtwebkit4.dll . Странно то, что обе версии msvcr90d.dll присутствуют в c: а также x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb

Есть идеи?


@ knight666

Я использую платформу Qt, которую я скомпилировал с использованием именно компилятора mism, сейчас нет Вот. Кроме того, Dependency Walker показывает, что отсутствующий файл msvcr90d.dll связан напрямую с исполняемым файлом, так что я думаю, это не ошибка какой-либо сторонней библиотеки.

есть запись в блоге , в которой перечислены некоторые альтернативы, включая его BDBdatastore.

Однако предполагается, что вы хотите использовать точно такой же ORM, который вы сейчас используете в движке приложений. В целом существует множество вариантов ORM, хотя я не знаком с современным состоянием Python. Этот вопрос, похоже, действительно решает проблему.

5
ответ дан 14 December 2019 в 01:14
поделиться

Вы также можете захотеть посмотрите на AppScale , который представляет собой «платформу, позволяющую пользователям развертывать и размещать свои собственные приложения Google App Engine».

Это, вероятно, излишне для ваших целей, но определенно есть на что посмотреть.

4
ответ дан 14 December 2019 в 01:14
поделиться

Существует также удаленный API, который инструмент массовой загрузки использует для загрузки или выгрузки данных в / из хранилища данных.

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

0
ответ дан 14 December 2019 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: