注意:使用未定义的常量 STDOUT - 假定为“STDOUT”

Posted

技术标签:

【中文标题】注意:使用未定义的常量 STDOUT - 假定为“STDOUT”【英文标题】:Notice: Use of undefined constant STDOUT - assumed 'STDOUT' 【发布时间】:2013-07-20 02:15:17 【问题描述】:

我正在尝试在 Xampp 中设置 Amazon Aws php SDK。

安装 SDK 后,我尝试使用以下代码从 Amazon S3 下载存储桶。

<?php

error_reporting(-1);
ini_set('display_errors', 'on');

include_once ('aws/aws-autoloader.php');
use Aws\S3\S3Client;

$client = S3Client::factory(array(
     'key'    => '__my__key__',
     'secret' => '__secret__key__'
));

$destination = 'downloaded_bucket';
$source_bucket = '__my__bucket__name';
$key_prefix = '';
$options = array('debug'=>true);

$client -> downloadBucket($destination,$source_bucket,$key_prefix,$options);
?>

现在从我的浏览器执行这个 php,我得到以下错误。

Notice: Use of undefined constant STDOUT - assumed 'STDOUT' in __my__path\Aws\S3\Sync\AbstractSyncBuilder.php on line 294
STDOUT
Warning: fwrite() expects parameter 1 to be resource, string given in __my__path\Aws\S3\Sync\DownloadSyncBuilder.php on line 124
STDOUT
Warning: fwrite() expects parameter 1 to be resource, string given in __my__path\Aws\S3\Sync\DownloadSyncBuilder.php on line 124
STDOUT
Warning: fwrite() expects parameter 1 to be resource, string given in __my__path\Aws\S3\Sync\DownloadSyncBuilder.php on line 124

最后 3 个警告是由于第一个通知而发生的,因为传递的不是资源,而是字符串“STDOUT”。

第一次通知的原因是什么? 本通知的代码段为

if ($this->debug) 
            $this->addDebugListener($sync, is_bool($this->debug) ? STDOUT : $this->debug);
        

这是 SDK 的一部分。 而 fwrite 警告代码的罪魁祸首是 addDebugListener 函数

protected function addDebugListener(AbstractSync $sync, $resource)
    
       //blah blah
       fwrite($resource, "Downloading $from -> $to\n");
       //blah blah
    

我的 PHP 版本是 5.4.16

【问题讨论】:

如果没有定义STDOUT,你可能需要定义它,第124行是什么 我认为还有一些其他的引导文件没有被包括在内,应该是..一个有define("STDOUT", "php://output"); @DevZer0 fwrite 调用。已更新问题。 STDOUT 在从命令行运行 PHP 时自动可用。你是通过浏览器运行的吗? 【参考方案1】:

在这种情况下,问题是常量STDOUT 没有定义。它是使用命令行时可用的常量,因此为了在其他设置中使用它们,您可以这样做:

if(!defined('STDIN'))  define('STDIN',  fopen('php://stdin',  'rb'));
if(!defined('STDOUT')) define('STDOUT', fopen('php://stdout', 'wb'));
if(!defined('STDERR')) define('STDERR', fopen('php://stderr', 'wb'));

这将检查常量是否已定义,如果没有,则根据预期的工作方式定义它们。

更多关于常量的信息可以在here in the PHP docs找到。

【讨论】:

您能否通过解释代码的作用来改进这个答案? 参见:php.net/manual/en/features.commandline.io-streams.php PHP 的 CLI 接口定义了 STDINSTDOUTSTDERR,它们是引用能够从 (STDIN) 读取或写入的文件句柄的常量(STDOUT, STDERR) 标准 I/O 流。因为这些仅由 CLI 接口定义,所以您不能在 Web 应用程序中使用它们,除非您自己定义它们。上面的三行就是这样做的,但前提是它们不仅被定义,而且是安全的。实际上,Web 应用程序可能不需要足够频繁地访问它们以使它们成为常量。 警告,在 FPM 上下文中,STDIN 是 php://input ,而不是 php://stdin ,而 STDOUT 是 php://output ,而不是 php://stdout (但我认为 STDERR 是还是 php://stderr ) @hanshenrik,不,不幸的是,我刚到这里是因为 STDERR 在我的 FPM 设置中未定义。谁能告诉我为什么? (“Web 应用程序可能不需要经常访问它们”这是真的,但我不太确定默认情况下禁用每个不常用的功能是个好主意。:)) @Sz。如果你正在寻找原始的 http 请求正文,那么它在 php://input,无论如何你想从 STDIN 得到什么?【参考方案2】:

您应该在自己的代码中添加类似:

define("STDOUT", fopen('log.txt', 'w'));

有关传输文件的信息将记录到文件“log.txt”中。

【讨论】:

以上是关于注意:使用未定义的常量 STDOUT - 假定为“STDOUT”的主要内容,如果未能解决你的问题,请参考以下文章

警告:更新到 PHP 7.2 后使用未定义的常量 _ - 假定为“_”(这将在 PHP 的未来版本中引发错误)

使用未定义的常量 MCRYPT_RIJNDAEL_128 - 假定为“MCRYPT_RIJNDAEL_128”

使用未定义的常量用户 - 假定用户使用 php7.2

为啥显示以下错误? [复制]

Codeigniter CSS、JS 和图像未加载,可能假定为目录

error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int