LaravelS
Swoole
запущен в режиме CLI
как сервер HTTP
, заменив FPM
.app('swoole')
, чтобы получить экземпляр Swoole\http\server
из контейнера Laravel
. Этот экземпляр внедряется в контейнер только при старте LaravelS
.LaravelS
, из-за межпроцессного взаимодействия, в следующих случаях вы не сможете успешно вызвать app('swoole')
:
FPM
/Apache PHP Module
, проверьте SAPI с помощью Log::info('PHP SAPI', [php_sapi_name()]);
.Измените конфигурацию
config/laravels.php
, добавивLaravelAdminCleaner
вcleaners
.
'cleaners' => [
Hhxsv5\LaravelS\Illuminate\Cleaners\LaravelAdminCleaner::class,
],
// Сброс Agent
\Event::listen('laravels.received_request', function (\Illuminate\Http\Request $req, $app) {
$app->agent->setHttpHeaders($req->server->all());
$app->agent->setUserAgent();
});
Официально не поддерживается в режиме
CLI
, но можно активировать путём изменения переменной окруженияAPP_RUNNING_IN_CONSOLE
до значения отличного отCLI
, однако после этого могут возникнуть другие проблемы.
Добавьте переменную окружения APP_RUNNING_IN_CONSOLE=false
в .env
.
Voyager
зависит от пакетаarrilot/laravel-widgets, гдеWidgetGroupCollection
является одиночкой, что приводит к повторному отображению виджетов. Это можно исправить путём переопределения ServiceProvider.
// config/laravels.php
'register_providers' => [
Arrilot\Widgets\ServiceProvider::class,
],
При использовании пакета
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;
}
После постоянного хранения в памяти каждый вызов
flash()
добавляет сообщение, что приводит к накоплению сообщений. Есть два решения:
Используйте middleware для очистки $messages
перед каждым запросом app('flash')->clear();
.
Переегистрировать FlashServiceProvider
после каждого запроса, настроив [register_providers]
.
Поскольку
Swoole
работает в режимеCLI
, это приводит к тому, чтоRequestWatcher
не может корректно игнорировать маршруты.
Решение:
APP_RUNNING_IN_CONSOLE=false
в .env
;// Измените `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;
}
}
# Выполните команду для вывода всех свойств всех связанных контроллеров
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()
}
}
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.
Swoole
ограничивает максимальный размер заголовков GET запроса до 8KB
, рекомендуется не делать Cookie слишком большими, чтобы избежать ошибок парсинга.- Размер POST данных или загрузки файлов ограничен конфигурацией Swoole
параметром package_max_length
, по умолчанию максимум 2МБ
.
Размер загрузки файла ограничен значением memory_limit
(manual), по умолчанию 128МБ
.
Предупреждение: 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)_once
Для импорта классов, интерфейсов, трейтов и функций используйте (include/require)_once, во всех остальных случаях используйте include/require.
В многопоточной среде, потоки наследуют ресурсы родителя, если родительский поток уже выполнил какой-то файл, то повторное выполнение require_once() в потомках вернет true
, что приведёт к ошибке выполнения этого файла. В этом случае вам следует использовать include/require.
Swoole < 1.9.17
После включения
handle_static
, статические файлы будут обрабатываться компонентомLaravelS
. Из-за особенностей PHP окружения, MIME типы могут быть некорректно определены, например JavaScript и CSS файлы могут быть распознаны какtext/plain
.
Решение:
Обновите Swoole до версии 1.9.17+
Зарегистрируйте собственный 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 )