setlocale() отключен по соображениям безопасности
PHP 7.4.16 (ZTS) с
parallel
установленное расширение под управлением Laravel 7.
ini_get('disable_functions');
возвращает пустую строку.
Я могу написать сценарий, который вызывает
setlocal(0,0)
из основного процесса, и он работает без исключения. Эта ошибка возникает, когда библиотека пытается вызвать ее из
parallel/Runtime
нить.
$disabled = ini_get('disable_functions'); // empty string
//works
setlocale(0,0);
$thread = new \parallel\Runtime(app_path().'/../bootstrap/parallel.php');
$future = $thread->run(function() {
$disabled = ini_get('disable_functions'); // empty string
// throws setlocale() has been disabled for security reasons
setlocale(0, 0);
});
var_dump([
'value' => $future->value(),
'cancelled' => $future->cancelled(),
'done' => $future->done(),
]);
Я сбросил все настройки ini, как внутри
parallel\Runtime
нить и за ее пределами. Они точно совпадают, и функция не помечена как отключенная.
Эта функция каким-то образом отключена директивой времени компиляции?
1 ответ
Проблема здесь была в моей функции начальной загрузки / автозагрузки. Он делал это
<?php
require __DIR__ . '/autoload.php';
/** @var \Illuminate\Foundation\Application $app */
$app = require __DIR__.'/app.php';
$app->make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap();
return $app;
\Illuminate\Contracts\Console\Kernel->bootstrap()
каким-то образом нарушает работу setlocale(), хотя она не устанавливает ini_set(). Я еще не прошел через это при отладке, чтобы знать наверняка.
Рабочий код начальной загрузки:
<?php
require __DIR__ . '/autoload.php';
/** @var \Illuminate\Foundation\Application $app */
$app = require __DIR__.'/app.php';
$app->register(\App\Providers\AppServiceProvider::class)
->runningInThread(true);
return $app;