首页 > 解决方案 > 双 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 文件时,mybinaryproc_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 代码本身可能不是罪魁祸首。

标签: phpproc-open

解决方案


推荐阅读