我正在尝试使用内置的PHP 5.3安装在OS X上安装PEAR。我这样做了:
curl http://pear.php.net/go-pear > go-pear.php
php go-pear.php
在回答了一些提示后,我开始收到大量错误:
Deprecated: Assigning the return value of new by reference is deprecated in /Users/username/bin/pear/temp/PEAR.php on line 563
PHP Deprecated: Assigning the return value of new by reference is deprecated in /Users/username/bin/pear/temp/PEAR.php on line 566
现在,我明白这些错误意味着什么。我只想隐藏它们。所以在我的/private/etc/php.ini
文件中,我有以下内容:
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
这会在我自己的代码中隐藏相同的错误。但是在PEAR中却没有。他们似乎正在改变error_reporting级别。
有没有好办法解决这个问题?
答案 0 :(得分:2)
@kguest
我无法在配置列表中找到“php_ini”。
@JW
我通过更改PEAR命令行的内部错误处理程序的行为来解决问题: 在文件/usr/share/pear/pearcmd.php文件的底部,将error_handler的主体更改为:
if ($errno & error_reporting()) {
$errortype = array (
E_ERROR => "Error",
E_WARNING => "Warning",
E_PARSE => "Parsing Error",
E_NOTICE => "Notice",
E_CORE_ERROR => "Core Error",
E_CORE_WARNING => "Core Warning",
E_COMPILE_ERROR => "Compile Error",
E_COMPILE_WARNING => "Compile Warning",
E_USER_ERROR => "User Error",
E_USER_WARNING => "User Warning",
E_USER_NOTICE => "User Notice"
);
$prefix = $errortype[$errno];
global $_PEAR_PHPDIR;
if (stristr($file, $_PEAR_PHPDIR)) {
$file = substr($file, strlen($_PEAR_PHPDIR) + 1);
} else {
$file = basename($file);
}
print "\n$prefix: $errmsg in $file on line $line\n";
}
这将使PEAR命令与您的php.ini错误报告级别兼容。 (对peclcmd.php也这样做)
顺便说一下,这个函数用于读取带有
的空配置描述符$GLOBALS['config']->get('verbose') < 4
所以我尝试更改PEAR配置中的详细级别,但它什么也没做(但这条线在达到时会引发致命错误)。
我不知道PEAR维护者在创建这个组件时会想到什么,但他们至少可以提供隐藏错误的方法。
答案 1 :(得分:2)
问题是PEAR与PHP 5.3不兼容,当你尝试在PHP 5.3下运行它时,它可以工作,但你会收到很多弃用警告。
更糟糕的是,PEAR命令行工具的行为是当PHP遇到错误时,无论“display_errors”INI设置的设置,甚至“report_errors”设置,所有错误都会被捕获并显示在标准输出上(并且需要额外的空行来启动,因此会更加烦人)。
有几种方法可以解决这个问题,但它们都涉及直接在您的计算机上编辑pear的代码。我最终做的是编辑PEAR安装的'pearcmd.php'文件,并将print "..."
命令最后(在error_handler
函数中)更改为file_put_contents("php://stderr","...");
(其中{{ 1}}代表代码中的正确文本)。这会导致所有错误消息输出到标准错误流而不是标准输出 - 因为它应该首先完成,然后您可以在pear命令之后添加...
以使错误消息静音如果你不想看到它们。
答案 2 :(得分:0)
在我看来,您需要更改梨配置设置:
$pear config-set php_ini /private/etc/php.ini
您可以通过
确认此设置$pear config-get php_ini
或
$pear config-show
答案 3 :(得分:0)
不幸的是,PEAR包的维护者有时并不真正关心这些类型的错误(我遇到过a similar problem,这被认为是伪造的)。所以我不会指望这些错误很快得到修复。
我的解决方案是将php.ini中的error_reporting
值设置为仅显示真实(致命)错误,并在您自己的应用程序中调整此值。为了获得最佳行为,您当然应该首先这样做。像这样:
<?php
// include required PEAR classes
require_once('PEAR.php');
class Application() {
public static main() {
// get $errlevel value from some sort of configuration
error_reporting($errlevel);
}
}
$myApp = Application::main();
?>