2

これは、スタンドアロンのphpファイルでsimple_html_domがどのように機能するかの基本的な例です。

test.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

Webサイト(この例ではgoogle.com)のhtmlを正しくダンプします

それでは、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_domfalseを返す以外は何も言いません。

たとえば、タスクでこれを実行する場合:

$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)
}

タスクを使用すると、通常、このエラー(実際には通知)が発生します。問題はここにありsfCommandApplicationますob_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.iniこれを修正するもう1つの方法は、次のようにPHPからの通知を無効にすることです。

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