等待copy()完成

时间:2011-07-27 20:54:34

标签: php for-loop copy

有没有办法在继续执行php循环之前检查文件是否被复制?

我有一个for循环,在循环中它将复制一个文件。现在,我希望它等到当前文件被复制后再继续循环。

示例:

for ($i = 1; $i <= 10; $i++)
{
$temp = $_FILES['tmp_name'];
$extension = '.jpg';

copy("$temp_$i_$extension", "$local_$i_$extension");

// not sure what to do here

if (FILE_DONE_COPYING())
{
    CONTINUE_LOOP();
}
else
{
    PAUSE_LOOP();
}
}

这只是一个例子。我不知道如何做到这一点......任何人都可以加入进来吗?

8 个答案:

答案 0 :(得分:13)

这就是copy()在PHP中的作用 - 它会一直阻塞,直到文件被复制。除了检查返回值以查看操作是否成功之外,您无需做任何事情。

答案 1 :(得分:2)

PHP一步一步地逐行采用它,所以它一直等到copy()完成

for ($i = 1; $i <= 10; $i++)
{
    $temp = $_FILES['tmp_name'];
    $extension = '.jpg';

    $result = copy("$temp_$i_$extension", "$local_$i_$extension");

    if($result){  
        //done
    }
    else{
        //failed
    }
}

答案 2 :(得分:1)

copy成功时返回true,失败时返回false。检查一下。

答案 3 :(得分:1)

除非您遇到使用线程并且异步复制的问题,否则PHP将不会在复制后移至该行,直到完成为止。

答案 4 :(得分:1)

copy在继续执行之前等待完成。这是一个同步的呼叫。但是,如果它不起作用,它可以返回false,并且由于$temp_$i_未定义变量,因此您的副本无效。所以也许你认为副本没有完成,当它实际上根本就不起作用时。

您应该使用:

copy("{$temp}_{$i}_$extension", "{$local}_{$i}_$extension");

OR

copy($temp.'_'.$i.'_'.$extension, $local.'_'.$i.'_'.$extension);

答案 5 :(得分:0)

是什么让你认为copy()会在完成之前返回?

您当然可以比较原始文件和副本的文件大小,以确保该过程完成。

答案 6 :(得分:0)

您可以使用带有sleep调用的while循环来延迟检查,并在文件以新名称存在后退出while循环。

答案 7 :(得分:0)

我知道这是一个古老的问题,但我觉得我真的需要谈谈这个问题。 COPY 是一个很棒的命令 - 但是 - 它并非一直都有效。我可以诚实地告诉你这一点。为什么?为什么它不总是有效?简单 - 操作系统有问题。这里有两个例子。一种是使用标准磁盘驱动器,另一种是使用 Ram 磁盘。 COPY 命令读取文件的 CHUNKS 并将这些块写出到目的地。这意味着它真的不只是执行 File_get_contents 而是执行 fopen(IN), fopen(OUT), while( !EOF(IN) ){ fread(IN), fwrite(OUT) } 然后 fclose(IN),和 fclose(out)。应该注意的是,这些命令试图确保一切正常,但如果磁盘驱动器缓冲它所做的事情 - 那么文件可能需要一两秒钟才能完成。这可以通过在输出文件的名称上使用 file_exists() 来看到。它可以返回为 FALSE(它不存在)。这是因为磁盘驱动器的硬件没有跟上命令。

我什至安装了 AMD RamDisk 软件并使用上述命令(file_get_contents->file_put_contents 和 fopen-fread/fwrite-fclose 命令)运行了一个程序。同样的事情也发生了。 file_exists() 函数时不时地(并非总是)返回 FALSE,因为测试在文件创建完成之前就到达了那里。不要问我为什么 - 它只会这样做。

那我有什么建议?使用 SLEEP() 命令。也许在 COPY() 命令之后使用三 (3) 秒(所以 SLEEP(3);)。我还确定了一个 CHMOD(, 0777);也是个好主意。在它之后使用 SLEEP() 命令,以便有时间应用更改。 (可能更接近一秒)。

现在,请记住 - 每个人的硬件都不同。因此,某些硬件可能比我使用的硬件更好或更快。所以 - 这是其中之一 - 如果您遇到问题,请尝试一下。或者不要 - 如果您没有问题。就是这么简单。所以 - 这发生在我身上 - 我正在使用它 - 它现在可以工作,系统可以呼吸三秒钟 - 但它可能对你没有任何作用 - 谁有一个原子动力的威利旺卡手机,可以在早餐前完成不可能的事情.

明白了吗?好的。 :-)