Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我不能从php脚本中删除该文件吗?_Php_Linux_Filesystems_Delete File - Fatal编程技术网

为什么可以';我不能从php脚本中删除该文件吗?

为什么可以';我不能从php脚本中删除该文件吗?,php,linux,filesystems,delete-file,Php,Linux,Filesystems,Delete File,基本上,我是代理一个文件使用php脚本,然后删除它后直接。。。只是,文件没有被删除,我不知道为什么 这有点断章取义,所以,如果你需要的话,很乐意解释更多 exec("wget http://xxxx/123_" .$matches[1] . " --no-check-certificate -P /usr/share/nginx/www/" ); $file = "/usr/share/nginx/www/123_" . $matches[1]; if (file_exists($file)

基本上,我是代理一个文件使用php脚本,然后删除它后直接。。。只是,文件没有被删除,我不知道为什么

这有点断章取义,所以,如果你需要的话,很乐意解释更多

exec("wget http://xxxx/123_" .$matches[1] . " --no-check-certificate -P /usr/share/nginx/www/" );

$file = "/usr/share/nginx/www/123_" . $matches[1];

if (file_exists($file)) {
    header('Content-Type: text/plain');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exec("rm /usr/share/nginx/www/123_" . $matches[1] );

    exit;
}

请尝试以下代码,该代码不会创建需要删除的本地文件:

// Define URL
$url = "http://xxxx/123_{$matches[1]}";

// Open pointer to remote resource
if (!$remoteFP = @fopen($url, 'r')) {
  header("{$_SERVER['SERVER_PROTOCOL']} 500 Internal Server Error");
  exit;
}

// Get content length and type from remote server's headers
$length = $type = NULL;
foreach ($http_response_header as $header) { // Loop headers (see http://php.net/manual/en/reserved.variables.httpresponseheader.php)
  list($name, $val) = explode(':', $header, 2); // Split to key/value
  switch (strtolower(trim($name))) { // See if it's a value we want
    case 'content-length':
      $length = (int) trim($val);
      break;
    case 'content-type':
      $type = trim($val);
      break;
  }
  if ($length !== NULL && $type !== NULL) break; // if we have found both we can stop looping
}

// Send headers
if ($type === NULL) $type = 'text/plain';
header("Content-Type: $type");
if ($length) header("Content-Length: $length"); // Only send content-length if the server sent one. You may want to do the same for content-type.

// Open a file pointer for the output buffer
$localFP = fopen('php://output', 'w');

// Send the data to the remote party
stream_copy_to_stream($remoteFP, $localFP);

// Close streams and exit
fclose($remoteFP);
fclose($localFP);
exit;
这在cURL等上使用了
fopen()
方法,因为它允许直接将实体转发到输出缓冲区,并允许在完全接收主体之前访问远程服务器的响应头。使用PHP代理是资源效率最高的方法


如果您的服务器禁用了
allow\u url\u fopen
,您可能可以使用cURL,它还允许您将数据直接传递到输出缓冲区,但不允许您解析和转发来自远程服务器的头。

您尝试过
unlink($file)如果仍然不能,请尝试验证文件的所有权、uid php为您使用的内容以及文件权限。@Hakre-正在撤消更改。。。如果有一个简单的错误,请写在评论中或作为一个答案,但是,这不是我的脚本,所以,有人可能会得到错误的想法或根据那行e.t.c.@Prix-以前从未听说过取消链接,所以,没有。。。现在读起来。。。(仅供参考,这是我的第一个PHP脚本…当然不是专业版)。我建议您远离系统命令,除非您在使用的语言中确实没有选择。关于这个问题,你在我的回答中勾选后面的了吗?文件所有权等,文件是否被下载?您可以使用shell上的
ls-la
查看文件所有权。请尝试注释删除该文件所需的行,以确保该文件已被下载。@Prix-我知道这不是最佳做法,但是,此服务器仅用于此脚本,除删除外,一切正常。。。我认为这不是权限问题,因为从脚本运行的rm与创建它的wget具有相同的权限。。。无论如何,我正在尝试使用unlink now和test。我在这里给了你+1,我当然从中学习了很多,但是,我写的脚本已经投入生产,如果可以的话,我宁愿修复它。。。不删除文件是我错过的一个错误。如果我不能很快修复它(现在只是尝试unlink方法),我肯定会尝试你的版本。@Wil如果你只是将上面的代码放在你问题中显示的代码的位置上,那么上面的代码应该是现成的。唯一需要修改的是第一行,以确保
$url
正确无误。此版本也将比
wget
方法快得多,资源效率更高,因为它从不将数据写入磁盘,并开始立即将数据发送到客户端,而不是在将整个文件发送到客户端之前将其传输到服务器。很抱歉,听起来很愚蠢,但是,如果由多人同时运行,此脚本是否完全安全。。。我不是专家,也不是什么都懂,但是看到
php://
位让我想知道如果在第一个下载完成之前有人访问会发生什么。。。很抱歉,如果这是愚蠢的,我只是想确定一下。每个并发请求都有自己的PHP实例,它独立于其他实例运行。上面的代码应该没有并发问题——只要远程服务器没有任何并发问题(这超出了脚本的控制范围)。唯一可能出现问题的情况是,您正在使用会话,并且一个用户试图通过两个并发请求访问脚本。即使这样,也有一个简单的解决方案,即在上述代码之前调用
session\u write\u close()
。但这只有在使用会话时才重要。