【问题标题】:Is it possible to ignore exit of child script from parent script in PHP?是否可以忽略 PHP 中父脚本退出子脚本?
【发布时间】:2014-09-08 20:51:09
【问题描述】:

子脚本终止父脚本,因为它有 exit;

由于它是第三方扩展,我需要避免任何核心黑客攻击。是否有可能以某种方式忽略父脚本中子脚本的退出。我正在从外部脚本调用它的控制器和方法。

parent.php

<?php

require "child.php";

?>

child.php

<?php
does something;
exit;
?>

更新

只要我们不修改子脚本,任何替代解决方案都可以。

【问题讨论】:

  • 使用退出的第三方脚本设计不佳。
  • 那不是子脚本,是同一个脚本。 includerequire 本质上都是“把这个文件的内容放在这里”的简写。只需从 child.php 中删除 exit 即可正常继续执行。
  • 他们开发了用于 ajax 接口和 json 输出的脚本。你还觉得在json输出结尾使用exit是个糟糕的设计吗?

标签: php


【解决方案1】:

是否可以在 PHP 的 included 脚本中忽略 exit

没有。

exit 终止脚本的执行,无论从哪里调用它。

sjagr's answer 中所述,除了使用exit,还有其他选择。

【讨论】:

  • 这可能是另一种选择。但就问题而言,答案仍然是
  • 我认为我的回答正确地解决了问题,请告诉我this solution 有什么问题。
  • +1 这是对 OP 定义的范围和他们提出的问题的确切正确答案。 @PrestonS 线程可以工作,但 exit 在那种情况下仍然没有被忽略,它只是被显式处理。
  • @sjagr 它在某种意义上被忽略,因为子线程退出允许主线程在子线程终止后继续运行。
  • 抱歉,我的问题不清楚。通过说“以某种方式忽略退出”,我的意思是任何替代解决方案对我来说都是一个答案,可以从父脚本完成而无需编辑子脚本。
【解决方案2】:

如果您确实最终编辑了核心文件,那么可以在“子脚本”中使用return。来自the PHP docs

如果从全局范围调用,则执行当前脚本 文件结束。如果包含或需要当前脚本文件, 然后将控制权传递回调用文件。此外,如果 包含当前脚本文件,则返回的值将 作为包含调用的值返回。如果从调用返回 在主脚本文件中,然后脚本执行结束。如果 当前脚本文件由 auto_prepend_file 命名或 auto_append_file php.ini 中的配置选项,然后是那个脚本 文件的执行结束。

但是,如果父脚本有exit 语句,则无法阻止父脚本阻止子脚本杀死进程。很遗憾,您无法覆盖此功能。

【讨论】:

  • 不幸的是,我已经意识到我的答案不符合 OP 的问题范围和要求,但是我留下了我的答案,因为它可以通过对范围进行一些修改来解决问题,并且可能对未来的其他人
【解决方案3】:

您也许可以在一个线程中运行 child.php。使用 join 等到该线程完成后再继续主线程。这样在child.php中调用exit会终止子线程,主线程继续运行。

class myThread extends Thread {
  public function run(){
    include "child.php";
    //Call methods from child.php here
  }
}

$thread = new myThread();
$thread->start();
$thread->join();

【讨论】:

  • 我也应该试试这个。
【解决方案4】:

非常感谢大家回答这个问题。最后我想出了以下替代想法。我不确定它是否类似于任何设计模式。尽管 child.php 已退出,但以下示例不会从循环中终止。

parent.php

<?php
require "temp.php";

for($i=1;$i<10;$i++){
    file_get_contents("http://url/temp.php?var=$i");
}

?>

temp.php

<?php
$var = $_GET['var'];
// execute 
require "child.php";
$testController = new TestController();
$testController->method($var);
?>

【讨论】:

    【解决方案5】:

    是的。 在您的 child.php 中,您可以使用 return 将控件返回给 parent.php。 否则如果不包含child.php,它将继续其正常操作,即退出。

    <?php
    does something;
    return;
    exit;
    ?>
    

    如果您想检查文件是否被包含或直接运行,您可以this answer。 因此,在这种情况下,请检查子文件,如果不包含,则转到退出命令,否则继续执行其余代码。

    【讨论】:

    • 我需要避免任何核心黑客攻击
    • @putvande 在我的帖子底部添加了指向另一个答案的链接,这可能对您有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多