首页 > 解决方案 > 出于安全原因已禁用 setlocale()

问题描述

parallel安装了运行 Laravel 7的扩展的 PHP 7.4.16 (ZTS) 。

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(),
        ]);

我已经转储了parallel\Runtime线程内部和外部的所有 ini 设置。它们完全匹配,并且该功能未标记为禁用。

编译时指令是否以某种方式禁用了此功能?

标签: phplaravellaravel-7zts

解决方案


这里的问题出在我的引导/自动加载功能中。它正在这样做

<?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;

推荐阅读