Двойной URL-триггер создает ошибки move_uploaded_file () - PullRequest
0 голосов
/ 23 октября 2018

Это вызвало сильные головные боли!

Предполагается, что пост 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, двоичный файл mybinary в proc_open() срабатывает дважды - иногда (с интервалом +/- 200 мс).Скажем, 95% всех запросов работают нормально (только один запрос), но 5% терпят неудачу из-за этих двойных триггеров.Кажется (?!), Что мобильные Android-устройства, использующие Chrome, более подвержены влиянию, чем другие операционные системы и / или браузеры (хотя и не уверены в этом).Это по крайней мере то, что предлагает Apache access.log.Chrome на моем компьютере с Windows 7 x64 не генерирует эти двойные триггеры.Нынешняя ситуация неприемлема, поскольку двоичный файл использует миллисекундный временной код, сгенерированный кодом 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 не был виновником.

...