为什么我不应该使用shell_exec而不是输出缓冲来包含'将文件转换为变量?

时间:2016-04-15 18:01:17

标签: php include shell-exec output-buffering

我有一个模板可以处理每个页面上重复的各种内容。问题是,所有不同的东西都会进入模板的中间。大多数人都熟悉这一点,但这里有一些伪标签作为视觉辅助:

<begin_template>
    <top_part_of_template_with_repeated_stuff>
        <!--different stuff goes here-->
    <bottom_part_of_template_with_more_repeated_stuff>
<end_template>

我知道有各种不同的方法可以解决这个问题。我不喜欢这样做:

include 'top_part_of_template.html';
// output the different part
include 'bottom_part_of_template.html';

因为打开和关闭标签在单独的文档中困扰我。我目前正在做的是这样的模板:

<template>
    <?php if (isset($different_stuff)) echo $different_stuff ?>
<more_template>

使用输出缓冲得到不同的东西:

ob_start();
include 'different_stuff.php';
$different_stuff = ob_get_clean();

include 'template.php';

我遇到this answer,建议使用shell_exec。虽然我通常理解shell_exec的作用,但我并不熟悉使用它。我试过这样的话:

$different_stuff = shell_exec('php different_stuff.php');
include 'template.php';

它确实有效,我喜欢它只是因为它是一个陈述而不是三个。但这感觉好像是一个坏主意(主要是因为我觉得如果这是一个好主意我会更频繁地使用它,而这是我第一次看到它)但我对此并不熟悉shell_exec知道原因。

我认为这听起来有点像基于意见的问题,但我真的不是在寻找意见。我想知道不使用这种方法的客观,可证明的理由。

1 个答案:

答案 0 :(得分:2)

您正在以这种方式启动新的shell环境和PHP的新实例,而不是利用已运行代码的PHP实例。所以有性能和内存的影响。

许多服务器都有单独的php.ini文件,用于命令行PHP(shell_exec调用)和基于FPM的PHP(大多数现代Web服务器调用)。

并且,shell_exec不会传回任何错误信息,因此您将更难以发现问题并对其进行故障排除。