2

这是 simple_html_dom 如何在独立 php 文件中工作的基本示例。

测试.php:

include ('simple_html_dom.php');

$url = "http://www.google.com";
$html = new simple_html_dom();
$html->load_file($url);

print $html;

如果我使用以下命令执行它:php test.php

它正确转储网站的 html(在本例中为 google.com)

现在让我们看一个使用 Symfony 任务的基本代码示例:

class parserBasic extends sfBaseTask {
  public function configure()
  {
    $this->namespace = 'parser';
    $this->name      = 'basic';
  }

  public function execute($arguments = array(), $options = array())
  {
    $url = "http://www.google.com";
    $html = new simple_html_dom();
    $html->load_file($url);
    print $html;
  }
}

该文件位于:<appname>/lib/task

我不需要在文件中包含库,因为在lib/task文件夹下,它会自动加载。

我使用以下命令执行任务:php symfony parser:basic

我收到以下错误消息:

PHP Fatal error:  
Call to a member function innertext() on a non-object in
/home/<username>/<appname>/lib/task/simple_html_dom.php on line 1688

有什么建议么?

4

1 回答 1

2

问题来自 Symfony。

事实上,如果在加载文件时出现错误simple_html_dom,它只会返回 false。

例如,如果您在任务中执行此操作:

$url = "http://www.google.com";
$html = new simple_html_dom();
$res = $html->load_file($url);
if (false === $res)
{
    throw new Exception("load_file failed.");
}
print $html;

你会得到一个例外。如果您simple_html_dom在加载文件时调整以显示错误,大约在第 1085 行:

// load html from file
function load_file()
{
    $args = func_get_args();
    $this->load(call_user_func_array('file_get_contents', $args), true);
    // Throw an error if we can't properly load the dom.

    if (($error=error_get_last())!==null) {
        // I added this line to see any errors
        var_dump($error);

        $this->clear();
        return false;
    }
}

你会看见:

array(4) {
  ["type"]=>
  int(8)
  ["message"]=>
  string(79) "ob_end_flush(): failed to delete and flush buffer. No buffer to delete or flush"
  ["file"]=>
  string(62) "/home/.../symfony.1.4/lib/command/sfCommandApplication.class.php"
  ["line"]=>
  int(541)
}

我通常在使用任务时遇到这个错误(实际上是一个通知)。问题就在这里,在sfCommandApplicationob_end_flush

/**
 * Fixes php behavior if using cgi php.
 *
 * @see http://www.sitepoint.com/article/php-command-line-1/3
 */
protected function fixCgi()
{
  // handle output buffering
  @ob_end_flush();
  ob_implicit_flush(true);

为了解决这个问题,我用@ob_end_flush();. 一切都很顺利。我知道,这是一个丑陋的修复,但它的工作原理。解决此问题的另一种方法是禁用来自 PHP (in php.ini) 的通知,例如:

// Report all errors except E_NOTICE
error_reporting = E_ALL ^ E_NOTICE
于 2012-09-20T09:39:55.477 回答