1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/hhxsv5-laravel-s

Клонировать/Скачать
KnownIssues.md 13 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 02.03.2025 20:01 c8b2666

Известные проблемы

Класс swoole не существует

  • В LaravelS, Swoole является HTTP сервером, запущенным в режиме CLI, заменяющим FPM.
  • При выполнении задачи, триггеринге асинхронного события будет вызвано app('swoole'), чтобы получить экземпляр Swoole\http\server из контейнера Laravel. Этот экземпляр внедряется в контейнер только при старте LaravelS.
  • Поэтому, после выхода из LaravelS, из-за межпроцессного взаимодействия, вы не сможете успешно вызвать app('swoole'):
    • Код, выполняющийся в различных режимах командной строки, таких как командная строка Artisan и скрипт PHP.
    • Выполнение кода под FPM/Apache PHP модуль, просмотр SAPI Log::info('PHP SAPI', [php_sapi_name()]);.

Использование пакета encore/laravel-admin

Измените config/laravels.php и добавьте LaravelAdminCleaner в cleaners.

'cleaners' => [
    Hhxsv5\LaravelS\Illuminate\Cleaners\LaravelAdminCleaner::class,
],

Использование пакета jenssegers/agent

Прослушивание системных событий

// Сброс Agent
\Event::listen('laravels.received_request', function (\Illuminate\Http\Request $req, $app) {
    $app->agent->setHttpHeaders($req->server->all());
    $app->agent->setUserAgent();
});

Использование пакета barryvdh/laravel-debugbar

Официально не поддерживает режим CLI, вам потребуется добавить переменную окружения APP_RUNNING_IN_CONSOLE со значением non-cli, но могут возникнуть некоторые другие проблемы.

Добавьте переменную окружения APP_RUNNING_IN_CONSOLE=false в .env.

Использование пакета the-control-group/voyager

Зависимости пакета voyager arrilot/laravel-widgets, где WidgetGroupCollection является синглетоном, добавление виджета приведёт к повторному отображению, вам потребуется сбросить синглетон путём переопределения ServiceProvider.

// config/laravels.php
'register_providers' => [
    Arrilot\Widgets\ServiceProvider::class,
],

Использование пакета overtrue/wechat

Асинхронный уведомлений обратный вызов будет проваливаться, так как $app['request']->getContent() пустой, установите ему значение.

public function notify(Request $request)
{
    $app = $this->getPayment(); // Получение экземпляра платежа
    $app['request'] = $request; // Добавьте эту строку в исходный код и назначьте текущий экземпляр запроса к $app['request']
    $response = $app->handlePaidNotify(function ($message, $fail) use ($id) {
        // ...
    });
    return $response;
}

Использование пакета laracasts/flash

Сообщения Flash хранятся в памяти постоянно. Добавление к $messages при каждом вызове flash() приводит к множественным сообщениям. Есть два решения.

  1. Сбросьте $messages через middleware app('flash')->clear();.

  2. Перезапишите FlashServiceProvider после обработки запроса, см. register_providers.

Использование пакета laravel/telescope

Поскольку Swoole работает в режиме CLI, RequestWatcher не правильно распознает игнорируемые маршруты.

Решение:

  1. Добавьте переменную окружения APP_RUNNING_IN_CONSOLE=false в .env;
  2. Измените код.
// Редактирование файла `app/Providers/EventServiceProvider.php`, добавьте следующий код в метод `boot`
// use Laravel\Telescope\Telescope;
// use Illuminate\Support\Facades\Event;
Event::listen('laravels.received_request', function ($request, $app) {
    $reflection = new \ReflectionClass(Telescope::class);
    $handlingApprovedRequest = $reflection->getMethod('handlingApprovedRequest');
    $handlingApprovedRequest->setAccessible(true);
    $handlingApprovedRequest->invoke(null, $app) ? Telescope::startRecording() : Telescope::stopRecording();
});

Одиночный контроллер

  • Управляемый контроллер в Laravel 5.3+ связан с Route внутри Router, а Router является синглетоном, поэтому контроллер создаётся только один раз, и вы не можете инициализировать данные уровня запроса в конструкторе, что показывает неправильное использование.
