为什么我不应该使用 shell_exec 而不是输出缓冲到 'include' 一个文件到一个变量中?

Why shouldn't I use shell_exec rather than output buffering to 'include' a file into a variable?

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

<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, which suggests using shell_exec。虽然我大体上理解 shell_exec 的作用,但我并不真正熟悉它的使用。我这样试过:

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

它确实有效,我喜欢它只是因为它是一个声明而不是三个。不过,这感觉像是一个坏主意(主要是因为我认为如果这是一个好主意,我会看到它被更频繁地使用,这是我第一次看到它)但我对 shell_exec 想知道为什么。

我认为这听起来像是一个基于意见的问题,但我真的不是在征求意见。我想知道 objective,不使用这种方法的明显原因。

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

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

而且,shell_exec 不会传回任何错误信息,因此您将很难检测到问题并进行故障排除。