双重网址触发器会导致move_uploaded_file()失败

时间:2018-10-23 20:19:01

标签: php proc-open

这引起了严重的头痛!

一个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文件时,proc_open()中的二进制mybinary会触发两次-有时(间隔+/- 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代码本身并不是罪魁祸首。

0 个答案:

没有答案