首页 > 解决方案 > 以下PHP脚本的执行流程是什么?

问题描述

这是两个文件:

this_one.php

    <?php 

    include_once("other_one.php");

    $n1 = $_POST['name'];
    $n2 = $_POST['password'];

    echo "From this_one.php ".$n1." ".$n2."<br>";
    ?>

<form action="" method="POST">
    <input type="text" name="name">
    <input type="password" name="password">
    <button type="submit" name="Submit">Login</button>
</form>

other_one.php

<?php 
$name = $_POST['name'];
$pass = $_POST['password'];

echo "From other_one.php".$name." ".$pass."<br>";
?>

现在,当我在某处阅读时,如果表单操作为空,则 POST 将发送到脚本本身。other_one.php 也包含在文件 this_one.php 中

但是当我在浏览器中运行时,输出是:

From other_one.php hello pass
From this_one.php hello pass

一切如何运作?为什么会收到此输出?

PS:不要向我解释如何include_once工作。我说的是,对于 10 个进程,脚本将从第 1 行一直运行到最后,如果我在包含的文件中打开与数据库的连接,这样我将创建相同的 $connection 实例 10 次,这将是一个开销。为所有这 10 个线程共享单个数据库实例的方法是什么?

标签: phphtmlforms

解决方案


include指令将指定文件中的代码带入范围。从心理上讲,您可以将 include 指令替换为该文件中的代码块,实际上并没有什么区别。知道这一点,您的代码实际上是:

    <?php 

    //include_once("other_one.php");
    $name = $_POST['name'];
    $pass = $_POST['password'];

    echo "From other_one.php".$name." ".$pass."<br>";

    $n1 = $_POST['name'];
    $n2 = $_POST['password'];

    echo "From this_one.php ".$n1." ".$n2."<br>";
    ?>

<form action="" method="POST">
    <input type="text" name="name">
    <input type="password" name="password">
    <button type="submit" name="Submit">Login</button>
</form>

编辑

有四个指令可以将代码带入当前进程/请求的范围。在我命名它们之前,请注意我说的是当前流程/请求。如果有 10 个人点击您的登录页面,您将有 10 个进程/请求。同样,如果 1 个人点击您的登录页面 10 次,您也将有 10 个进程/请求。这就是 PHP 的本质,除非您真正注意到性能问题,否则我不会担心这一点。

这四个指令是includeinclude_once和。以保证提供的文件只被带入进程一次的指令结尾。其他两个指令允许每个进程多次包含一个文件。和之间的区别很微妙,但如果找不到文件,基本上会生成一个可忽略的警告,而会抛出一个致命错误。requirerequire_once_onceincluderequireincluderequire

一般来说,我个人始终建议您使用require_once所有包含,除非您明确有理由多次引入代码。例如,如果您有一个分页器小部件需要位于表格的顶部和底部,则可以很好地使用多次包含同一个文件。我从来没有使用过,include或者include_once因为我无法想象包含问题对我来说是可以接受的情况。

另外,作为旁注,PHP 以一种可能令人惊讶的方式解析文件的路径。例如,如果您使用include 'file.php';它实际上并不意味着将文件包含在当前目录中。相反,管理员可以设置一个可选的“包含路径”(就我而言,可能是出于遗留原因),并使用该语法首先搜索包含路径。如果您没有包含路径,或者在该路径中找不到该文件,使用本地文件夹。出于这个原因,我建议始终包含使用“路径语义”的文件,这几乎可以归结为以句点或正斜杠或常量(例如__DIR__.


推荐阅读