php - 搜索数据库仅在 php 开发环境中工作
问题描述
我在 VirutalBox 机器上的 Ubuntu 20.04 上设置了 Mapbender。PostgreSQL、PostGIS 和 Geoserver 都安装在 VM 上。我创建了一个地图应用程序并添加了一个搜索路由器功能(按照文档中的说明进行操作)。搜索在开发环境中就像一种魅力,但在产品中却不是。在开发环境中,它会给出一个结果并将鼠标悬停在结果上会突出显示该功能,然后单击该结果会移动并将地图缩放到该功能。
在 prod 环境中,键入搜索字符串并按搜索时似乎没有任何反应。devtools 报告内部服务器错误 500,这不是很有帮助。尽管在 Firefox 中,devtools 以红色显示引用策略“strict-origin-when-cross-origin”。
我已经将 Postgres 配置文件修改为 Listeners = * 和主机 0.0.0.0 以确保它不是数据库访问问题。
主机:Windows 10 Pro 20H2
来宾机器:Ubuntu 20.04
Mapbender 3.2.6
数据库 Postgresql 12.8 和 Postgis 3.0
通过 Geoserver 服务的 WMS
PHP7.2
虽然我不确定我是否提供了正确诊断问题的所有信息,但任何有关如何调查和解决此问题的指示都值得赞赏。
更新:
我通过设置以下开关修改了 php.ini 以启用错误日志记录:
error_reporting = E_ALL
display_errors = Off
log_errors = On
ignore_repeated_errors = On
ignore_repeated_source = Off
error_log = /var/log/apache2/php_errors.log
但到目前为止没有记录任何错误,也没有创建 php_errors.log 文件。即使创建文件也不会对日志记录产生任何影响。我不确定我错过了什么。我想重申,虽然搜索在开发环境中工作,所以看不出它怎么可能是一个身份验证问题。我正在尝试在 VM 内的浏览器上的 prod 环境中进行搜索,因此使用 localhost 来访问应用程序。
在开发工具上,我得到以下信息:
jquery.min.js:formatted:4210 POST`
http://localhost/mapbender1/application/bh_admin/element/337/0-ed10fcc5-57e7-1f83-8a76-c32030225b85/search 500 (Internal Server Error)
send @ jquery.min.js:formatted:4210
ajax @ jquery.min.js:formatted:3992
n.<computed> @ jquery.min.js:formatted:4044
getJSON @ jquery.min.js:formatted:4033
_search @ js:14187
(anonymous) @ jquery-ui.min.js:6
(anonymous) @ js:13976
dispatch @ jquery.min.js:formatted:2119
r.handle @ jquery.min.js:formatted:1998
单击 jquery.min.js:4210 时,文件中会突出显示以下行:
g.send(b.hasContent && b.data || null),
更新 2
根据@IonBazan 的建议,我找到了 prod.log 文件,尽管它位于不同的文件夹中,但错误表明找不到数据库服务。日志文件位于:
var/www/mapbender1/app/logs
这是日志文件中的消息:
request.CRITICAL:未捕获的 PHP 异常 Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException:“您请求了一个不存在的服务“doctrine.dbal.mobh_data_connection”。您的意思是:“doctrine.dbal.default_connection”?在 /var/www/mapbender1/vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Container.php 行 348 {“异常”:“[对象](Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException(代码:0 ):您请求了一个不存在的服务“doctrine.dbal.mobh_data_connection”。您的意思是:“doctrine.dbal.default_connection”吗?在 /var/www/mapbender1/vendor/symfony/symfony/src/Symfony/Component /DependencyInjection/Container.php:348)"} []
正如我之前提到的,开发应用程序能够访问该服务。这意味着,我想,数据库连接参数在 parameters.yml 和 config.yml 文件中是正确的。所以我感觉可能有一些缓存项目需要更新,尤其是Mapbender 文档提到了这一点:
开发环境的缓存机制表现不同:并非所有文件都被缓存,因此代码更改是直接可见的。因此 app_dev.php 的使用总是比生产环境慢。
和
目录 app/cache 包含缓存文件。它包含每个环境(prod 和 dev)的目录。但是,如前所述,dev-cache 的机制表现不同。
如果对 Mapbender 接口或代码进行了更改,则必须清除缓存目录 (app/cache) 以查看应用程序中的更改。
解决方案
所以这原来是一个文件夹权限问题。dev 环境正常工作的原因是 dev 缓存的组件比 prod 少,这使得对 parameters.yml 和 config.yml 等配置文件的更改反映在 dev 中而不是 prod 中。在设置和配置过程中的某个时刻,cache/prod 文件夹的所有权转到了 root,这使 www-data 用户没有对该文件夹的适当访问权限。所以底线是,prod 缓存没有被更新,这使得数据库连接服务对 prod 环境不可见,尽管 parameters.yml 和 config.yml 具有正确的设置。
所以我做了以下事情,注意到我执行的一些步骤可能是不必要的,但在这个阶段我不会去寻找不需要的步骤。
第一步,停止正在运行的服务(Apache 和 PHP 服务器):
sudo app/console server:stop
sudo service apache2 stop
清除产品缓存:
sudo app/console cache:clear --env=prod --no-debug
我还使用了带有 no-warmup 开关的 cache:clear 命令,这实际上给您留下了一个几乎空的缓存文件夹。我发出了这个命令,因为上一个命令在文件夹中留下了一些文件。
sudo app/console cache:clear --env=prod --no-warmup
安装资产:
sudo app/console assets:install web --env=prod
给 www-data 用户适当的文件夹权限:
sudo chown -R www-data:www-data /var/www/mapbender/app/cache
sudo chmod -R ug+w /var/www/mapbender/app/cache
启动 Apache 和 PHP 服务器:
sudo service apache2 start
sudo app/console server:start
注意 app/console 需要从文件夹 /var/www/mapbender 执行
就像我之前提到的,可能会有不必要的步骤,但这或多或少是我所做的,现在应用程序按预期工作。
免责声明:我不是开发人员,此处提供的信息来自多个来源,包括Mapbender 文档。
推荐阅读
- ssas - MDX count 发票金额大于 0 的天数
- python - 未定义符号:PyExc_RecursionError
- python - VS Code Python 扩展默认代码段
- java - Guava - intialCapacity 和 concurrencyLevel 的区别
- c# - 跨网络位置使用 File.Move() 的 C#“找不到文件”
- python - GroupBy 到数据框的优雅映射
- swift - Swift //拨打电话并选择线路(双卡/ eSIM iPhone)
- c++ - opencv-4.1.2 构建后要清理哪些文件和文件夹?
- javascript - 如何在 Vue 中选择所有具有特定关键字的 $refs?
- typescript - 如何在 addEventListener 上键入 currentTarget