LaravelS
, Swoole
является HTTP сервером
, запущенным в режиме CLI
, заменяющим FPM
.app('swoole')
, чтобы получить экземпляр Swoole\http\server
из контейнера Laravel
. Этот экземпляр внедряется в контейнер только при старте LaravelS
.LaravelS
, из-за межпроцессного взаимодействия, вы не сможете успешно вызвать app('swoole')
:
FPM
/Apache PHP модуль
, просмотр 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
со значениемnon-cli
, но могут возникнуть некоторые другие проблемы.
Добавьте переменную окружения APP_RUNNING_IN_CONSOLE=false
в .env
.
Зависимости пакета
voyager
arrilot/laravel-widgets, гдеWidgetGroupCollection
является синглетоном, добавление виджета приведёт к повторному отображению, вам потребуется сбросить синглетон путём переопределения ServiceProvider.
// config/laravels.php
'register_providers' => [
Arrilot\Widgets\ServiceProvider::class,
],
Асинхронный уведомлений обратный вызов будет проваливаться, так как
$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 хранятся в памяти постоянно. Добавление к
$messages
при каждом вызовеflash()
приводит к множественным сообщениям. Есть два решения.
Сбросьте $messages
через middleware 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();
});
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;
}
}
# Список всех свойств всех контроллеров, связанных с вашими маршрутами.
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
}
}
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.
читаемыми
, $_SERVER является частично читаемым
.Максимальный размер заголовка GET-запроса составляет 8КБ
, ограниченный Swoole
, большие Cookies
могут привести к ошибке парсинга Cookies.
Максимальный размер POST-данных/файлов ограничен Swoole
package_max_length, по умолчанию 2М
.- Максимальный размер загрузки файла ограничен memory_limit, по умолчанию 128M
.
Предупреждение: 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.
См. блог 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
.
Решения:
Обновите 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 )