Problemy

# Composer: PHP Fatal error: Allowed memory size exhausted

Rzadkim problemem przy instalacji (composer install) bądź aktualizacji (composer update) aplikacji będzie powyższy komunikat błędu. Wynika on z tego, że na serwerach współdzielonych ustawiony jest zbyt niski memory_limit nie wystarczający dla Composera do stworzenia zależności. Rozwiązania problemu:

  • poprosić administratora o czasowe zwiększenie wartości dostępnej pamięci, prawdopodobnie do wartości 2GB
  • poprosić administratora o zaktualizowanie Composer-a do wersji 2.0 (znacznie lepsza optymalizacja)

W celu samodzielnej aktualizacji Composer-a (o ile serwer na to pozwala) należy wykonać polecenie:

composer self-update --2


# MySQL: Specified key was too long error

Podczas tworzenia bazy danych w starszych wersjach bazodanowych może pojawić się powyższy problem. Najczęściej dotyczy on nazw indeksów przekraczających ustaloną długość. Rozwiązaniem problemu jest zamieszczenie w pliku app/Providers/AppServiceProvider.php konfiguracji:

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

Następnie można ponowić instalację.

# Niewłaściwe daty na stronie

Problem wynika ze złej (lub innej niż oczekiwana) konfiguracji strefy czasowej w pliku php.ini. Domyślne ustawienie znajduje się w pliku /config/app.php

/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/

'timezone' => 'Europe/Warsaw',

Jeśli z jakichś przyczyn ustawienie to jest ignorowane, a nie ma możliwości zmiany bezpośrednio w pliku php.ini, należy w pliku app/Providers/AppServiceProvider.php zamieścić konfigurację:

public function register()
{
    date_default_timezone_set('Europe/Warsaw');
}


# Niewłaściwe nazewnictwo miesięcy archiwum

Problem dotyczy biblioteki Carbon i wynika ze złej konfiguracji locale na serwerze. jeśli nie ma możliwości zmiany bezpośrednio w pliku php.ini, należy w pliku app/Providers/AppServiceProvider.php zamieścić konfigurację:

use Illuminate\Support\Facades\Config;

public function register()
{
    setlocale(LC_ALL, Config::get('app.locale_full'));
}

gdzie wstrzyknięte zostanie ustawienie z pliku .env:

APP_LANG_FULL=Polish_Poland.utf8

Dostępne lokalizacje na serwerze można sprawdzić poleceniem:

locale -a


# PHP CLI z osobną ścieżką do Ioncube w php.ini

Na serwerach współdzielonych może zaistnieć sytuacja, że rozszerzenie Ioncube będzie dostępne jedynie z poziomu osobnego pliku php.ini, na przykład:

/usr/local/php73/bin/php -c /home/nazwa-usera/php73/php.ini

W takim przypadku należy:

  1. Poprawić ścieżkę do wykonania zadań Cron
  2. Stworzyć wygodny alias w pliku /.bashrc:
    alias php="/usr/local/php73/bin/php -c /home/nazwa-usera/php73/php.ini"
  3. Zmienić ścieżki post-skryptów w pliku composer.json w głównym folderze z aplikacją:
        "scripts": {
            "post-autoload-dump": [
                "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
                "/usr/local/php73/bin/php -c /home/nazwa-usera/php73/php.ini artisan package:discover --ansi"
            ],
            "post-root-package-install": [
                "/usr/local/php73/bin/php -c /home/nazwa-usera/php73/php.ini -r \"file_exists('.env') || copy('.env.example', '.env');\""
            ],
            "post-create-project-cmd": [
                "/usr/local/php73/bin/php -c /home/nazwa-usera/php73/php.ini artisan key:generate --ansi"
            ]
        }


# 405 Method Not Allowed

Konfiguracja serwera blokuje nie zdefiniowane metody requestów. Należy w vHoście dodać brakujące metody według poniższych przykładów:

  • dla serwera Apache:
    <Directory /sciezka-do-folderu-public>
        AllowOverride All
        AllowMethods GET HEAD POST PUT PATCH DELETE OPTIONS
    </Directory>
  • dla serwera Nginx:
    add_header Allow "GET, POST, HEAD, PUT, PATCH, DELETE, OPTIONS" always;
    if ( $request_method !~ ^(GET|POST|HEAD|PUT|PATCH|DELETE|OPTIONS)$ ) {
    return 405;
    }


W przypadku serwerów Apache o ile hosting na to pozwala możliwe jest również zdefiniowanie dozwolonych metod w pliku .htaccess:

<Limit GET HEAD POST PUT PATCH DELETE OPTIONS>
    order deny,allow
    allow from all
</Limit>


# Numeryczne atrybuty modelu zmapowane jako stringi

Problem wynika z konfiguracji rozszerzenia pdo_mysql. Można spróbować "wymusić" inną konfigurację z poziomu pliku config/database.php:

        'mysql' => [
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
                PDO::ATTR_EMULATE_PREPARES => false,
                PDO::ATTR_STRINGIFY_FETCHES => false
            ]) : [],
        ],

Alternatywnie (jeśli konfiguracja serwera na to pozwala) można wyłączyć pdo_mysql w ustawieniach PHP i przełączyć na nd_pdo_mysql.

W przeciwnym razie problemem musi zająć się support hostingu.