IAM 角色名称在 Yii 1 中被视为 Class
IAM Role Name considred as Class in Yii 1
我已将策略附加到 EC2 IAM 角色以访问 AWS 服务。之后我在 Yii 1 控制器文件中使用了以下代码:
ExampleController.php
class ExampleController extends Controller
{
public function init()
{
require_once dirname(dirname(__FILE__)) . '/extensions/awsv3/vendor/autoload.php';
$config = array(
'version' => 'latest',
'region' => 'us-west-2',
);
$s3_instance = new \Aws\Ssm\SsmClient($config);
$result = $s3_instance->getParameters([
'Names' => array('host_name'),
'WithDecryption' => true
]);
//converting S3 private data to array to read
$keys = $result->toArray();
var_dump($keys);
exit("Exit");
}
}
输出
PHP warning
include(TestRole.php): failed to open stream: No such file or directory
注意:TestRole 是 IAM 角色名称。
我在单个 PHP 文件中使用了相同的代码(与 Yii1 无关)
test.php
require_once 'protected/extensions/awsv3/vendor/autoload.php';
$config = array(
'version' => 'latest',
'region' => 'us-west-2',
);
$s3_instance = new \Aws\Ssm\SsmClient($config);
$result = $s3_instance->getParameters([
'Names' => array('host_name'),
'WithDecryption' => true
]);
//converting S3 private data to array to read
$keys = $result->toArray();
var_dump($keys);
exit("Exit");
array(3) { ["Parameters"]=> array(1) { [0]=> array(3) { ["Name"]=> string(12) "host_name" ["Type"]=> string(6) "String" ["Value"]=> string(9) "localhost" } } ["InvalidParameters"]=> array(0) { } ["@metadata"]=> array(4) { ["statusCode"]=> int(200) ["effectiveUri"]=> string(35) "https://ssm.us-west-2.amazonaws.com" ["headers"]=> array(4) { ["x-amzn-requestid"]=> string(36) "d3fb85bc-da4e-494b-be4f-b31fe3814100" ["content-type"]=> string(26) "application/x-amz-json-1.1" ["content-length"]=> string(3) "182" ["date"]=> string(29) "Tue, 19 Jun 2018 12:28:50 GMT" } ["transferStats"]=> array(1) { ["http"]=> array(1) { [0]=> array(0) { } } } } } Exit
它使用单个 php 文件。
所以问题是如何在 Yii 1 中修复它以及为什么它会将 IAM 角色名称视为 Class 文件?
堆栈跟踪
感谢@javierfdezg,我能够解决这个问题。
基本上,Yii 的自动加载器和 AWS 的自动加载器发生了冲突,这可能是由于 Yii 假设 class 名称必须与文件名匹配。
所以首先我注销了 Yii 的自动加载,然后在 api 调用完成后再次注册它。
class ExampleController extends Controller
{
public function init()
{
/* Unregister YiiBase */
spl_autoload_unregister(array('YiiBase', 'autoload'));
require_once dirname(dirname(__FILE__)) . '/extensions/awsv3/vendor/autoload.php';
$config = array(
'version' => 'latest',
'region' => 'us-west-2',
);
$s3_instance = new \Aws\Ssm\SsmClient($config);
$result = $s3_instance->getParameters([
'Names' => array('host_name'),
'WithDecryption' => true
]);
/* Register YiiBase */
spl_autoload_register(array('YiiBase', 'autoload'));
$keys = $result->toArray();
var_dump($keys);
exit("Exit");
}
}
您可以将 Yii::$enableIncludePath
设置为 false
- 它应该会提高与其他自动加载器的兼容性。
Yii::$enableIncludePath = false;
此后 Yii 将停止盲目包含 class 文件,假设它们位于 include_path
中指定的目录之一。如果 class 无法被 Yii 自动加载器加载,下一个自动加载器将有机会。
我已将策略附加到 EC2 IAM 角色以访问 AWS 服务。之后我在 Yii 1 控制器文件中使用了以下代码:
ExampleController.php
class ExampleController extends Controller
{
public function init()
{
require_once dirname(dirname(__FILE__)) . '/extensions/awsv3/vendor/autoload.php';
$config = array(
'version' => 'latest',
'region' => 'us-west-2',
);
$s3_instance = new \Aws\Ssm\SsmClient($config);
$result = $s3_instance->getParameters([
'Names' => array('host_name'),
'WithDecryption' => true
]);
//converting S3 private data to array to read
$keys = $result->toArray();
var_dump($keys);
exit("Exit");
}
}
输出
PHP warning
include(TestRole.php): failed to open stream: No such file or directory
注意:TestRole 是 IAM 角色名称。
我在单个 PHP 文件中使用了相同的代码(与 Yii1 无关)
test.php
require_once 'protected/extensions/awsv3/vendor/autoload.php';
$config = array(
'version' => 'latest',
'region' => 'us-west-2',
);
$s3_instance = new \Aws\Ssm\SsmClient($config);
$result = $s3_instance->getParameters([
'Names' => array('host_name'),
'WithDecryption' => true
]);
//converting S3 private data to array to read
$keys = $result->toArray();
var_dump($keys);
exit("Exit");
array(3) { ["Parameters"]=> array(1) { [0]=> array(3) { ["Name"]=> string(12) "host_name" ["Type"]=> string(6) "String" ["Value"]=> string(9) "localhost" } } ["InvalidParameters"]=> array(0) { } ["@metadata"]=> array(4) { ["statusCode"]=> int(200) ["effectiveUri"]=> string(35) "https://ssm.us-west-2.amazonaws.com" ["headers"]=> array(4) { ["x-amzn-requestid"]=> string(36) "d3fb85bc-da4e-494b-be4f-b31fe3814100" ["content-type"]=> string(26) "application/x-amz-json-1.1" ["content-length"]=> string(3) "182" ["date"]=> string(29) "Tue, 19 Jun 2018 12:28:50 GMT" } ["transferStats"]=> array(1) { ["http"]=> array(1) { [0]=> array(0) { } } } } } Exit
它使用单个 php 文件。
所以问题是如何在 Yii 1 中修复它以及为什么它会将 IAM 角色名称视为 Class 文件?
堆栈跟踪
感谢@javierfdezg,我能够解决这个问题。
基本上,Yii 的自动加载器和 AWS 的自动加载器发生了冲突,这可能是由于 Yii 假设 class 名称必须与文件名匹配。
所以首先我注销了 Yii 的自动加载,然后在 api 调用完成后再次注册它。
class ExampleController extends Controller
{
public function init()
{
/* Unregister YiiBase */
spl_autoload_unregister(array('YiiBase', 'autoload'));
require_once dirname(dirname(__FILE__)) . '/extensions/awsv3/vendor/autoload.php';
$config = array(
'version' => 'latest',
'region' => 'us-west-2',
);
$s3_instance = new \Aws\Ssm\SsmClient($config);
$result = $s3_instance->getParameters([
'Names' => array('host_name'),
'WithDecryption' => true
]);
/* Register YiiBase */
spl_autoload_register(array('YiiBase', 'autoload'));
$keys = $result->toArray();
var_dump($keys);
exit("Exit");
}
}
您可以将 Yii::$enableIncludePath
设置为 false
- 它应该会提高与其他自动加载器的兼容性。
Yii::$enableIncludePath = false;
此后 Yii 将停止盲目包含 class 文件,假设它们位于 include_path
中指定的目录之一。如果 class 无法被 Yii 自动加载器加载,下一个自动加载器将有机会。