我有一个非常长的运行PHP CLI脚本,将需要几个小时来处理。在脚本运行时编辑它以开始下一个sprint工作是否安全,或者我是否需要单独保留工作目录并处理副本?
我问这个问题的唯一原因是因为我觉得它可能已经加载到内存中,所以我对磁盘上的脚本所做的任何编辑都不会影响当前正在运行的进程。基本上,我担心如果我开始编写脚本,它会破坏已经在运行的进程。
谢谢
正确的答案是:这取决于文件是如何加载的。
include
和require
语句在运行时处理。如果在循环中使用include
或require
语句,则每次执行include
或require
语句时都读取和解析包含的文件。
让我们假设文件main.php
包含如下内容:
<?php
include 'a.php';
include_once 'b.php';
while (true) {
include 'c.php';
include_once 'd.php';
}
你在控制台上输入php main.php
,它会持续运行几个小时。
让我们假设while ()
循环已经执行了至少一次。修改main.php
、a.php
、b.php
和d.php
是安全的。所有这些都由解释器加载到内存中并进行解析。它们的源文件不再被读取。
但是c.php
在每次迭代中都被反复读取和解析。
如果你修改了它,你的更改将在下一个循环中加载,并且它们可能会中断执行(因为大多数时间你都在处理它不编译的代码)
当c.php
包含在一个被多次调用的函数中,或者当它包含在另一个被反复包含的文件中,等等,也会发生同样的情况。
如果include
被require
取代,include_once
被require_once
取代,上面的整个讨论都适用(除了它们处理丢失文件的方式,include
和require
的工作方式相同)。
当脚本运行时,您可以修改文件,但它不会有任何影响。脚本在执行时加载一次。如果你想执行修改后的PHP文件,你需要重新加载/运行它。
脚本加载完成后,就可以安全编辑了。
但是如果你包含其他文件,那么这些文件将在运行时加载,并将影响整个程序的执行。
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