PHP - 回显还是不回应?

时间:2010-02-07 13:28:34

标签: php performance

回显HTML或有多个打开和关闭的php标记,效率更高和/或什么是更好的做法?

显然,对于大范围的HTML,打开和关闭php标签是明智的。在处理生成XML这样的事情时呢?您是应该为每个数据打开和关闭带有单个回显的php标记,还是使用带引号中包含的XML标记的单个回显?

7 个答案:

答案 0 :(得分:20)

从维护的角度来看,应该尽可能将HTML / XML与代码分开,以便即使是非技术人员也可以轻松地进行微小的更改。

标记的同质块越多,工作就越清晰。

实现这一目标的一种方法是尽可能多地准备变量,并使用heredoc syntax

// Preparation

$var1 = get_value("yxyz");
$var2 = get_url ("abc");
$var3 = ($count = 0 ? "Count is zero" : "Count is not zero");
$var4 = htmlentities(get_value("def"));

// Output  

echo <<<EOT

 <fieldset title="$var4">
   <ul class="$var1">
     <li>
       $var2
     </li>
   </ul>
  </fieldset>

EOT;

当然,您会想要使用更合理的变量名称。

编辑 @stesch在评论中指出的链接提供了在生成XML时使用序列化程序的一些好的论据,并且通过扩展,甚至HTML,而不是如上所示将其打印出来。我不认为在每个情况下都需要一个序列化程序,特别是从维护的角度来看,模板所以更容易编辑,但链接非常值得阅读。 HOWTO Avoid Being Called a Bozo When Producing XML

逻辑和内容分离的另一个重要优势是,如果转换到模板引擎,或者有一天需要引入缓存,那么实现它几乎是无痛的,因为逻辑和代码已经分离了。

答案 1 :(得分:4)

PHP通过所谓的heredocs解决了这个问题。 Check it out please.

示例:

  echo <<<EOD
  <td class="itemname">{$k}s</td>
  <td class="price">{$v}/kg</td>
EOD;

注意: heredoc标识符(本例中为EOD)不得有任何空格或缩进。

答案 2 :(得分:3)

无论哪个对你有意义。即使大回声更快,性能差异也是微不足道的。

但是大字符串的回声很难读,更多<?php echo $this->that; ?>讲故事:)

答案 3 :(得分:2)

echo在请求处理链中进一步发送其参数,并最终通过说网络套接字将该字符串发送到客户端。根据{{​​1}}与底层软件层(例如网络服务器)一起工作的方式,有时您的脚本可能能够比将数据推送到客户端更快地执行。没有输出缓冲,就是这样。使用输出缓冲,您可以交换内存以获得速度 - 您echo更快,因为它们会累积在内存缓冲区中。但前提是没有隐式缓冲。我们必须检查Apache源代码,看看它如何处理PHP echo数据。

也就是说,以下任何内容都适用于仅支持输出缓冲的脚本,因为如果没有它,您尝试推送的数据越多,您必须等待的时间越长(客户端必须通过TCP方式接收和确认它! )。

一次发送大字符串比 N stdout连接输出更有效。通过类似的逻辑,解释器进入PHP代码块(SGML / XML标记中的PHP处理指令)一次比进入和退出多次更有效。

至于我,我使用的不是echo,而是使用XML DOM API。这也与上面链接的文章一致。 (我重新打印链接:http://hsivonen.iki.fi/producing-xml/)这也回答了是否使用一个或多个PHP标签的问题。使用一个标签作为整个脚本,让它组装生成的标记并将其发送给客户端。

答案 4 :(得分:1)

就个人而言,我倾向于选择看起来最佳,因为代码可读性非常重要,特别是在团队环境中。在最佳实践方面,我担心我不确定通常最佳做法是优化最后的含义,你应该首先写它是为了可读性,然后如果你遇到速度问题做一些重构。

除非您正在进行数百万次回声,否则您在效率方面遇到的任何问题都可能出现在代码的其他地方。

要考虑的另一件事是使用MVC将您的“视图”与所有业务逻辑分开,这是一种非常干净的代码方式。使用像smarty这样的模板框架可以更进一步,从而获得史诗般的胜利。

答案 5 :(得分:1)

无论你做什么,都不要打印XML!

请参阅HOWTO Avoid Being Called a Bozo When Producing XML

答案 6 :(得分:1)

我很久以前就提出了同样的问题并提出了相同的答案,这并没有太大的区别。我用这个测试来推断这个答案:

<?
    header('content-type:text/plain');
    for ($i=0; $i<10; $i++) {
        $r = benchmark_functions(
               array('output_embeed','output_single_quote','output_double_quote'),
               10000);
        var_dump($r);
    }

    function output_embeed($i) {
        ?>test <?php echo $i; ?> :)<?
    }

    function output_single_quote($i) {
        echo 'test '.$i.' :)';
    }

    function output_double_quote($i) {
        echo "test $i :)";
    }

    function benchmark_functions($functions, $amount=1000) {
        if (!is_array($functions)||!$functions)
            return(false);
        $result = array();
        foreach ($functions as $function)
            if (!function_exists($function))
                return(false);
        ob_start();
        foreach ($functions as $idx=>$function) {
            $start = microtime(true);
            for ($i=0;$i<$amount;$i++) {
                $function($idx);
            }
            $time = microtime(true) - $start;
            $result[$idx.'_'.$function] = $time;
        }
        ob_end_clean();
        return($result);
    }
?>