如何解决出于安全原因已禁用 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 举报,一经查实,本站将立刻删除。