Я делаю второе подключение моего проекта в laravel с представлением в базе данных MsSql, я правильно настроил свой .env и конфигурацию, однако это ошибка переполнения памяти:
$ php artisan tinker
Psy Shell v0.10.5 (PHP 7.3.24-3+ubuntu18.04.1+deb.sury.org+1 — cli) by Justin Hileman
>>> use App\Condinvest\BoletoPropCondominio as BPC
>>> BPC::first();
Illuminate\Database\QueryException with message 'SQLSTATE[HY001] Unable to allocate sufficient memory (meudominio.com.br:5000) (severity 8) (SQL: select top 1 * from [View_Boleto_Prop_Condominio])'
>>>
уже изменено в моем php.ini:
memory_limit = 128M
но ошибка продолжается.
Мои модели кратко выглядят так:
BaseView.php
<?php
namespace App\Condinvest;
use Illuminate\Database\Eloquent\Model;
class BaseView extends Model
{
protected $connection = 'condinvest';
}
BoletoPropCondominio.php
<?php
namespace App\Condinvest;
class BoletoPropCondominio extends BaseView
{
protected $table = 'View_Boleto_Prop_Condominio';
protected $fillable = [
'Id_Condo_lan',
...
'Id_titular'
];
}
когда я делаю тот же запрос непосредственно через командный терминал:
SELECT TOP 1 * FROM View_Boleto_Prop_Condominio;
успешно возвращает мои данные.
Может ли кто-нибудь сказать мне, что может происходить, или как я могу лучше отладить, чтобы понять, где ошибка, пожалуйста.
РЕДАКТИРОВАТЬ
>>> DB::connection('condinvest')->getConfig()['driver']
=> "sqlsrv"
Я поставил memory_limit = -1
Когда у меня возникла проблема с памятью, установка значения -1 не решила ее, хотя я этого и ожидал. Затем я попробовал что-то вроде 2G, и ошибка исчезла. Я не пытался использовать пакет, который вы используете, но решил, что по крайней мере поделюсь своим опытом с этой ошибкой месячной давности.
Не решить, пробовал перезапустить с помощью "apache2ctl restart" тоже не получилось, есть ли шанс, что ошибка на стороне сервера базы данных?
@MarciusLeandro Никогда не устанавливайте ограничение памяти на -1, это означает, что ограничения больше нет. Я думаю, что это не предел памяти php, потому что это вызовет ошибку php, а не ошибку sql. В любом случае, решение должно заключаться не в увеличении лимита памяти, а в уменьшении использования памяти.
какая у вас версия mssql?
@bhucho Я не знаю, база данных от третьего лица, и у меня есть доступ только к маршруту просмотра
Ошибка возвращается из самой базы данных. Похоже, это какая-то проблема с памятью, поэтому, пожалуйста, поделитесь спецификациями и сервисами, которые вы используете в одной среде.
Другие запросы работают?
напрямую через терминал да, через тинкер нет
@MarciusLeandro, похоже, проблема существует либо в конфигурации БД, либо в настройке, если у вас нет проблем с подключением БД mssql из Laravel. На всякий случай проверьте выделенную память в БД. пожалуйста, обратитесь к проверьте память сервера mssql. Если для mssql выделено достаточно памяти, у tinker могут возникнуть проблемы совместимости с mssql.
Поскольку об ошибке, по-видимому, сообщает процесс базы данных (а не процесс php), я бы не ожидал, что изменения ограничений памяти в php.ini окажут какое-либо влияние.
Я нашел эту проблему, в которой упоминается эта конкретная ошибка при использовании устаревшего драйвера с MSSQL Server.
Чтобы проверить, какой драйвер использует Laravel, введите DB::connection()->getConfig()['driver']
в консоль Tinker. Если вы видите sqlsrv
, то здесь все в порядке, но если вы видите dblib
, то это может быть источником ошибки. Эта проблема предположительно была исправлена в Laravel 5.7, чтобы предпочесть поддерживаемые драйверы, если доступно более одного, но также возможно, что ваш database.php
файл конфигурации использует неправильный.
Также возможно, что ограничения памяти сервера базы данных или системы, в которой он находится, фактически превышены. Возможность запустить запрос в командной строке без получения ошибки предполагает, что это не так, но, возможно, стоит изучить. Если доступной памяти очень мало, возможно, ее недостаточно для одновременного запуска php и запроса к базе данных. Вы можете проверить доступную системную память, выполнив команду free -h
в терминале, если процесс базы данных запущен на том же компьютере, что и ваш терминал. Однако, если вы используете провайдера виртуального хостинга, возможно, что база данных находится на отдельной машине.
Я видел в нескольких местах, что это могло быть, но я исправил это на диске, и ошибка все еще сохраняется.
@MarciusLeandro, какую версию Laravel вы используете (php artisan --version
)? Кроме того, каковы результаты проверки свободной системной памяти и какой драйвер базы данных использовался соединением DB
?
Если это поможет, я столкнулся с той же проблемой. Что я сделал, чтобы исправить это, так это проверил мою конфигурацию в database.php, если вы используете sqlserver, убедитесь, что у вас установлена кодировка utf8 следующим образом. Ранее он был установлен на utf8mb4.
'sqlserver' => [
'driver' => 'sqlsrv',
'host' => env('DB_SQL_HOST'),
'port' => env('DB_SQL_PORT'),
'database' => env('DB_SQL_DATABASE', 'forge'),
'username' => env('DB_SQL_USERNAME', 'forge'),
'password' => env('DB_SQL_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'options' => [
PDO::ATTR_TIMEOUT => 300
]
]
Не используйте utf8, он не позволяет в полной мере использовать Unicode.
Насколько вы увеличили
memory_limit
до?