在PHP中是否可以忽略子脚本从父脚本退出?
子脚本终止父脚本,因为它有退出强> 因为它是第三方扩展,所以我需要避免任何核心攻击。是否可能以某种方式忽略子脚本从父脚本退出。我从外部脚本调用它的控制器和方法 parent.php在PHP中是否可以忽略子脚本从父脚本退出?,php,Php,子脚本终止父脚本,因为它有退出 因为它是第三方扩展,所以我需要避免任何核心攻击。是否可能以某种方式忽略子脚本从父脚本退出。我从外部脚本调用它的控制器和方法 parent.php <?php require "child.php"; ?> <?php does something; exit; ?> <?php require "temp.php"; for($i=1;$i<10;$i++){ file_get_contents("http:/
<?php
require "child.php";
?>
<?php
does something;
exit;
?>
<?php
require "temp.php";
for($i=1;$i<10;$i++){
file_get_contents("http://url/temp.php?var=$i");
}
?>
<?php
$var = $_GET['var'];
// execute
require "child.php";
$testController = new TestController();
$testController->method($var);
?>
child.php
<?php
require "child.php";
?>
<?php
does something;
exit;
?>
<?php
require "temp.php";
for($i=1;$i<10;$i++){
file_get_contents("http://url/temp.php?var=$i");
}
?>
<?php
$var = $_GET['var'];
// execute
require "child.php";
$testController = new TestController();
$testController->method($var);
?>
更新
只要我们不修改子脚本,任何替代解决方案都是可以的。如果您确实最终编辑了核心文件,则可以在“子脚本”中使用
return
如果从全局范围调用,则执行当前脚本
文件结束。如果包含或需要当前脚本文件,
然后控制权被传递回调用文件。此外,如果
包含当前脚本文件,则返回的值将
将作为include调用的值返回。如果从调用return
在主脚本文件中,然后脚本执行结束。如果
当前脚本文件由auto\u prepend\u文件命名
或
auto\u append\u file
php.ini中的配置选项,然后是该脚本
文件的执行已结束
但是,如果子脚本具有exit
语句,则无法阻止父脚本阻止子脚本终止进程。不幸的是,您无法覆盖此功能
是否可以忽略PHP中包含的脚本中的exit
没有
终止脚本的执行,无论从何处调用脚本
如中所述,除了使用退出
是之外,还有其他选择。
在child.php中,可以使用return将控件返回到parent.php。
否则,如果未包含child.php,它将继续正常操作,即退出
<?php
does something;
return;
exit;
?>
如果要检查文件是否包含或是否直接运行,可以。
因此,在这种情况下,检查子文件,如果它没有包含,转到exit命令,否则继续执行其余代码。您可能可以在线程中运行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();
非常感谢大家回答这个问题。最后,我提出了以下替代方案。我不确定它是否与任何设计模式相似。下面的示例不会从循环终止,尽管child.php已退出 parent.php
<?php
require "child.php";
?>
<?php
does something;
exit;
?>
<?php
require "temp.php";
for($i=1;$i<10;$i++){
file_get_contents("http://url/temp.php?var=$i");
}
?>
<?php
$var = $_GET['var'];
// execute
require "child.php";
$testController = new TestController();
$testController->method($var);
?>
temp.php
<?php
require "child.php";
?>
<?php
does something;
exit;
?>
<?php
require "temp.php";
for($i=1;$i<10;$i++){
file_get_contents("http://url/temp.php?var=$i");
}
?>
<?php
$var = $_GET['var'];
// execute
require "child.php";
$testController = new TestController();
$testController->method($var);
?>
使用exit的第三方脚本设计糟糕。这不是子脚本,而是同一个脚本。include
和require
本质上都是“将此文件的内容放在此处”的缩写。只需从child.php中删除退出
,执行就会正常进行。他们为ajax接口和json输出开发了脚本。你仍然认为在json输出的最后使用exit是一个糟糕的设计吗?不幸的是,我意识到我的答案不符合OP的问题范围和要求,不过,我的答案留待决定,因为它可以通过对范围的一些修改来解决问题,并且可能对将来的其他人有用。我需要避免任何核心问题hack@putvande在我的帖子底部添加了另一个答案的链接,这可能对你有用。这可能是另一种选择。但就目前的问题而言,答案仍然是否定的。我认为我的答案正确地解决了问题,请告诉我问题出在哪里。+1这是OP定义的范围和他们提出的问题的确切正确答案@预设一个线程可以工作,但是在该场景中,exit
仍然没有被忽略,它只是被显式地处理。@sjagr它在某种意义上被忽略,因为子线程退出后允许主线程在子线程终止后继续运行。对不起,我的问题不清楚。通过说“忽略退出”,我的意思是,任何替代解决方案对我来说都是一个答案,可以从父脚本完成,而无需编辑子脚本。我也应该尝试一下。