出于安全原因已禁用 setlocale()

问题描述

安装了 parallel 扩展的 PHP 7.4.16 (ZTS),运行 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(),]);

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

这个函数是否被编译时指令以某种方式禁用了?

解决方法

这里的问题出在我的引导程序/自动加载功能中。原来是这样做的

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...