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

OSCHINA-MIRROR/hhxsv5-laravel-s

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

Часто задаваемые вопросы

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

  • В LaravelS Swoole запущен в режиме CLI как сервер HTTP, заменив FPM.
  • Отправка задач, триггер асинхронных событий вызывают app('swoole'), чтобы получить экземпляр Swoole\http\server из контейнера Laravel. Этот экземпляр внедряется в контейнер только при старте LaravelS.
  • Поэтому, если вы отключаетесь от LaravelS, из-за межпроцессного взаимодействия, в следующих случаях вы не сможете успешно вызвать app('swoole'):
    • Код, выполняющийся различными способами через командную строку, например, команды Artisan, скрипты PHP;
    • Код, работающий в режимах FPM/Apache PHP Module, проверьте 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 до значения отличного от 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

При использовании пакета easywechat может произойти проблема с асинхронным обратным вызовом, поскольку $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() добавляет сообщение, что приводит к накоплению сообщений. Есть два решения:

  1. Используйте middleware для очистки $messages перед каждым запросом 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, который является одиночкой, поэтому контроллеры создаются только один раз. Таким образом, нельзя инициализировать данные уровня запроса в конструкторе, так как они будут инициализированы только один раз. Ниже показан пример неверного использования.
namespace App\Http\Controllers;
class TestController extends Controller
{
    protected $userId;
    public function __construct()
    {
        // Неверное использование: поскольку контроллер создается только один раз, он будет постоянно находиться в памяти, то есть $userId будет инициализирован только один раз, и последующие запросы будут ошибочно читать значение $userId из предыдущего запроса
        $this->userId = session('userId');
    }
    public function testAction()
   bcm_error_func(1)
    {
        // Чтение $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->userId через вызов $this->getUserId()
    }
}
  1. Используйте механизм автоматического удаления контроллеров, предоставленный LaravelS.
// config/laravels.php
// Установите enable в true и excluded_list в [], чтобы указать автоматическое удаление всех контроллеров
'destroy_controllers'      => [
    'enable'        => true, // Активация автоматического удаления контроллеров
    'excluded_list' => [
        //\App\Http\Controllers\TestController::class, // Список контроллеров, которые не следует удалять
    ],
],

Функции, которые не следует использовать

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

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

  • header()/setcookie()/http_response_code(): HTTP ответы должны отправляться через объект Response Laravel/Lumen.

Глобальные переменные, которые не следует использовать

  • $_GET, $_POST, $_FILES, $_COOKIE, $_REQUEST, $_SESSION, $GLOBALS, $_ENV доступны для чтения, $_SERVER частично доступна для чтения.

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

  • Swoole ограничивает максимальный размер заголовков GET запроса до 8KB, рекомендуется не делать Cookie слишком большими, чтобы избежать ошибок парсинга.- Размер POST данных или загрузки файлов ограничен конфигурацией Swoole параметром package_max_length, по умолчанию максимум 2МБ.

  • Размер загрузки файла ограничен значением memory_limit (manual), по умолчанию 128МБ.

Предупреждение: достигнута максимальная граница количества прослушки Inotify

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

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

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

Обратите внимание на include/require и (include/require)_once

Прочитайте статью брата Ларуэнса ещё раз, не используйте (include/require)_once

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

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

Для окружений Swoole < 1.9.17

После включения handle_static, статические файлы будут обрабатываться компонентом LaravelS. Из-за особенностей PHP окружения, MIME типы могут быть некорректно определены, например 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