namespace App\Http\Controllers;
class TestController extends Controller
{
    protected $userId;
    public function __construct()
    {
        // Неправильное использование: Так как контроллер создаётся только один раз и затем остаётся в памяти, $userId будет назначен только один раз, и последующие запросы будут неверно считывать $userId до его запроса
        $this->userId = session('userId');
    }
    public function testAction()
    {
        // Чтение $this->userId;
    }
}
  • Два решения (выберите одно):
  1. Избегайте инициализации данных уровня запроса в конструкторе, они должны читаться в конкретном действии. Это более логичный стиль программирования, рекомендуется использовать его.
# Список всех свойств всех контроллеров, связанных с вашими маршрутами.
php artisan laravels:list-properties
namespace App\Http\Controllers;
class TestController extends Controller
{
    protected function getUserId()
    {
        return session('userId');
    }
    public function testAction()
    {
        // Вызов $this->getUserId() для чтения $userId
    }
}
  1. Используйте механизм автоматического удаления контроллеров, предоставленный LaravelS.
// config/laravels.php
// Установите enable в true и exclude_list в [], что означает, что все контроллеры будут автоматически уничтожены.
'destroy_controllers' => [
    'enable' => true, // Отключите этот параметр, если хотите сохранить контроллеры
    'exclude_list' => [],
],

Эти функции нельзя вызывать

  • flush/ob_flush/ob_end_flush/ob_implicit_flush: swoole_http_response не поддерживает flush.

  • dd()/exit()/die(): немедленно завершают работу Worker/Task/Process, рекомендуется выбрасывать исключение для выхода из стека вызова функций.

  • header()/setcookie()/http_response_code(): используйте только Laravel/Lumen Response для создания HTTP-ответа в основе LaravelS.

Эти глобальные переменные нельзя использовать

  • $_GET/$_POST/$_FILES/$_COOKIE/$_REQUEST/$_SESSION/$GLOBALS, $_ENV являются читаемыми, $_SERVER является частично читаемым.

Ограничение размера

  • Максимальный размер заголовка GET-запроса составляет 8КБ, ограниченный Swoole, большие Cookies могут привести к ошибке парсинга Cookies.

  • Максимальный размер POST-данных/файлов ограничен Swoole package_max_length, по умолчанию .- Максимальный размер загрузки файла ограничен memory_limit, по умолчанию 128M.

Ограничение наблюдателей Inotify достигнуто

Предупреждение: inotify_add_watch(): Лимит пользователя на общее количество наблюдателей Inotify был достигнут

  • По умолчанию лимит Inotify равен 8192 для большинства Linux, но количество фактического проекта может превышать этот лимит, что приводит к невозможности наблюдать за объектами.

  • Увеличьте количество наблюдателей Inotify до 524288: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p, примечание: вам потребуется активировать privileged для Docker.

include/require и (include/require)_once

См. блог Laruence Не используйте (include/require)_once

  • Для включения файлов, содержащих классы/интерфейсы/traits/функции, рекомендуется использовать (include/require)_once. В других случаях используйте include/require.

  • В многопоточном режиме дочерний процесс наследует ресурсы родительского процесса. Как только родительский процесс включает файл, который требуется выполнить, дочерний процесс сразу вернет истину при использовании require_once(), что приводит к невозможности выполнения файла. Теперь вам следует использовать include/require.

Если Swoole < 1.9.17

После включения handle_static, статические файлы будут обрабатываться LaravelS. Из-за среды PHP, MimeTypeGuesser может некорректно распознавать mimeType. Например, JavaScript и CSS файлы будут распознаны как text/plain.

Решения:

  1. Обновите Swoole до 1.9.17+.

  2. Зарегистрируйте собственный гадатель MIME.

// MyGuessMimeType.php
use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface;

class MyGuessMimeType implements MimeTypeGuesserInterface
{
    protected static $map = [
        'js'  => 'application/javascript',
        'css' => 'text/css',
    ];

    public function guess($path)
    {
        $ext = pathinfo($path, PATHINFO_EXTENSION);

        if (strlen($ext) > 0) {
            return Arr::get(self::$map, $ext);
        } else {
            return null;
        }
    }
}
// AppServiceProvider.php
use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser;

public function boot()
{
    MimeTypeGuesser::getInstance()->register(new MyGuessMimeType());
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/hhxsv5-laravel-s.git
git@api.gitlife.ru:oschina-mirror/hhxsv5-laravel-s.git
oschina-mirror
hhxsv5-laravel-s
hhxsv5-laravel-s
PHP-8.x