文件写入冲突:File_get_contents()&;fputs()


File writing conflicts : file_get_contents() & fputs()

我有点不知所措,我有两个脚本,一个是从邮箱中提取电子邮件附件,另一个是解析附件并将其添加到数据库中。

这在大多数情况下都可以正常工作,但偶尔会出现一些问题。有时创建了电子邮件附件,但没有填充(除了名称之外的空白文件),有时根本没有创建(下载)。

第一个脚本打开一个新文件并写入其中,第二个脚本然后访问该文件的内容。这些问题可能是因为当第二个脚本试图访问该文件时,该文件仍处于打开状态吗?

他们每隔15秒交替跑一次。

第一个脚本(它相当大,所以我试图只显示有问题的部分)

            for ($jk = 1; $jk <= imap_num_msg($mbox); $jk++) {
                echo "~~~~~~~~~~~~~~BEGIN!~~~~~~~~~~~~~~~~~~'n";
                echo imap_num_msg($mbox);
                $structure = imap_fetchstructure($mbox,$jk);  echo "imap_fetchstructure()'n";  
                $parts = $structure->parts; echo "structure->parts'n";
                $fpos=2;

                for($i = 1; $i < count($parts); $i++) { echo "loop through parts of email'n";
                    $message["pid"][$i] = ($i);
                    $part = $parts[$i];
                    if($part->disposition == "ATTACHMENT") { echo "if ATTACHMENT exists then grab data from it'n";
                        $message["type"][$i] = $message["attachment"]["type"][$part->type] . "/" . strtolower($part->subtype);
                        $message["subtype"][$i] = strtolower($part->subtype);
                        $ext=$part->subtype;
                        $params = $part->dparameters;
                        $filename=$part->dparameters[0]->value;
                        $num = $this->append();
                        $newFilename = $this->addToDB($filename,$num);
                        echo $newFilename."- Added tp DB'n";
                        $mege="";
                        $data="";
                        $mege = imap_fetchbody($mbox,$jk,$fpos);  
                        $filename="$newFilename";
                        $fp=fopen($savedirpath.$filename,w); echo "Create file at specified location'n";
                        $data=$this->getdecodevalue($mege,$part->type);
                        fputs($fp,$data); echo "Write data to the file'n";
                        echo ">>>>>>>>>>>>> File ".$savedirpath.$newFilename." ~ now exists!'n";
                        fclose($fp);
                        $fpos+=1;
                        imap_mail_move($mbox,'1:1','Processed');
                        echo "****************************************************'n";
                        echo "* Matched - Download and move to Processed folder. *'n";
                        echo "****************************************************'n";
                        echo "'n'n'n";
                    }
                }
            }
        }else{
            imap_mail_move($mbox,'1:1','Other');
            echo "***************************************************'n";
            echo "******** No Match - Move to Other folder **********'n";
            echo "***************************************************'n";
        }
        imap_close($mbox);
    }

第二个脚本通过获取第一个脚本中添加到数据库中的文件名来进行一系列解析,然后将它们粘贴到下面的脚本中。

        $addXML = "<xml>".file_get_contents($filename)."</xml>";
        $tickets = simplexml_load_string($addXML);

对于任何可能遇到类似情况的人,我弄清楚了为什么某些文件显示为空白。

创建的空白文件来自具有多个电子邮件附件的电子邮件。它可以很好地处理单个附件和多个附件电子邮件中的第一个附件。

for($i = 1; $i < count($parts); $i++) { echo "loop through parts of email'n";
//some code
if($part->disposition == "ATTACHMENT") { echo "if ATTACHMENT exists then grab data from it'n";
//bunch of code that gets the attachment using the section number
imap_mail_move($mbox,'1:1','Processed');
echo "****************************************************'n";
echo "* Matched - Download and move to Processed folder. *'n";
echo "****************************************************'n";
echo "'n'n'n";
}

}

基本上,为了获得多个附件,这个部分循环,但我在循环中有imap_mail_move()函数,所以在任何其他迭代都可以为其他电子邮件附件做它的事情之前,电子邮件被移动到不同的文件夹,因此空文件

至于跳过某些电子邮件,我在和玩

for ($jk = 1; $jk <= imap_num_msg($mbox); $jk++) { }

事实证明,这在大约4次迭代后就失败了,导致一些电子邮件被跳过。在这一点上,我不确定为什么,然而为了我的目的,我实际上不需要这个循环,所以我已经删除了它

我知道这是我在imap_mail_move()方面犯的一个愚蠢的错误,但我决定发布这篇文章,以防将来对其他人有所帮助。