【发布时间】:2019-04-16 09:38:59
【问题描述】:
我有一个由我的应用程序动态创建的 PHP 脚本,(只是 Apache 的 www 文件夹中的一个 fwrite。注意:当这发生时 Apache 正在运行)。
应用程序然后使用 curl 对脚本执行 ping 操作,脚本抛出错误并死掉(如预期的那样。注意:我可以通过浏览器点击它来确认脚本正在干净地完成,它会以合理的方式返回响应时间)。
在此安装过程中,由于未知原因,Apache 为该特定文件创建了一个文件句柄。这个句柄只有在 Apache 关闭时才会被释放。
我的问题是,如果我现在尝试删除该文件,它会被锁定并且它的权限似乎已损坏(Windows 说拒绝访问它上的任何命令,我什至没有权限的读取权限,所以我没有想想权限变得多么混乱)。
当 Apache 关闭时,它显然会释放此锁,并且由于我的应用程序尝试删除文件但失败了,因此文件会立即从先前失败的删除中删除,现在锁已释放。
我还安装了 cygwin,它有时会导致文件出现奇怪的问题,但这次似乎不是罪魁祸首。
关于什么可能导致这种行为的任何想法?以相同方式生成和使用的其他类似脚本绝对可以正常工作。
保存相关代码
FILE *fp = fopen(szFile, "wb");
if (fp==NULL)
return false;
size_t nWritten = fwrite(strBuffer.data(), 1, strBuffer.size(), fp);
fclose(fp);
return (nWritten==strBuffer.size());
正确运行并返回 true,创建时的文件与原始文件相同并且可访问。文件锁定在 Apache 第一次加载文件时发生。方法无关紧要(通过程序中的 curl、wget、浏览器和 libcurl 获得相同的响应和文件句柄)。
注意:这只发生在 Windows 上,在 Linux 上,程序仍然从 Windows 运行,但使用 SFTP 执行它的所有文件活动
【问题讨论】:
-
The script throws an error and dies- 在脚本终止之前你有一个fclose? -
@DarkBee 当然可以。无论如何,这将导致我的应用程序处理。根据资源监视器,句柄由 httpd.exe 持有。
-
分享你的代码好吗?我们应该如何帮助您。
-
@emix 相关部分已分享。
-
如果你需要关闭或删除你的问题,而你不能(有投票的答案或有开放的赏金等),你可以标记它以引起版主的注意,他们会看看.请注意,不能保证他们会按要求为您删除。
标签: php c++ windows apache handle