我有一个运行时间很长的PHP CLI脚本需要花费数小时才能完成。在脚本运行时编辑该脚本以开始处理下一个sprint是否安全,或者我是否需要单独保留工作目录并处理副本?
我问这个问题的唯一原因是因为我觉得它可能已经被加载到内存中了,所以我对磁盘上的脚本所做的任何编辑都不会影响当前正在运行的进程。基本上我担心,如果我开始编写脚本,它将打破已经运行的过程。
由于
答案 0 :(得分:1)
正确的答案是:它取决于文件的加载方式。
在运行时期间处理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
和{{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