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;
Другие вопросы по тегам