复制和解压缩功能有效,直到被另一个功能调用?

时间:2019-04-27 15:29:37

标签: php

我有一个名为fileGet的函数,其作用很简单:

  1. 从给定的URL下载文件。
  2. 解压缩说的文件。
  3. 启动文件格式化功能。

这一切都很好,但是当我从另一个函数中调用时,它停止工作了吗?

当它从另一个函数运行时(过去运行得很好),我抛出了一个空的zip文件,没有解压缩的文件。

然后,当它尝试使用不存在的文件时,它将在程序后面抛出错误。

任何帮助将不胜感激。

编辑:目录结构如下:

MainFolder [php [ThisCode],json [zip和json文件]]

我希望这对您有帮助吗?

function fileGet(){
  $extURL = 'exampleURL';
  $path = "../json/AllSets.json.zip";
  copy($extURL, $path);
  $newZip = new ZipArchive();
  if ($newZip->open('../json/AllSets.json.zip') == TRUE) {
    $newZip->extractTo('../json/');
    $newZip->close();
  }
}

function fileArch(){
  $today = date("d-m-Y");
  if (file_exists('../json/archive/'.$today.'.zip') == FALSE){
    $zip = new ZipArchive();
    $zip->open('../json/archive/'.$today.'.zip', ZipArchive::CREATE);
    $zip->addFile('../json/AllSetsLess.json', 'AllSetsLess.json');
    $zip->close();
    unlink('../json/AllSets.json');
    unlink('../json/AllSets.json.zip');
    unlink('../json/AllSetsLess.json');
    fileGet();
  }
}

function fileCompare(){
  stream_context_set_default(
    array(
      'http' => array(
        'method' => 'HEAD'
      )
    )
  );
  $extURL = get_headers("exampleURL")[3];
  $extURL = (int)preg_replace("/[^0-9]/", '', $extURL);
  $intURL = filesize("../json/AllSets.json.zip");
  echo('external: '.$extURL.' internal: '.$intURL);
  if ($extURL !== $intURL) {
    echo('Launching Download');
    fileArch();
  }
}

fileCompare();

我希望在json文件夹中找到一个zip文件和json文件,但是只需获取一个文件大小为0的zip文件。

编辑:我尝试了几种不同的方法,包括从fileArch()删除if语句,并使用relativeabsolute链接进行操作,但是到目前为止,我完全陷入了困境如果fileGet()函数是单独调用的,则它可以正常工作,但是从其他函数之一调用它时,它根本无法工作。

Edit2:所以,如果我从fileArch()启动程序,那么它可以正常工作,我认为fileCompare()中可能还有打开的东西吗?我找不到任何仍处于打开状态的东西,并且变量都应该是局部的。我知道fileCompare()正在加载fileArch(),因为它可以删除文件,但是在fileCompare()fileGet()之间似乎看不到某种冲突。如果您有任何想法,请告诉我,因为PHP不是我的母语。

编辑3:我找到了冲突,但不知道为什么会发生冲突。所以问题是代码:

 stream_context_set_default(
    array(
      'http' => array(
        'method' => 'HEAD'
      )
    )
  );

fileCompare()函数中,我需要此代码以允许服务器根据我记得的内容检查另一台服务器的标头,因此谁能告诉我这是为什么导致冲突的?

1 个答案:

答案 0 :(得分:0)

stream_context_set_default(
    array(
      'http' => array(
        'method' => 'HEAD'
      )
    )
  );

那么这就是导致问题的代码,也许是因为get请求已变成head请求而干扰了复制请求? 我从PHP手册here中获取了代码,因此,如果其他任何人在复制请求方面遇到问题,请检查您是否完全更改了stream_context。我将阅读有关应如何使用stream_context的内容,并在我掌握更多内容后写在这里。