php - 双 URL 触发器创建 move_uploaded_file() 失败
问题描述
这引起了严重的头痛!
WordPress 帖子应该处理示例数据(作为 PDF 文件上传)并在下面的同一帖子中显示数据(经过一些操作和重新格式化)。
...
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="filepdf" />
<input type="submit" name="submit" value="Upload data samples (.pdf file)" />
</form>
...
那是PHP代码。
...
if(isset($_FILES['filepdf'])) {
$mTime = number_format(microtime(true), 3, '.', '');
$file_name = $_FILES['filepdf']['name'];
$file_size = $_FILES['filepdf']['size'];
$file_tmp = $_FILES['filepdf']['tmp_name'];
$file_ext = strtolower(end(explode('.', $_FILES['filepdf']['name'])));
...
$cmd = "./mybinary '$file_name'";
$outfile = tempnam("/tmp", "cmd");
$errfile = tempnam("/tmp", "cmd");
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("file", $outfile, "w"),
2 => array("file", $errfile, "w")
);
move_uploaded_file($file_tmp, '~/' . $file_name);
$proc = proc_open($cmd, $descriptorspec, $pipes);
...
数小时的故障排除,但我不明白为什么会发生这种情况......当我上传 PDF 文件时,mybinary
proc_open() 中的二进制文件会触发两次 - 有时(间隔 +/- 200 毫秒)。假设所有请求中有 95% 可以正常工作(只有一个请求),但由于这些双重触发,有 5% 会失败。似乎(?!)使用 Chrome 的移动 Android 设备比其他操作系统和/或浏览器受到的影响更大(尽管对此完全不确定)。这至少是 Apache 的 access.log 所建议的。我的 Windows 7 x64 机器上的 Chrome 不会生成这些双重触发器。目前的情况是不可接受的,因为二进制文件使用 PHP 代码生成的毫秒时间码(见上文),这会打乱整个过程。
问题:
1. 我的假设是否正确,Android/Chrome 发送两个请求?
2. 如果是,为什么?
3. 我可以避免吗?
4. 如果是,怎么做?
我对此进行了谷歌搜索,实际上,似乎proc_open()
有时会触发两次,但我没有找到任何解决方案。
故事还在继续。如果发生双重触发,我注意到上传的文件没有被move_uploaded_file()
函数移动。我仍在进行故障排除,但我强烈认为没有文件可以从/tmp
. 因此,我收到一个错误,proc_open()
因为它依赖于上传的文件。我看不到浏览器(Android/Chrome)向服务器发送的内容,因此不存在临时文件!
问题:
5. 哪些情况下会move_uploaded_file()
报假?
- - - 解决方案 - - -
为了完成这个......我最初使用PHP code snippets (Insert PHP)
插件(版本 2.0.6 - 最新)。php 页面实际上只调用了一次,但执行了两次。我对上述所有这些都没有任何解释(相同的临时文件名,但代码调用了两次,...)。
在我将 PHP 代码 WordPress 集成方法更改为 Shortcode 概念后,一切正常(直到现在)。所以我相信这个提到的插件是双触发的原因?!
并且没有双击 - 我从一开始就已经检查过了。因此,PHP 代码本身可能不是罪魁祸首。
解决方案
推荐阅读
- python - 在逻辑回归上制作 Precision_Recall 图
- python - 如何为数据框中的多列剪辑熊猫
- reactjs - React:状态更新后组件未重新渲染
- r - 在 Rstudio 中更改源代码,但代码是用 C 编写的
- python - 如何使用python将图像插入特定的excel文件单元格?
- python - Tensorflow,GPU 比 CPU 快多少?(余弦相似度计算)
- java - 在 dp android 中设置文本大小后,文本在我的自定义视图中的不同屏幕上被拉伸
- javascript - Javascript 对象数组的控制台输出差异
- wxmaxima - Wxmaxima 中的线不够高,无法显示指数的指数 [已解决]
- sql-server - SQL Server 2016,游标