首页 > 解决方案 > 搜索数据库仅在 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) 以查看应用程序中的更改。

标签: phppostgresqlsymfonymapbender3

解决方案


所以这原来是一个文件夹权限问题。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 文档


推荐阅读