php - 出于安全原因已禁用 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 设置。它们完全匹配,并且该功能未标记为禁用。
编译时指令是否以某种方式禁用了此功能?
解决方案
这里的问题出在我的引导/自动加载功能中。它正在这样做
<?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;
推荐阅读
- ios - iOS UNUserNotificationCenter didReceiveNotificationResponse 仅在应用程序在后台打开时运行代码
- ios - “任何”类型的 Swift OpenWeatherMap API 值错误
- c# - 不会出现对话框
- php - 返回下划线的简单 HTML DOM
- direct3d12 - 如何将 D3D11On12 渲染目标映射到内存?
- hyperledger-fabric - Hyperledger Fabric 网络 - 使用 JAVA sdk - 创建通道时出错
- css - Bootstrap 4网格布局一行三列,然后用一列填满整个空间后的另一行
- json - GoogleScripts - 如何根据单元格值发送电子邮件
- angular - Ng2samrt 表:自定义列
- docker - 无法创建 /etc/nginx/nginx.conf:目录不存在和启动容器导致“exec:\”supervisord\“:$PATH 中找不到可执行文件”