尝试获取真正的 Laravel 单例:
- 服务等级:
<?php
namespace App\Services;
use Illuminate\Support\Facades\Log;
class SingleTest
{
public function __construct(
public string $var
) {
Log::info('init instance');
}
}
- 将此服务注册为单例:
<?php
namespace App\Providers;
use App\Services\SingleTest;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->singleton(SingleTest::class, fn() => new SingleTest('test singleton'));
}
}
- 我的检查路线(web.php):
Route::get('/test1', fn() => app(SingleTest::class)->var);
Route::get('/test2', fn() => app(SingleTest::class)->var);
然后我 curl /test1 和 /test2 路由:
- 卷曲打印
test singleton
两次 - 很好。 - 根据日志,我期望构造函数仅被调用一次并
init instance
出现一次。不,我看到 2 条消息,这意味着也创建了 SingleTest 的第二个实例。它不是单例。
PHP 是一种“无共享架构”,单例不会在 HTTP 请求中持续存在,因为应用程序在每次请求时都会重新启动。
如果您想在请求之间保留它们,则可以使用 Laravel Octane,因为它会启动您的应用程序一次(每个工作程序),允许多个请求共享同一个单例,直到工作程序被重置或被垃圾收集。