在长脚本中死亡或退出是不错的做法(PHP)

时间:2018-06-11 15:14:36

标签: php exit die

我看过不同的答案,除了这个讨论die while testing and generating errors的答案之外,我想知道die()是否会对我的代码产生负面影响,因为它无法继续执行。

例如,如果我有一个包含许多条件的长脚本,在给定的点,一旦我寻找的条件成功,我不需要我的脚本继续测试其他条件。

$a = 'a';

if($a == 'a'){
 //long script
 die();
}

if($b == 'a'){
 //long script
 die();
}

if($c == 'a'){
 //long script
 die();
}

这是一个简单而且可能很愚蠢的例子,还有其他更优雅的解决方案,但它有助于解释我的问题;如果我die()在第一个条件下,它将停止执行其余的代码,理论上,这应该优化性能,或者可能不是......

让脚本结束或die()实际上会加快进程是否更好?如果die()有负面影响,当然,还有其他方法,比如创建标记让脚本跳过某些代码块,我只想知道die()的负面影响(如果有的话)。

例如: - 在内存方面,die()将继续使用内存,或者它可以释放更多内存。 - 在时间/执行方面,die()将加速进程,因为它不会尝试执行脚本的其余部分,或者根本没有任何区别。想象一下,在代码中可能存在可以避免的繁重过程。

我想清楚这一点,我知道必须有许多其他方法来提高效率,缩短脚本,开关,标志等。我只想了解使用{{1}是否有任何负面影响}。

由于

1 个答案:

答案 0 :(得分:0)

die / exit的使用是代码设计不佳的标志,最终会导致错误的代码。从这个意义上说,它会产生负面影响。退出运行时,它会在调用shutdown函数后终止脚本执行(如果是shutdown 回调函数已注册)。如果使用0(零)来成功终止脚本执行,则die / exit产生正输出的唯一时间。所有其他出现都指向错误。因此,无需使用退出。

坦率地说,我应该补充一点,如果答案是使用exit / die,那么问题是错误的,或者脚本写得不好。在您的示例中,如果脚本需要根据值运行,则代码应为:

abstract class AbstractProcess {
  abstract public function run();
}

class A extends AbstractProcess {
  public function run() { echo 'A'; }
}

class B extends AbstractProcess {
  public function run() { echo 'B'; }
}

class C extends AbstractProcess {
  public function run() { echo 'C'; }
}

class ProcessException extends \Exception { }

class Processor
{
  private $handlers = [];

  public function addProcess($key, AbstractProcess $process) 
  {
    $this->handlers[$key] = $process;
  }

  public function run($val)
  {
    if ( !isset($this->handlers[$val]) )
    {
      throw new ProcessException('Cannot process value: ' .  $val);
    }
    return $this->handlers[$val]->run();
  }
}

这可能更复杂。这不是重点。归结为具有良好的异常处理策略。您可以在线找到有关例外以及如何实现异常处理的大量资源。大多数现代框架都内置了 - 您只需要引入异常处理逻辑。我们在try / catch块中运行上面的代码并处理异常:

try {

  $processor = new Processor();

  $processor->addProcess('a', new A());

  $processor->addProcess('b', new B());

  $processor->addProcess('c', new C());

  $processor->run('5');

} catch ( \Exception $e) {

  if ( $e instanceof ErrorException ) {
    // handle error exception
  }
  if ( $e instanceof ProcessException ) {
    echo $e->getMessage();
  }
  // ..
}

现在,如果我们退出而不是处理Exception,那么我们将引入一个很难找到的bug。我们可能甚至不知道这样一个退出'退出'如果脚本在后台运行。