这引起了严重的头痛!
一个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代码本身并不是罪魁祸首。