微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决出于安全原因已禁用 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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?