Конфликты записи в файл: file_get_contents () & fputs () - PullRequest
1 голос
/ 03 апреля 2012

Я в растерянности, у меня есть 2 сценария, 1 который извлекает вложения электронной почты из почтового ящика, и второй, который затем анализирует вложения и добавляет их в базу данных.

В большинстве случаев это работает нормально, но порой выдает несколько проблем. Иногда вложение электронной почты создается, но не заполняется (пустой файл, кроме имени), а иногда оно просто не создается (загружается) вообще.

Первый скрипт открывает новый файл и записывает в него, второй скрипт затем обращается к содержимому этого файла. Могут ли эти проблемы быть вызваны тем, что файл все еще открыт, когда второй скрипт пытается получить к нему доступ?

Они бегут каждые 15 секунд.

1-й сценарий (он довольно большой, поэтому я попытался показать только части, о которых идет речь)

            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);
    }

2-й сценарий выполняет много разборов, беря имена файлов, добавленные в БД в 1-м сценарии, а затем вставляя их в следующее.

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

        $tickets = simplexml_load_string($addXML);

1 Ответ

0 голосов
/ 04 апреля 2012

Для тех, кто может столкнуться с чем-то похожим, я выяснил, почему некоторые файлы выглядят пустыми.

Пустые файлы, которые были созданы и получены из писем с несколькими вложениями. Он отлично работал с отдельными вложениями и первым вложением в нескольких письмах с вложениями.

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 () в цикле, поэтому электронное письмо было перемещено в другую папку, прежде чем любая другая итерация могла выполнить свою работу для других вложений электронной почты, отсюда и пустые файлы.

D'ой!

Что касается пропуска определенных писем, у меня была игра с

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

Оказалось, что это исчезло примерно через 4 итерации, что привело к пропуску некоторых писем. На данный момент я не уверен, почему, однако для моих целей мне это на самом деле не нужно, поэтому я удалил его.

Я знаю, что это была глупая ошибка с моей стороны в отношении imap_mail_move (), но я решил опубликовать это на тот случай, если в будущем это может кому-нибудь помочь.

...