将更改保存到正在运行的PHP脚本是否安全?

时间:2016-10-27 20:19:17

标签: php

我有一个运行时间很长的PHP CLI脚本需要花费数小时才能完成。在脚本运行时编辑该脚本以开始处理下一个sprint是否安全,或者我是否需要单独保留工作目录并处理副本?

我问这个问题的唯一原因是因为我觉得它可能已经被加载到内存中了,所以我对磁盘上的脚本所做的任何编辑都不会影响当前正在运行的进程。基本上我担心,如果我开始编写脚本,它将打破已经运行的过程。

由于

3 个答案:

答案 0 :(得分:1)

正确的答案是:它取决于文件的加载方式。

在运行时期间处理includerequire语句。如果在循环中使用includerequire语句,则每次执行includerequire语句时都会读取并解析所包含的文件。

假设文件main.php包含以下内容:

<?php

include 'a.php';
include_once 'b.php';

while (true) {
    include 'c.php';
    include_once 'd.php';
}

您在控制台中键入php main.php并继续运行数小时。

假设while ()循环已经执行了至少一次。 修改main.phpa.phpb.phpd.php是安全的。所有这些都由解释器在内存中加载并进行解析。他们的源文件不会再次读取。

但是每次迭代都会一次又一次地读取和解析c.php

如果你修改它,你的更改将在下一个循环中加载,它们可以中断执行(因为大多数时候你正在处理它不编译的代码。)

c.php包含在多次调用的函数中或者包含在一次又一次包含的另一个文件中时,会发生同样的情况。

如果includerequire替换为include_oncerequire_once替换include,则上述整个讨论都适用(除了处理丢失文件的方式require和{{1}}以同样的方式工作。)

答案 1 :(得分:0)

在脚本运行时,您可以修改文件,但不会产生任何影响。脚本在执行时加载一次。如果要执行更改的PHP文件,则需要重新加载/运行它。

答案 2 :(得分:0)

加载脚本后,是的,编辑是安全的。

但如果你包含其他文件,那么这些文件会在运行时加载,并会影响你的整个程序执行。

main.php

$i = 10;

while(--$i){
    echo $i.PHP_EOL;
    sleep(1);
    include 'inc.php';
}

inc.php

echo "included\n";

运行脚本,然后编辑inc.php

echo "asdf\n";

将导致这样的输出:

9
included
8
included
7
included
6
asdf
5
asdf
4
asdf
3
asdf
2
asdf
1
asdf