【问题标题】:What's wrong with PHP operations order?PHP操作顺序有什么问题?
【发布时间】:2010-12-10 08:11:48
【问题描述】:

我有一个删除(取消链接)文件的主脚本。然后,在稍后包含在该主脚本中的某些脚本中,我写入该文件(写入与已删除的文件同名的文件,因为它现在应该已经消失了)。

发生的事情是,在主脚本运行后,文件被删除。正如在写入文件后发生的取消链接操作一样。当我在主脚本中截断文件(通过用空字符串覆盖它)然后写入该文件时,也会发生同样的想法。结果是文件为空(好像在写入后截断文件,但代码中的字面顺序颠倒了)。

这里有什么问题?或者如果不是,为什么会这样?

编辑:

首先(在主脚本中):

 unlink($config['directory'].'logs/info.txt');

然后(在某些包含脚本中):

 $f = fopen($config['directory'].'logs/info.txt', "w");
 fwrite($f, "Text"); 
 fclose($f);

我认为可能有一些常见的错误,你可以指出(比如不调用 fclose 或其他东西)。所以可能我必须更仔细地调查一下(但我确信没有对这个文件进行其他操作,因为我使用了文件的一些唯一名称,同样的事情也会发生)。

【问题讨论】:

标签: php windows-xp


【解决方案1】:

从 fopen - 模式参数中删除 .txt

$f = fopen($config['directory'].'logs/info.txt', "w");

http://php.net/manual/en/function.fopen.php

【讨论】:

  • 如果将unlink的代码行和写的代码行切换,是否可以正常工作(文件要删除)?
  • 在这两种情况下,文件都在脚本运行后被删除。这就是问题所在。
  • 这就像取消链接被推迟并在最后运行。
  • 你确定不是写权限问题?删除取消链接并尝试
  • 在我删除取消链接的地方,文本被写入文件右侧,但我想在开头截断它。
【解决方案2】:

你以后如何写入文件? file_put_contents() 是一种方法(我几乎不再使用其他任何方法),但如果您使用 fopen/fwrite 并忘记了可能导致此类问题的 fclose。

【讨论】:

    【解决方案3】:

    如果没有实际看到代码,不可能给出明确的答案,但一种可能是后台发生了来自客户端的资源请求,导致主请求完成后文件被删除。

    尝试在删除文件的脚本部分使用堆栈跟踪来识别它是如何再次被调用的;见debug_backtracedebug_print_backtrace

    【讨论】:

      【解决方案4】:

      只是一个想法,但是您是否尝试过刷新输出?可以使用fflush($f);强制php将所有缓冲数据写入文件。

      当然,您实际上并不需要它——事实上,使用 'w' 标志打开它会截断文件。你确定它被正确打开了吗?也许尝试这样的事情:

      $f = fopen($config['directory'].'logs/info.txt', "w");
      if($f === false)die('File opening failed!');
      fwrite($f, "Text"); 
      fflush($f);
      fclose($f);
      

      【讨论】:

      • 当我这样做时,结果就像我上面描述的那样,文件最终被截断(空),即使我在 fopen 之后添加了额外的 fflush($f) 和 fclose($f)。很奇怪。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      相关资源
      最近更新 更多