Wordpress proc_open()触发了两次

proc_open() fires twice


问题

一个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 code snippets (Insert PHP) 插件来包含PHP代码。

...
[insert_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);
...
[/insert_php]

排查了几个小时,但我没有找到为什么会发生这种情况......当我上传一个PDF文件时,proc_open()中的二进制 mybinary 发射两次--有时(间隔为+/-200毫秒)。假设95%的请求工作正常,但5%的请求由于这些双重触发而失败。似乎(?!)使用Chrome浏览器的移动安卓设备比其他操作系统和/或浏览器受到的影响更大(不过完全不确定)。这至少是Apache的access.log所说的。目前的情况是不可接受的,因为二进制文件使用了由PHP代码产生的毫秒级时间码(见上文),这就把整个过程搞乱了。

问题:
1. 我的假设是否正确,Chrome浏览器会发送两个请求?
2. 如果是的话,为什么?
3. 我怎样才能避免这种情况?

我在网上搜索了一下,的确,似乎proc_open()有时会触发两次,但我没有找到任何解决办法。

另外,我不知道这是否与WordPress有关,或者是一个PHP主题。

这将会执行多少次内容解析,但请记住,你所使用的 [insert_php] 短码是非常危险的,它是你能对一个网站做的最危险的事情之一。相反,只需实现一个短码,并将PHP代码放在一个实际的PHP文件中。同样,我不能低估你正在做的事情有多危险,以及让你这样做的插件有多大的危险。
谢谢你的评论! 我试着摆脱 [insert_php] 。我完全没有意识到这种风险(WP新手在PHP编码方面)。从来没有写过自己的短码。我需要一个插件来编写/使用我自己的短码吗?这是一个好的网站来开始吗? 链接 . 如果不是,请给我一个起点。谢谢!
不,你可以创建一个插件来做短码,但插件只是一个PHP文件,在插件文件夹的顶部有一个注释。一个短码应该不是很难写,特别是如果你已经写好了PHP代码的话
@TomJNowell - 我不太明白这个PHP插件有什么危险,但由于代码不能正常工作,我就试了一下Shortcode的概念。见下文 ...
问题是,任何能够使用短码或写到数据库的人都可以执行PHP,不需要文件系统访问。结合其他的短码功能,有人可以偷偷地加入一个 insert_php 短码并在服务器上执行任何东西
答案1

为了完成这个... 我最初使用了PHP代码片段(Insert PHP)插件(2.0.6版-最新)。事实上,php页面只被调用了一次,但执行了两次。我对上面描述的这一切没有任何解释(相同的临时文件名,但代码被调用两次,......)。

在我把PHP代码的WordPress集成方法改为Shortcode概念后,所有的工作都正常了(直到现在)。所以我相信,这个提到的插件是导致双重触发的原因?

也没有重复点击--我一开始就已经检查过了。所以可能PHP代码本身不是罪魁祸首。

相同问题还可以参考: proc_open() fires twice