Миграция PHP Artisan с помощью MAMP и Unix Socket

Первоначально я разрабатывал свое приложение в Laravel 4.2, но с тех пор решил перенести его на версию 5.0, чтобы оно охватывало гораздо больше изменений и преимуществ, чем 5.0 по сравнению с 4.2.

Я пытаюсь запустить свои миграции, но получаю сообщение об ошибке:

[PDOException]
  SQLSTATE[HY000] [2002] No such file or directory

Я изучил это и заметил, как это происходит, потому что я использую MAMP для своего сервера вместо бродяги и усадьбы. Я не отказываюсь от использования этих двух, но на данный момент я чувствую себя более комфортно с MAMP, пока он не подведет меня. Причина, по которой я знаю его MAMP, заключается в необходимости объявить используемое значение сокета unix.

Теперь в моей версии 4.2 моего приложения у меня есть следующее:

'mysql' => array(
    'driver'    => 'mysql',
    'unix_socket'   => '/Applications/MAMP/tmp/mysql/mysql.sock',
    'host'      => getenv('DB_HOST'),
    ...
),

В моей версии Laravel 5.0 я использую файл .env для переменных среды и не знаю, как мне это сделать, чтобы он знал, что нужно использовать значение сокета unix.

Может ли кто-нибудь подсказать мне, как я должен принять это в новой версии или как лучше добавить это в настройки, чтобы мне не приходилось этого делать?


person user3732216    schedule 27.03.2015    source источник
comment
и вы уверены, что сокет unix находится в этом месте? Вы установили MAMP не по умолчанию?   -  person Félix Adriyel Gagnon-Grenier    schedule 27.03.2015
comment
Да и я знаю, что это правильно.   -  person user3732216    schedule 27.03.2015
comment
да к чему? Осмелюсь сказать, что на вашем компьютере в указанном месте нет файла с именем mysql.sock. Компьютеры не делают ошибок в этом. Если он говорит, что там нет файла, это потому, что там нет файла. Если вы установили свой MAMP не в место по умолчанию, вы можете решить свою проблему, обновив свою конфигурацию с правильным путем к файлу mysql.sock, но сами MAMP не рекомендуют устанавливать свое программное обеспечение в другом месте, потому что многие проблемы, такие как эта, будут возникают.   -  person Félix Adriyel Gagnon-Grenier    schedule 27.03.2015
comment
Я знаю, что путь к unix правильный.   -  person user3732216    schedule 27.03.2015
comment
Ok. Извините, я действительно не хочу, чтобы мы конкурировали. Я пытаюсь сказать вам, что исключение, возвращающее No such file or directory, не создает ошибку, оставляя нам два варианта: либо файл находится не там, где вы его написали, либо функция добавляет что-то к путь, делая это неправильно. Но пожалуйста, пожалуйста, пожалуйста, ПОЖАЛУЙСТА перестаньте верить, что компьютер ошибается. Файл, который он ищет, находится не там, где он есть, и точка. Больше ничего нет. Найдите точный путь, который функция пытается включить, и опубликуйте его здесь.   -  person Félix Adriyel Gagnon-Grenier    schedule 27.03.2015


Ответы (5)


Попробуй это:

'mysql' => array(
'driver'    => 'mysql',
'unix_socket'   => getenv('UNIX_SOCKET'),
'host'      => getenv('DB_HOST'),
...
),

В .env добавить

UNIX_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
person Vlad Slobodkin    schedule 07.04.2015
comment
Только что проверил это. Работал как шарм! - person Troy; 08.04.2015
comment
Следует отметить, что некоторые установки Laravel 5 не поставляются с файлом config/database.php по умолчанию. Я не знаю почему, но мне пришлось создать его, и это на самом деле не упоминается в документации Laravel 5 (которую я мог найти). - person russellmania; 24.06.2015
comment
Спасибо, что поделились решениями. Я использую Laravel 5.3.x - person Fairuz Sulaiman; 31.10.2016
comment
в Laravel 5.5 и выше нужно только добавить DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock в .env и все заработает - person Rory; 19.04.2019

хотя довольно старый вопрос, но все же может помочь другим. поэтому добавляю ответ.

есть даже простое решение. добавьте это в ваш файл .env

DB_HOST=localhost;unix_socket=/Applications/MAMP/tmp/mysql/mysql.sock
person S. M. Ibrahim Lavlu    schedule 15.09.2016

В laravel 5.5 unix_socket меняется на DB_SOCKET.

внутри файла .env:

DB_USERNAME=root
DB_PASSWORD=root
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock

внутри config/database.php:

    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
person Esteban Bautista    schedule 20.02.2018

Спасибо, помогите решить проблему с миграцией, используя:

MAMP PRO 4.2
Laravel 5.5

внутри файла .env:

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=<database name>
DB_USERNAME=<username - default root>
DB_PASSWORD=<password - default root>
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock

внутри config/database.php:

'connections' => [

    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', '<database name>'),
        'username' => env('DB_USERNAME', '<username - default root>'),
        'password' => env('DB_PASSWORD', '<password - default root>'),
        'unix_socket' => env('DB_SOCKET', '/Applications/MAMP/tmp/mysql/mysql.sock'),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],
],

Также не забудьте добавить в app/Providers/AppServiceProviders.php:

use Illuminate\Support\Facades\Schema;
public function boot()
{
   Schema::defaultStringLength(191);
}
person DerekOBrien    schedule 15.12.2017
comment
Это работает, но будьте осторожны, в файле .env должно быть DB_SOCKET, а не UNIX_SOCKET, пожалуйста, исправьте это. - person tinyCoder; 04.04.2018
comment
Внесены изменения на основе более свежей информации @tinyCoder и Esteban Bautista относительно изменения UNIX_SOCKET на DB_SOCKET. - person DerekOBrien; 19.04.2018

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

Ответы, которые я нашел в Интернете, варьировались от изменения 127.0.0.1 до localhost, изменения порта с 3306 на 33060 и наоборот и проверки правильности unix_socket.

Решение, которое решило мою проблему, менялось:

DB_CONNECTION=mysql
DB_HOST=localhost

to

DB_CONNECTION=mysql
DB_HOST=mysql

Я надеюсь, что это поможет кому-то там. Мне потребовалось 4 часа, чтобы найти это до боли очевидное решение... и оно было найдено за 1 минуту 29 секунд в темном Видео на YouTube с менее чем 1000 просмотров.

person Ralph Ferguson    schedule 21.11.2019
comment
Если имя хоста вашего компьютера не mysql и ваша база данных не прослушивает сеть, это не сработает. - person miken32; 26.02.2020